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.