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.

Andrey Kuznetsov
quelle
4
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.

Andrey Kuznetsov
quelle
97
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.
Andrey Kuznetsov
75

Versuche dies:

patch -p1 < patchfile
Suppie
quelle
4
Was macht das Argument -p1?
Chrisjlee
8
Streifen Schrägstrich am Anfang. Siehe Mann Patch
egor83
16
@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.

Sola Yang
quelle
1
+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.

denis.peplin
quelle
-16

Versuche dies:

$ git apply file.diff
Shashi
quelle
29
Siehe Frage: "ohne Git installiert"
CB Bailey