Wie kann ich einen Ordner komprimieren, aber den .git-Unterordner ausschließen?


194

Ich versuche eine Zip-Datei aus einem Ordner zu erstellen und möchte den .gitUnterordner aus der resultierenden Zip-Datei ausschließen.

Ich bin in den übergeordneten Ordner des Ordners gegangen, den ich komprimieren möchte ( BitVolution ) und mache Folgendes :

zip -r bitvolution.zip bitvolution -x ".git"

Der .gitUnterordner wird jedoch nicht ausgeschlossen .

Ich habe verschiedene Kombinationen ausprobiert, -x .git*, -x \.git/*, -x .git/\*, -x \.git/\*. Ich habe auch versucht, den vollständigen Pfad für das Ausschlussargument zu verwenden, bin aber einfach nicht dahin gekommen.

Antworten:


232

Der korrekte Ausdruck lautet -x *.git*, daher sollte der vollständige Befehl wie folgt lauten:

zip -r bitvolution.zip bitvolution -x *.git*

Eine Erklärung von http://selfsolved.com/problems/zip-command-exclude-svn-director :

Die richtige Beschwörung ist

zip -9 -r --exclude=*.svn*  foo.zip [directory-to-compress]

Sie können auch eine hinzufügen
--exclude=*.DS_Store*, um die lästigen Metadatendateien der Mac OS X-Verzeichnisanzeige auszuschließen.

Beachten Sie, dass der übergebene Ausdruck --excludeden gesamten ursprünglichen relativen Verzeichnispfad als die ursprüngliche Zeichenfolge verwendet, mit der verglichen werden soll. Also .svn/*an sich funktioniert nicht; Das vordere Platzhalterzeichen stellt sicher, dass es mit .svnVerzeichnissen an einer beliebigen Stelle im Verzeichnisbaum übereinstimmt .


20
Ich musste den Globus in Anführungszeichen setzen oder den Sternchen mit Backslashes entkommen, wie zip --exclude '*.git*' -r directory.zip directoryoderzip --exclude \*.git\* -r directory.zip directory
Dmitry Minkovsky

6
Wenn Sie befürchten, andere Dateien mit dem Namen "something.gitwhatever" zu verlieren, können Sie auch verwenden --exclude /.git*.
Erin Call

4
in ZSH musste ich einen Backslash hinzufügen:-x \*.git\*
DmitrySandalov

2
Meine bevorzugte Alternative zu Backslashes und Anführungszeichen in zsh:noglob zip -r out.zip someFolder -x *someExcludedFolder*
Sébastien

Wie benutzt man es mit Teer? Es funktioniert nicht mit dem Befehl tar.
RN Kushwaha

123

Wenn Sie versuchen, ein in Git gespeichertes Projekt zu komprimieren, verwenden Sie den git archiveBefehl. Aus dem Quellverzeichnis:

git archive -o bitvolution.zip HEAD

Sie können eine beliebige Festschreibungs- oder Tag-ID verwenden, HEADum das Projekt an einem bestimmten Punkt zu archivieren.

Wenn Sie jeder Datei ein Präfix hinzufügen möchten (z. B. einen Ordner der obersten Ebene):

git archive -o bitvolution.zip --prefix=bitvolution/ HEAD

Sie können die Komprimierungsstufe beispielsweise auch zwischen 0 (keine Komprimierung) und 9 (maximale Komprimierung) einstellen

git archive -o bitvolution.zip -9 HEAD

Weitere Optionen finden Sie auf der Hilfeseite ( git help archive).


25
Dies beinhaltet nicht nur nicht den Git-Ordner, sondern auch alles, was in der Gitignore-Datei enthalten ist, wird ebenfalls ausgeschlossen. Sie, mein Herr, bekommen eine Gegenstimme.
JoeMoe1984

1
Genau das, wonach ich gesucht habe!
Bjarte

Ich bin zu spät zur Party, aber das hat mich total umgehauen. Gute Antwort!
Tom

Ich frage mich, warum dies nicht die beste Antwort ist
Nabtron

Für mich war dies die größte Zeit bis heute ...
Shawn Cicoria

27

Ich habe Backslash hinzugefügt:

zip -r bitvolution.zip bitvolution -x \*.git\*

Manpage über Backslash:

Der umgekehrte Schrägstrich vermeidet das Ersetzen der Shell-Dateinamen, sodass der Namensabgleich von zip auf allen Verzeichnisebenen durchgeführt wird.


Voranstellen von Sternchen mit Schrägstrichen für mich auf Ubuntu 14.04, um Verzeichnisse auszuschließen
Dimitry K

6

Vorausgesetzt, Sie haben git auf dem Computer installiert, auf dem Sie dies tun, können Sie git auch selbst verwenden, um Ihr Archiv zu erstellen.

git archive --format=zip HEAD -o bitvolution.zip

2

Wenn Sie zsh verwenden, sollte der Befehl folgendermaßen aussehen:

zip -r target_name.zip source_dir -x '/*.git/*'

Wenn Sie verwenden: zip -r target_name.zip source_dir -x /*.git/*. Ohne 'Regex' wird zsh verarbeitet, bevor zip ausgeführt wird. Sie erhalten eine Fehlermeldung:

zsh: no matches found: /*.git/*

Vielen Dank! Das hat bei mir mit Bash unter Ubuntu unter Windows funktioniert.
Adriano Monecchi

Ich verstand nicht, wie dieses Muster funktioniert, arbeitete aber für mich bei zsh.
insign
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.