Wie wende ich einen Git Diff Patch an, ohne dass Git installiert ist?
280
Wie kann mein Client Patches anwenden, die git diffohne Git installiert wurden? Ich habe versucht, den patchBefehl zu verwenden, aber er fragt immer nach dem Dateinamen, der gepatcht werden soll.
Weiß jemand, wie man das macht, wenn der Patch Umbenennungen enthält? Unterstützt Patch das jetzt nativ?
Paul Crowley
3
Die Frage sollte wirklich sein: Gibt es eine Möglichkeit , ein Git-Diff anzuwenden, ohne dass Git installiert ist? Wie unten erwähnt , patchwird dieses Format nicht vollständig unterstützt.
Aryeh Leib Taurog
Antworten:
425
git diff > patchfile
und
patch -p1 < patchfile
Arbeit, aber wie viele Leute in Kommentaren und anderen Antworten bemerkt, versteht Patch das Hinzufügen, Löschen und Umbenennen nicht. Es gibt keine Option, aber git apply patchfilewenn Sie Handle-Dateien hinzufügen, löschen und umbenennen müssen.
EDIT Dezember 2015
Die neuesten patchBefehlsversionen (2.7, veröffentlicht im September 2012) unterstützen die meisten Funktionen des "diff - git" -Formats, einschließlich Umbenennungen und Kopien, Berechtigungsänderungen und Symlink-Diffs (aber noch keine binären Diffs) ( Release-Ankündigung ).
Vorausgesetzt, man verwendet die aktuelle / neueste Version von, patchist es nicht erforderlich, diese zu verwenden git, um das Diff als Patch anwenden zu können.
Oder verwenden Sie git diff > patchfile, aberpatch -p1 < patchfile
Jakub Narębski
11
Wenn Sie eine Patchdatei eines Unterpfads des Repositorys erstellen möchten, können Sie die folgende relativeOption verwenden:git diff --no-prefix --relative=my/relative/path > patchfile
Koen.
2
patch -p1 < patchfileerfordert nicht git installiert. Der erste Befehl demonstriert den Befehl zum Generieren von Diff, ohne es anzuwenden.
Andrey Kuznetsov
1
Der generierte Patch ist für die Änderungen von der im Befehl angegebenen Verzweigung / Referenzspezifikation zur aktuellen oder aktiven Verzweigung. Mit anderen Worten, Sie wollen git diff from_branch > patchfile; git checkout from_branch; git patch -p1 < patchfileodergit diff from_branch to_branch > patchfile; ...
Kochfelder
1
@PaulChechetin Wie egor83 in Suppies Antwort sagte, wird am Anfang ein Schrägstrich entfernt.
@chrisjlee git diffsetzt a/und b/Präfixe in die Ausgabe, patch -p1vernachlässigt also diejenigen, die die Patch-Datei anwenden.
Wberry
49
Verwenden
git apply patchfile
wenn möglich.
patch -p1 < patchfile
hat mögliche Nebenwirkungen.
git applybehandelt auch das Hinzufügen, Löschen und Umbenennen von Dateien, wenn diese im git diffFormat beschrieben sind, was patchnicht der Fall ist. Schließlich git applyhandelt es sich um ein Modell "Alle anwenden oder alle abbrechen", bei dem entweder alles angewendet wird oder nichts angewendet wird, während Patch Patch-Dateien teilweise anwenden kann und Ihr Arbeitsverzeichnis in einem seltsamen Zustand belässt.
+1, Die einzig vernünftige Antwort. Darüber hinaus verarbeitet diff / patch keine Symlinks. Dies ist ein Problem, wenn Sie beispielsweise den 3.10 Linux-Kernel-Patch zurücksetzen.
Ignis
10
Ja, das git applyist der beste Weg, aber in dieser Frage wird speziell gefragt, wie der Patch ohne Git angewendet werden soll .
Colin D Bennett
1
Optionen --dry-run --verbosesind nützlich, um zu bestimmen, welche Nebenwirkungen gegebenenfalls auftreten werden. (mit Patch v2.5.8)
Spyle
@ignis - " git apply patchfile -... die einzig vernünftige Antwort ..." - das ist fast lächerlich. Jedes Mal, wenn die OpenSSL-Entwickler mir einen Patch zum Testen senden, kann Git ihn nicht anwenden. Das ist jedes Mal. Ich habe noch nicht gesehen, dass dieses blöde Tool einen Patch anwendet.
JWW
8
ich benutze
patch -p1 --merge < patchfile
Auf diese Weise können Konflikte wie gewohnt gelöst werden.
patch
wird dieses Format nicht vollständig unterstützt.Antworten:
und
Arbeit, aber wie viele Leute in Kommentaren und anderen Antworten bemerkt, versteht Patch das Hinzufügen, Löschen und Umbenennen nicht. Es gibt keine Option, aber
git apply patchfile
wenn Sie Handle-Dateien hinzufügen, löschen und umbenennen müssen.EDIT Dezember 2015
Die neuesten
patch
Befehlsversionen (2.7, veröffentlicht im September 2012) unterstützen die meisten Funktionen des "diff - git" -Formats, einschließlich Umbenennungen und Kopien, Berechtigungsänderungen und Symlink-Diffs (aber noch keine binären Diffs) ( Release-Ankündigung ).Vorausgesetzt, man verwendet die aktuelle / neueste Version von,
patch
ist es nicht erforderlich, diese zu verwendengit
, um das Diff als Patch anwenden zu können.quelle
git diff > patchfile
, aberpatch -p1 < patchfile
relative
Option verwenden:git diff --no-prefix --relative=my/relative/path > patchfile
patch -p1 < patchfile
erfordert nicht git installiert. Der erste Befehl demonstriert den Befehl zum Generieren von Diff, ohne es anzuwenden.git diff from_branch > patchfile; git checkout from_branch; git patch -p1 < patchfile
odergit diff from_branch to_branch > patchfile; ...
Versuche dies:
quelle
git diff
setzta/
undb/
Präfixe in die Ausgabe,patch -p1
vernachlässigt also diejenigen, die die Patch-Datei anwenden.Verwenden
wenn möglich.
hat mögliche Nebenwirkungen.
git apply
behandelt auch das Hinzufügen, Löschen und Umbenennen von Dateien, wenn diese imgit diff
Format beschrieben sind, waspatch
nicht der Fall ist. Schließlichgit apply
handelt es sich um ein Modell "Alle anwenden oder alle abbrechen", bei dem entweder alles angewendet wird oder nichts angewendet wird, während Patch Patch-Dateien teilweise anwenden kann und Ihr Arbeitsverzeichnis in einem seltsamen Zustand belässt.quelle
git apply
ist der beste Weg, aber in dieser Frage wird speziell gefragt, wie der Patch ohne Git angewendet werden soll .--dry-run --verbose
sind nützlich, um zu bestimmen, welche Nebenwirkungen gegebenenfalls auftreten werden. (mit Patch v2.5.8)git apply patchfile -
... die einzig vernünftige Antwort ..." - das ist fast lächerlich. Jedes Mal, wenn die OpenSSL-Entwickler mir einen Patch zum Testen senden, kann Git ihn nicht anwenden. Das ist jedes Mal. Ich habe noch nicht gesehen, dass dieses blöde Tool einen Patch anwendet.ich benutze
Auf diese Weise können Konflikte wie gewohnt gelöst werden.
quelle
Versuche dies:
quelle