Alle Git-Dateien aus einem Verzeichnis entfernen?

75

Ich habe einen Ordner unter Versionskontrolle. Ich möchte eine Kopie davon erstellen, um sie zu versenden, möchte aber nicht alle .git-Verzeichnisse und die Dateien darunter einschließen.

Gibt es eine Möglichkeit, alle Git-Dateien zu entfernen, anstatt sie alle manuell zu löschen?

user291701
quelle
Sie können dazu ein kleines Skript schreiben, das jedoch betriebssystemspezifisch wäre.
Matten

Antworten:

91

Der .git-Ordner wird nur im Stammverzeichnis des Repos gespeichert, nicht in allen Unterverzeichnissen wie Subversion. Sie sollten in der Lage sein, nur diesen einen Ordner zu löschen, es sei denn, Sie verwenden Submodule ... dann haben sie auch einen.

Chris Kooken
quelle
8
Ah grandios, dachte, es wurde unter allen Subdiren wie svn verteilt!
user291701
8
Warum würden Sie es löschen ? Verwenden Sie git archive; Es ist für diesen Zweck oder sogar nur für alles außer dem .git-Verzeichnis.
Cascabel
1
Möglicherweise möchten Sie auch Ihre .gitignoreDatei und dergleichen löschen . Ich denke, Sie könnten ein Skript schreiben, um dies zu tun, aber es könnte einfacher sein, nur git-archive zu verwenden und sie dann manuell aus der archivierten Version zu löschen.
MatrixFrog
3
Hier finden Sie Beispiele für die Verwendung, git archivedie Jefromi erwähnt. Es gibt auch einen Link zurück zur Stackoverflow-Frage 160608 .
Lernkurve
3
Sie sind unnötig schlau. Es ist durchaus möglich, ein Herstellerverzeichnis mit allen möglichen anderen Repos zu erstellen. Git speichert nur einen Root, .gitaber Sie können überall Repos haben, z. vendor/something/something/.git.
srcspider
65

So entfernen Sie alle .gitVerzeichnisse unter einem Ordner unter Linux.

Führen Sie diesen Befehl find aus, um alle .gitVerzeichnisse im aktuellen Ordner aufzulisten:

find . -type d -name ".git" \
&& find . -name ".gitignore" \
&& find . -name ".gitmodules"

Drucke:

./.git
./.gitmodules
./foobar/.git
./footbar2/.git
./footbar2/.gitignore

Es sollte nur 3 oder 4 .gitVerzeichnisse geben, da git nur einen .git-Ordner für jedes Projekt hat. Sie können rm -rf yourpathjedes der oben genannten von Hand.

Wenn Sie alle in einem Befehl entfernen und gefährlich leben möchten:

//Retrieve all the files named ".git" and pump them into 'rm -rf'
//WARNING if you don't understand why/how this command works, DO NOT run it!

( find . -type d -name ".git" \
  && find . -name ".gitignore" \
  && find . -name ".gitmodules" ) | xargs rm -rf

//WARNING, if you accidentally pipe a `.` or `/` or other wildcard
//into xargs rm -rf, then the next question you will have is: "why is
//the bash ls command not found?  Requiring an OS reinstall.
Eric Leschinski
quelle
@ Jay Taylor, gebe ich die Backslashes ein oder ist das Teil des Befehls?
Eric Leschinski
Ja, die nachgestellten Schrägstriche dienen der Lesbarkeit. In dieser Form qualifiziert es sich vermutlich als "mehrzeiliger Befehl".
Jay Taylor
Ziehen Sie in Betracht, den .repoOrdner (oben im Baum) zu entfernen, wenn Sie alle Git-bezogenen Ordner entfernen (wenn Sie eine Android-Entwicklung durchführen). source.android.com/source/developing.html
CJBS
Ich würde die -type dKlausel aus der .gitfind-Anweisung entfernen , damit auch die .git-Dateien der Submodule gelöscht werden.
pperejon
16

Sie können git-archive verwenden , zum Beispiel:

git archive master | bzip2 > project.tar.bz2

Wo masterist der gewünschte Zweig.

jweyrich
quelle
Dies dauert 2 Stunden gegen Momentancp -r
GCB
2
@gcb: behandelt cp -rkeine Dateien und Verzeichnisse, die nicht Teil des Repositorys sind, einschließlich ignorierter Dateien. Wenn Sie jedoch sicher sind, dass Sie dies nicht benötigen und Ihre Verarbeitung / Zeit kritisch ist, fahren Sie fort cp.
Jweyrich
4
Um fair zu sein, git archivehat ein Nachteil - Es exportiert keine Submodule. Man müsste git submodule foreach --recursive git archive .... Extrem schlecht!
Jweyrich
Die Verweigerung der Aufnahme von Submodulen ist eine Funktion, kein Nachteil.
William Pursell
16

cd dann zum Repository

find . -name ".git*" -exec rm -R {} \;

Stellen Sie sicher, dass Sie nicht versehentlich einen einzelnen Punkt, einen Schrägstrich, ein Sternchen oder einen anderen Regex-Platzhalter in find finden, da er sonst rmproblemlos gelöscht wird.

zePiet
quelle
1
Das ist großartig, aber ich bekomme eine Nachricht, nachdem find: ./.git: No such file or directoryes funktioniert hat. Wie auch immer, um zu verhindern, dass die Benachrichtigung angezeigt wird?
Rohan Deshpande
7

Für den Fall, dass jemand anderes auf dieses Thema stößt - hier ist eine "Einheitslösung".

Wenn Sie .gitoder verwenden .svn, können Sie die --exclude-vcsOption für Teer verwenden. Dadurch werden viele verschiedene Dateien / Ordner ignoriert, die von verschiedenen Versionskontrollsystemen benötigt werden.

Weitere Informationen finden Sie unter: http://www.gnu.org/software/tar/manual/html_section/exclude.html

OldTinfoil
quelle
1

Im Gegensatz zu anderen Versionsverwaltungssystemen wie SVN oder CVS speichert git alle Metadaten in einem einzigen Verzeichnis und nicht in jedem Unterverzeichnis des Projekts. Also einfach .gitaus dem Stammverzeichnis löschen (oder ein Skript wie git-export verwenden ) und es sollte dir gut gehen.

Adrian Petrescu
quelle
1

ls | xargs find 2> / dev / null | egrep /\.git$ | xargs rm -rf

Dieser Befehl (und es ist nur ein Befehl) entfernt rekursiv .git-Verzeichnisse (und -Dateien), die sich in einem Verzeichnis befinden, ohne das Git-Repo der obersten Ebene zu löschen. Dies ist praktisch, wenn Sie alle Ihre Dateien festschreiben möchten, ohne Submodule zu verwalten .

finde 2> / dev / null | egrep /\.git$ | xargs rm -rf

Dieser Befehl führt dasselbe aus, löscht jedoch auch den Ordner .git aus dem Verzeichnis der obersten Ebene.

Daniel Teichman
quelle