Ich möchte nur eine Liste der geänderten Dateien zwischen zwei Revisionen erhalten, was einfach ist:
git diff -–name-only commit1 commit2 > /path/to/my/file
Aber was soll ich schreiben, wenn ich alle aufgelisteten Dateien an einen anderen Ort kopieren möchte? Und ich brauche eine völlig identische Verzeichnisstruktur für kopierte Dateien.
Zum Beispiel habe ich Dateien geändert und hinzugefügt:
/protected/texts/file1.txt
/protected/scripts/index.php
/public/pics/pic1.png
Ich möchte in /home/changes/
all diesen geänderten und hinzugefügten Dateien:
/home/changes/protected/texts/file1.txt
/home/changes/protected/scripts/index.php
/home/changes/public/pics/pic1.png
git format-patch
kann dies für Festschreibungsbereiche tun.git diff commit1 commit2 > my.patch
und danncd other/path; patch -p1 < my.patch
. Warum muss es mit vollständigen Kopien der Dateien gemacht werden? Wenn Sie der Meinung sind, dass der Patch möglicherweise nicht angewendet wird und das andere Verzeichnis daher nicht wirklich imcommit1
Status ist, sollten Sie wirklich alles aus demcommit2
Status kopieren ...Antworten:
Versuchen Sie den folgenden Befehl, den ich getestet habe:
quelle
cp --parents
Hinweis, ich wollte diese Option seit Jahren und wusste nie, dass es sie gibt! .. offensichtlich habe ich mich auch nie darum gekümmert = \--parents
Option voncp
nicht verfügbar ist.IFS=$'\n'
zuerst kann es tun. (Am besten in einer Unterschale, um Ihren ursprünglichen IFS-Wert nicht zu verfälschen.)cp: cannot stat 'git diff --name-only': No such file or directory
bei Git Bash unter Windows. Was mache ich falsch? Zielverzeichnis existiertFolgendes sollte gut funktionieren:
Um es weiter zu erklären:
Mit
-z
to können Siegit diff --name-only
die Liste der Dateien ausgeben, die durch NUL-Bytes anstelle von Zeilenumbrüchen getrennt sind, nur für den Fall, dass Ihre Dateinamen ungewöhnliche Zeichen enthalten.Das
-0
toxargs
sagt, dass die Standardeingabe als NUL-getrennte Liste von Parametern interpretiert werden soll.Das
-IREPLACE
ist notwendig , da standardmäßigxargs
die Parameter an das Ende des hängen würdersync
Befehls. Stattdessen heißt das, sie dorthin zu bringen, wo sie späterREPLACE
sind. (Das ist ein guter Tipp aus dieser Serverfehler-Antwort .)Der
-a
Parameter torsync
bedeutet, Berechtigungen, Besitz usw. nach Möglichkeit beizubehalten. Die-R
Möglichkeit, beim Erstellen der Dateien im Ziel den vollständigen relativen Pfad zu verwenden.Update: Wenn Sie eine alte Version von haben
xargs
, müssen Sie die-i
Option anstelle von verwenden-I
. (Ersteres wird in späteren Versionen von veraltetfindutils
.)quelle
xargs --version
sagt das aus?-i
stattdessen verwenden, was in späteren Versionen veraltet ist - 4.1 ist jetzt ziemlich alt. Ich werde meine Antwort aktualisieren.-I
in einigen Versionen ein Leerzeichen benötigen , also versuchen Sie es vielleicht-I REPLACE
stattdessen.-I
wird erst seitfindutils
4.2.10 unterstützt, veröffentlicht im Dezember 2004.--diff-filter=d
, um gelöschte Dateien von der Liste auszuschließen. Andernfalls werden beim Versuch, sie in den Änderungsordner zu kopieren, Fehler angezeigt. Ansonsten tolle Antwort. Vielen Dank!Hier ist ein Einzeiler:
Liste geänderter Dateien auf und packe sie als * .zip:
Listet die zuletzt festgeschriebenen geänderten Dateien auf und packt sie als * .zip:
quelle
sed.exe
? Ich werde immer nochzip
nicht unter Windows gefunden.PATH
env-Variablen hinzufügen .quelle
https://stackoverflow.com/users/79061/sebastian-paaske-t%c3%b8rholm
quelle
Es funktioniert perfekt.
quelle
Niemand hat erwähnt,
cpio
was einfach zu tippen ist, harte Links erstellt und Leerzeichen in Dateinamen behandelt:quelle