Erstellen Sie eine Patch- oder Diff-Datei aus dem Git-Repository und wenden Sie sie auf ein anderes Git-Repository an

155

Ich arbeite an einem WordPress-basierten Projekt und möchte mein Projekt bei jeder neuen Release-Version von WP patchen. Dazu möchte ich einen Patch zwischen zwei Commits oder Tags generieren.

Zum Beispiel /www/WPmache ich in meinem Repo Folgendes :

$git patch-format com1..com2 --stdout > ~/patchs/mypatch.patch

Oder

$git patch-format tag1..tag2 --stdout > ~/patchs/mypatch.patch

/www/WP Git Natif WordPress

/www/myproject Mein Git-Projekt basiert auf WordPress

Die git applyBefehlszeile funktioniert nicht, denke ich, weil wir uns in verschiedenen Repositorys befinden.

Kann ich eine Patch-Datei ohne Commit, nur ein Differential, generieren und auf ein anderes Git-Repository anwenden?

Vielen Dank im Voraus.

Zatamin
quelle

Antworten:

243

Sie können nur git diffein einheitliches Diff erstellen, das geeignet ist für git apply:

git diff tag1..tag2 > mypatch.patch

Sie können den resultierenden Patch dann anwenden mit:

git apply mypatch.patch
Enrico Campidoglio
quelle
1
Vielen Dank, Enrico, ich habe verwendet $git diff -u tag1..tag2 > mypatch.patchund $git apply --stat > mypatch.patchdie Antwort ist 0 files changedein anderer Vorschlag bitte? :)
Zatamin
Sie müssen den Pfad zur Patch-Datei als Argument für angeben git apply. Ich habe meine Antwort mit einem Beispiel aktualisiert.
Enrico Campidoglio
1
Ich habe verwendet, git diff -p tag1 tag2 > my.patchwas gut funktioniert hat.
Barclay
Wie erstelle ich Patches im einheitlichen Diff-Format? sourceware.org/glibc/wiki/… sagt, Only unified diff (-uNr) format is acceptable.aber wenn ich es versuche, git diff -uNr tag1..tag2 > mypatch.patchbekomme ich die Nachrichtusage: git diff [<options>] [<commit> [<commit>]] [--] [<path>...]
Aaron Franke
2
Seien Sie vorsichtig git diff ...+ git apply ...behandeln Sie gelöschte / verschobene Dateien nicht richtig ... wenn git format-patch ...+ git am ....
vrince
50

Um Patches für mehrere Commits zu erstellen, sollten Sie den format-patchBefehl git verwenden, z

git format-patch -k --stdout R1..R2

Dadurch werden Ihre Commits in eine Patch-Datei im Postfachformat exportiert.

Führen Sie Folgendes aus, um einen Patch für das letzte Commit zu generieren:

git format-patch -k --stdout HEAD^

Wenden Sie dann in einem anderen Repository den Patch per amgit-Befehl an, z

git am -3 -k file.patch

Siehe: man git-format-patchund git-am.

Kenorb
quelle
1
Was ist mit einem Patch, der angewendet werden kann patch -p1? sourceware.org/glibc/wiki/…
Aaron Franke
Ich habe den Patch von Linux auf Winodws verschoben und musste daher --ignore-whitespace verwenden, wie hier erwähnt. Stackoverflow.com/questions/13190679/…
Mahesh
2
@ AaronFranke, können Sie die Option '-p' ausprobieren: Git Format-Patch -p HEAD ^ 1
Piroxiljin
Dies hat den Vorteil, dass die Festschreibungsnachrichten, der Autor und die Festschreibungsdaten der ursprünglichen Festschreibungen beibehalten werden.
M. Justin
0

Um einen Patch für nur ein bestimmtes Commit zu erstellen, verwenden Sie als Ergänzung:

git format-patch -1 <sha>

Stellen Sie beim Generieren der Patch-Datei sicher, dass Ihr anderes Repo weiß, wo es sich befindet, wenn Sie es verwenden git am ${patch-name}

git apply --check ${patch-name}Stellen Sie vor dem Hinzufügen des Patches sicher, dass keine Konflikte vorliegen.

Eugene
quelle