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


Ich versuche eine Zip-Datei aus einem Ordner zu erstellen und möchte die .zip-Datei ausschließen .git Unterordner aus der resultierenden ZIP-Datei.

Ich bin zum übergeordneten Ordner desjenigen gegangen, den ich komprimieren möchte (aufgerufene Bitvolution) und ich mache:

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

Aber es schließt das nicht aus .git Unterordner.

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


149
2018-02-28 20:38


Ursprung




Antworten:


Der richtige Ausdruck ist -x *.git*, also sollte der vollständige Befehl lauten:

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

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

Die richtige Beschwörungsformel 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 Mac OS X-Verzeichnisanzeige-Metadatendateien auszuschließen.

Beachten Sie, dass der Ausdruck an übergeben wurde --exclude verwendet den gesamten ursprünglichen relativen Verzeichnispfad als ursprüngliche Zeichenfolge, mit der der ursprüngliche ursprüngliche Pfad verglichen werden soll. Damit .svn/* an sich funktioniert nicht; Das Platzhalterzeichen davor stellt sicher, dass es übereinstimmt .svn Verzeichnisse an beliebiger Stelle in der Verzeichnisstruktur.


182
2018-02-28 21:01



Ich musste den Glob in Anführungszeichen setzen oder die Sternchen mit Backslashes, wie zip --exclude '*.git*' -r directory.zip directory oder zip --exclude \*.git\* -r directory.zip directory - Dmitry Minkovsky
Wenn Sie sich Sorgen machen, andere Dateien zu verlieren, die something.gitwhatever genannt werden, können Sie auch verwenden --exclude /.git*. - Erin Call
in ZSH musste ich einen Backslash hinzufügen: -x \*.git\* - DmitrySandalov
Meine bevorzugte Alternative zu Backslashes und Anführungszeichen in zsh: noglob zip -r out.zip someFolder -x *someExcludedFolder* - Sébastien
Wie benutze ich es mit Teer? Es funktioniert nicht mit dem Befehl tar. - RN Kushwaha


Wenn Sie versuchen, ein in Git gespeichertes Projekt zu zippen, verwenden Sie die git archive Befehl. Aus dem Quellverzeichnis:

git archive -o bitvolution.zip HEAD

Sie können eine beliebige Commit- oder Tag-ID anstelle von verwenden HEAD um das Projekt an einem bestimmten Punkt zu archivieren.

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

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

Sie können zum Beispiel auch die Komprimierungsstufe 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).


84
2017-12-14 11:08



Dies schließt nicht nur den Git-Ordner ein, sondern auch alles, was in der Gitignore-Datei enthalten ist, wird ebenfalls ausgeschlossen. Sie bekommen eine Aufwertung. - JoeMoe1984
Genau das, was ich tun wollte! - Bjarte
Ich bin zu spät zur Party, aber das hat mich absolut umgehauen. Gute Antwort! - Tom
Ich frage mich, warum das nicht die beste Antwort ist - nabtron
Für mich war das der größte TIL heute ... - Shawn Cicoria - MSFT


Ich habe einen Backslash hinzugefügt:

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

man page über backslash:

Der umgekehrte Schrägstrich vermeidet die Substitution der Shell-Dateinamen, so dass der Name   Der Abgleich erfolgt auf allen Verzeichnisebenen per Zip.


21
2017-12-14 10:13



Voranstellen von Sternchen mit Schrägstrichgabeln für mich auf Ubuntu 14.04 zum Ausschließen von Verzeichnissen - Dimitry K


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

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

5
2017-12-14 11:12





Wenn Sie zsh verwenden, sollte der Befehl wie folgt aussehen:

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

Wenn du benutzt: zip -r target_name.zip source_dir -x /*.git/*. Ohne 'Regex' wird zsh vor dem Zip-Lauf verarbeitet. Sie erhalten eine Fehlermeldung:

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

1
2018-06-08 09:35



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