2009-03-01 12 views
2

bereitstellen Ich möchte so etwas wie den folgenden Befehl verwenden, um einen Tarball zu erstellen implementieren:Probleme git diff mit Dateiliste erstellen für

tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def` 

Der innere git diff-Befehl eine Liste von Dateien mit relativ produziert, einschließlich der relativer Pfad, wenn ich es separat ausführe.

Ich bin jedoch in zwei Probleme, ich muss in der Lage sein, Leerzeichen in der Ausgabe automatisch zu entkommen, so tar nicht über Dateien mit Leerzeichen beschwert und wenn das Tar erstellt wird, haben alle Dateien ein dupliziere 'versteckte Datei' mit einem vorangestellten '.' die nicht mit ls -al angezeigt werden. Dies sind OSX-spezifische Metadateien, wie von kch angegeben.

Wie auch immer, kennt jemand die Lösung für diese Probleme, oder gibt es einfach eine einfachere Möglichkeit, dies zu skripten?

+0

BTW, ich oft bereitstellen über Push und Post-Empfang Haken verwenden, um mit der Aktualisierung der Struktur, Neustart der App, usw. Es ist wirklich schnell und unkompliziert. – kch

+0

Danke, vielleicht werde ich das tun. –

Antwort

4

Ich entschied mich für die folgende Lösung mit sed.

tar cjf ~/deploy.tar.bz2 \ 
`git diff --name-only 0abc 1def|sed -e "s/ /\\\ /g"` 
0

Wenn die Größe keine Rolle spielt, können Sie git Archiv verwenden.

Ich bin mir nicht sicher, ob es möglich ist, einen Tarball zu erstellen, der nur die Unterschiede zwischen zwei Commits enthält. mit sed oder

IFS=' 
' tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def` 

Hinweis

+0

Das würde funktionieren, aber ich möchte vermeiden, Dateien neu zu implementieren, die keine Änderungen enthalten. –

0

können Sie

eval tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def | while read x; do echo "'""$x""'"; done` 

versuchen oder das Gleiche versuchen, dass es nur eine einzige Newline in IFS ist.

Wenn jedoch der Name Ihrer Dateien Zeilenumbrüche enthält, sind Sie verloren.

+0

Funktioniert nicht, ich glaube nicht, dass die Quotierung nach der Einspeisung durch das Rohr gleich ausgewertet wird. –

+0

Ja, tut mir leid. Ich habe den Beitrag bearbeitet, damit er funktioniert, eine Lösung mit eval, eine andere mit der IFS-Variablen. – jpalecek

2

Die versteckten Dot-Dateien, sind das Punkt-Unterstreich-Dateien?

Wenn für die Datei foo eine andere ._foo vorhanden ist und Sie sich auf einem Mac befinden, wird in der Datei mit dem Punkt-Unterstrich die Dateiressourcengabel/Metadaten gespeichert.

Wie für den Git-Ausgang, könnte versuchen, es durch sed oder perl für Zitate zu leiten. Ich glaube, xargs könnte hier auch helfen.

+0

Ja, ich denke, Sie haben Recht mit den ._-Dateien. –

0

Hier ist eine andere, elegantere Lösung, die

git diff --name-only 0abc 1def | \ 
    tr '\n' '\0' | \ 
    xargs -0 tar -rjvf ~/deploy.tar.bz2 

Wie jpalecek wies darauf hin, ein Wold nicht ausgeführt werden soll in den Dateinamen

entkommen Räumen arbeitet rund um „tar -c ...“ mehrfach, Es ist besser, -r zu verwenden.

+0

Ich würde das nicht tun. xargs gibt Ihnen keine Garantie, den Befehl nur einmal auszuführen, sodass Sie Tar mehrmals ausführen und nur Dateien aus dem letzten Batch archivieren können. – jpalecek

+0

Korrigieren. Es sollte jedoch gut mit -r funktionieren. – hillu

2

Warum nicht --files-from=FILE oder -T FILE Option von tar verwenden, wo FILE kann sein - um Standardeingabe zu signalisieren?

git diff --name-only 0abc 1def | tar -T - cjf ~/deploy.tar.bz2 

Sie sollen nicht mit Leerzeichen oder Tabs in Dateinamen Problem haben, oder mit einfachen Anführungszeichen oder einfachen Anführungszeichen oder Schrägstrichen (Ich denke, Ihre Lösung Probleme mit Apostroph „'“ im Dateinamen haben würde). Möglicherweise haben Sie Probleme mit Zeilenumbrüchen in Dateinamen, genau wie in der IFS-Lösung.

+1

+1. Ich wette, das wird "nur" mit GNU tar funktionieren :-) – hillu

+0

Das werde ich mir merken. Wenn ich mehr Probleme bekomme, werde ich wahrscheinlich nur die alphanumerischen Zeichenfolgen bereinigen. –

+1

Das hat super funktioniert (ganz zu schweigen von den einfacheren Antworten), außer Tar auf Ubuntu will einen Strich vor dem Kommando. Ie: 'tar-T - -cf' anstelle von' tar-T-cf'. –