2010-06-18 14 views
40

Mein Source-Tree enthält mehrere Verzeichnisse, die Git-Quellcodeverwaltung verwenden, und ich muss den gesamten Baum tarnen, mit Ausnahme von Referenzen auf die Git-Metadaten oder benutzerdefinierte Protokolldateien.Tarballing ohne Git-Metadaten

Ich dachte, ich würde eine Kombination von find/egrep/xargs/tar verwenden, 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 hier mein Missverständnis erklären? Warum filtert tar die Dateien, die find und egrep filtern?

Ich bin offen für andere Techniken.

Antwort

74

Sie werden eine böse Überraschung, wenn die Anzahl der Dateien auf mehr als ein xargs Befehl erhöhen: Dann werden Sie zunächst eine tar-Datei der ersten Dateien machen und überschreibt dann die gleichen TAR-Datei mit dem Rest der Dateien.

GNU tar hat die --exclude Option, die dieses Problem lösen:

tar cvf ~/app.tar --exclude .git --exclude "*.log" . 
+3

funktioniert auch mit bsdtar unter OS X. – rexford

2

git-archive möglicherweise was Sie suchen.

+0

Wahrscheinlich nicht. Da es mehrere Gits im Quellbaum gibt. – zaf

2

Sie könnten das ohne grep tun. zu finden ist mächtig

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

Das Problem war meine Suche Parameter. Siehe meine Antwort. Danke für die Alternative. – zaf

11

so etwas wie dieses Versuchen:

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

Fügen Sie Ihre LOG-Dateien und alles, was Sie wollen nicht Ihre .gitignore Datei gepackt werden.

4

[Schlag] Bah! Die zu suchenden Parameter waren in der falschen Reihenfolge! Ich habe die Warnungen nicht gesehen, weil sie vom Bildschirm weggesprungen sind. Dies erlaubt '.' durch egrep hindurchgehen, was dazu führte, dass Teer alles verschlang.

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

Dies funktioniert:

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

Um Versionskontrollsystem Verzeichnisse ausschließen:

tar --exclude-vcs

Mit diesem Ausschluß SVN, Git Metadateien usw.

0

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

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

können Sie versuchen, direkt mit dem Teer Option --exclude-VCS:

--exclude-vcs: 
      Exclude version control system directories 

Zum Beispiel:

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

Es mit Git arbeitet.

+1

Danke, aber "Option --exclude-vcs wird nicht unterstützt" mit meiner Version von tar. – zaf

+1

@zaf ja = nur GNU tar. MacOSX wird mit bsdtar geliefert, das es nicht hat. – marko

+0

@Marko Aha, danke für die Aufklärung. Diese Details stören mich immer. – zaf

3

Das neuere GNU-tar hat die Option, Versionskontrollverzeichnisse automatisch mit dem Flag --exclude-vcs auszuschließen. Dies wird auch für .git sorgen.

0

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

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

--exclude-from wird der Inhalt der Datei zu lesen - und exlucde die dort aufgeführten Muster

+0

gibt es auch --exclude-vcs-ignores, die das Ausschließen von Mustern aus den VCS-Ignorierdateien liest. –