Einen Ordner ohne .git-Dateien tarieren?

16

Kann ich einen Ordner tarieren, der ein Git-Repository ist, ohne die .gitzugehörigen Dateien einzuschließen? Wenn nicht, wie würde ich das über einen Befehl tun?

chrisjlee
quelle

Antworten:

23

Schauen Sie sich zuerst an git help archive. archiveist ein Git-Befehl, mit dem Archive erstellt werden können, die nur mit Git verfolgte Dateien enthalten. Wahrscheinlich, wonach Sie suchen. Ein Beispiel am Ende der Manpage:

git archive --format=tar --prefix=git-1.4.0/ v1.4.0 | gzip >git-1.4.0.tar.gz
Stéphane Gimenez
quelle
6
dies archiviert nur root git repo. Wenn Submodule verwendet wurden, sind deren Verzeichnisse leer.
Stann
@Stann: Danke, von einem anderen Submodul-Benutzer
Mark K Cowan
21

Einfachste Antwort: Hinzufügen --exclude-vcs

--exclude-vcs

Dies schließt alle Verzeichnisse des Versionskontrollsystems aus

Ich persönlich benutze

tar -zcvf foo.tar.gz ./FOLDER_NAME --exclude-vcs

Alles, was Sie tun müssen, ist --exclude-vcs am Ende des Befehls hinzuzufügen.

mtelesha
quelle
Alle bekannten , nehme ich an? ;)
phk
2
Alle Optionen müssen vor den Argumenten unter GNU / Linux zusammen sein.
Josh Habdas
1
Wie für GNU / Linux angegebentar --exclude-vcs -zcvf foo.tar.gz ./FOLDER_NAME
Michael Irey
20

Wenn das Archiv die von git verfolgten Dateien enthalten soll, jedoch nicht das git-Repository selbst oder eine generierte oder auf andere Weise nicht verfolgte Datei, verwenden Siegit archive .

Wenn Sie .gitunter Linux oder FreeBSD oder OSX oder Cygwin ausdrücklich einschließen , aber alles andere einschließen möchten, bietet tar eine einfache Möglichkeit, ein Verzeichnis auszuschließen:

tar -c --exclude .git -f - foo | gzip >foo.tgz

Mit GNU tar (zB unter Linux oder Cygwin) können Sie dies auf kürzen tar czf foo.tgz --exclude .git foo.

Die POSIX-Methode zum Erstellen von Archiven lautet pax.

pax -w -t -s '!.*/\.git$!!' -s '!.*/\.git/.*!!' foo | gzip >foo.tgz
Gilles 'SO - hör auf böse zu sein'
quelle
Hat gitcompiliert auf jedem System , in dem tarnicht verfügbar ist? :-)
Stéphane Gimenez
1
@ StéphaneGimenez Wahrscheinlich nicht. Aber es kompiliert auf Systemen, auf denen tares keine --excludeOption gibt, wie zum Beispiel OpenBSD (das zwar die sOption von pax dupliziert , dies ist jedoch keine übliche Syntaxerweiterung für tar-Befehle).
Gilles 'SO - hör auf böse zu sein'
0

Dank einer Antwort auf eine meiner Fragen fand ich eine andere Lösung. Der Vollständigkeit halber hier eine Lösung, die Folgendes nutzt find:

find . -path './.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

Und wenn Sie mögliche .gitOrdner innerhalb (Unter-) + Ordners ausschließen möchten :

find . -path '*/.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

Letzteres kann auch erreicht werden durch:

find . -type d -name '.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

Sehr praktisch, wenn Sie andere Filtertechniken verwenden können find, z. B. Änderungsdatum, Berechtigungen usw.

(Da so oft wohlgeformte Dateinamen vorausgesetzt werden, müssen Sie ansonsten Null-Bytes als Trennzeichen verwenden, was -print0für findund --nullfür bedeuten kann, tarwenn dies unterstützt wird.)

phk
quelle