it-swarm.com.de

Tarballing ohne Git-Metadaten

Mein Quellbaum enthält mehrere Verzeichnisse, die Git-Quellcodeverwaltung verwenden, und ich muss den gesamten Baum tarieren, wobei alle Verweise auf die Git-Metadaten oder benutzerdefinierte Protokolldateien ausgenommen sind.

Ich dachte, ich würde eine Kombination aus find/egrep/xargs/tar ausprobieren, aber irgendwie enthält die tar-Datei die .git-Verzeichnisse und die * .log-Dateien.

Das ist was ich habe:

find -type f . | egrep -v '\.git|\.log' | xargs tar rvf ~/app.tar

Kann jemand mein Missverständnis hier erklären? Warum verarbeitet tar die Dateien, die von find und egrep gefiltert werden?

Ich bin auch offen für andere Techniken.

43
zaf

Sie erhalten eine böse Überraschung, wenn sich die Anzahl der Dateien auf mehr als einen xargs-Befehl erhöht: Dann erstellen Sie zunächst eine tar-Datei aus den ersten Dateien und überschreiben dann dieselbe tar-Datei mit den restlichen Dateien.

GNU tar hat die Option --exclude, mit der dieses Problem gelöst werden kann:

tar cvf ~/app.tar --exclude .git --exclude "*.log" .
84
Ole Tange

Sie können es direkt mit der tar-Option versuchen --exclude-vcs:

--exclude-vcs:
          Exclude version control system directories

Zum Beispiel:

tar cvfj nameoffile.tar.bz2 directory/ --exclude-vcs

Es funktioniert mit Git.

48
Ivan

Versuchen Sie etwas so:

git archive --format=tar -o ~/tarball.tar -v HEAD

Fügen Sie Ihre .log-Dateien und alles andere hinzu, das Sie nicht in Ihre .gitignore-Datei packen möchten.

11
jkramer

So schließen Sie Versionskontrollsystemverzeichnisse aus:

tar --exclude-vcs

Dies schließt SVN, Git Metafiles etc. aus.

11
PeloNZ

Mit dem neueren tar GNU können Versionskontrollverzeichnisse mit dem Flag --exclude-vcs automatisch ausgeschlossen werden. Dies wird sich auch um .git kümmern.

4
KeshV

[Schlag] Bah! Die zu findenden Parameter waren in der falschen Reihenfolge! Ich habe die Warnungen nicht gesehen, weil sie vom Bildschirm abgehauen sind. Dies erlaubt '.' durch Egrep zu gehen, was dazu führte, dass Teer alles schlurfte.

Das wird mich lehren, wichtige Nachrichten im ausführlichen Debug zu ertränken.

Das funktioniert:

find . -type f | egrep -v '\.git|\.log' | xargs tar cvf ~/app.tar
4
zaf

git-archive ist vielleicht das, wonach Sie suchen.

2
Skilldrick

Das geht auch ohne grep. find ist mächtig

 find . -type f -not \( -iname ".git" -or -iname ".log" \) | xargs ...
2

Um dies von außerhalb des App-Verzeichnisses zu tun:

tar cvfz app.tar.gz --exclude ".git/*" --exclude ".git" app/

Für mich ist der .gitignore-Inhalt genau das, was ich brauchte:

tar cvfz $PROJECT.tar.gz --exclude-from=$PROJECT/.gitignore $PROJECT

--exclude-from liest den Inhalt der Datei - und erklärt die dort aufgeführten Muster

0
Ricky Levi