Frage

Ich möchte etwas wie den folgenden Befehl verwenden, um einen Tarball zu erstellen zu implementieren:

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

Der innere git diff Befehl gibt eine Liste von Dateien mit relativen dem relativen Pfad einschließlich, wenn ich es separat ausgeführt werden.

Ich bin in zwei Probleme laufen allerdings muss ich Autofluchträume in der Ausgabe der Lage sein, so Teer beschwert sich nicht über Dateien Räume enthält, und wenn der Teer erstellt bekommt, werden alle Dateien haben ein durch eine ‚versteckte Datei‘ voran duplizieren ‚‘ dass nicht zeigen, mit ls bis -al . Dies sind OSX spezifische Metadateien wie KCH zur Kenntnis genommen.

Wie auch immer, weiß jemand, die Lösung für diese Probleme, oder ist es nur ein einfacher einfacher Weg, um Skript das?

War es hilfreich?

Lösung

I ließ sich auf folgende Lösung mit sed.

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

Andere Tipps

Die versteckten Punkt-Dateien, sind sie punktStrich-Dateien?

Wenn für Datei foo Sie einen anderen ._foo haben, und Sie sind auf einem Mac, der Punkt-Unterstrich-Datei ist, wo die Datei Resource Fork / Metadaten gehalten wird.

Wie für den git-Ausgang, könnte versuchen, es durch sed oder perl kochend für zitiert. Ich glaube, xargs könnte auch hier helfen.

Warum --files-from=FILE oder -T FILE Option von Teer nicht verwenden, wo FILE sein kann '-' Standard-Eingabe, um anzuzeigen,

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

Sie sollten 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). Sie könnten Probleme mit Zeilenumbrüchen in Dateinamen haben, genau wie in IFS-Lösung.

Wenn Größe nicht Sie verwenden können git-Archiv .

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

Sie können versuchen,

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

oder versuchen, die gleiche Sache mit sed oder

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

Beachten Sie, dass es nur eine einzige Newline in IFS ist.

Wenn jedoch die Namen Ihrer Dateien enthalten Zeilenumbrüche, sind Sie zum Scheitern verurteilt.

Hier ist eine andere, elegantere Lösung, die Leerzeichen im Dateinamen arbeitet um zu entkommen

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

Wie jpalecek wies darauf hin, ein Wold will nicht "tar -c ..." mehrfach laufen, es ist besser zu nutzen -r.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top