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.

Tom
quelle

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 .

Jesaja
quelle
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).

Blair
quelle
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.

Priit Tamboom
quelle
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
Tatu Lahtela
quelle
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/*
g10guang
quelle
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