496 Stimmen

Git: Patch lässt sich nicht anwenden

Ich habe einen bestimmten Patch namens my_pcc_branch.patch.

Wenn ich versuche, ihn anzuwenden, erhalte ich folgende Meldung:

$ git apply --check my_pcc_branch.patch
warning: src/main/java/.../AbstractedPanel.java hat Typ 100644, erwartet wird 100755
error: patch fehlgeschlagen: src/main/java/.../AbstractedPanel.java:13
error: src/main/java/.../AbstractedPanel.java: Patch wird nicht angewendet

Was bedeutet das?

Wie kann ich dieses Problem beheben?

0 Stimmen

Gibt es irgendwelche AbstractedPanel.java.rej Dateien herumliegen? Typischerweise bedeutet dies, dass eine Zeile sowohl in der Quelle als auch im Patch geändert wurde (hier scheint Zeile 13 betroffen zu sein).

0 Stimmen

Nein, ich habe keine *.rej-Dateien gefunden.

0 Stimmen

Hast du versucht, einen Bug an git@vger.kernel.org zu melden? Keine der beschriebenen Optionen von Git funktioniert für mich und es treten unzählige Fehler auf. Ich musste auf WinMerge zurückgreifen.

636voto

user1028904 Punkte 6410

git apply --reject --whitespace=fix mychanges.patch hat für mich funktioniert.

Erklärung

Die --reject Option wird git anweisen, nicht zu scheitern, wenn es nicht feststellen kann, wie ein Patch angewendet werden soll, sondern stattdessen die einzelnen Stücke anzuwenden, die angewendet werden können, und Abweichungsdateien (.rej) für Stücke zu erstellen, die nicht angewendet werden können. Wiggle kann "diese abgelehnten Patches anwenden und Wort-für-Wort-Diffs durchführen".

Zusätzlich wird --whitespace=fix vor Whitespace-Fehlern warnen und versuchen, sie zu beheben, anstatt die Anwendung eines ansonsten anwendbaren Stücks abzulehnen.

Beide Optionen zusammen machen die Anwendung eines Patches widerstandsfähiger gegen Versagen, erfordern jedoch zusätzliche Aufmerksamkeit hinsichtlich des Ergebnisses.

Für die gesamte Dokumentation siehe https://git-scm.com/docs/git-apply.

11 Stimmen

Das hat tatsächlich besser für mich funktioniert, weil es meine Datei nicht komplett verändert hat.

14 Stimmen

Das ist großartig. Lehnt einfach ab, was es nicht selbst lösen kann, und Sie können dann einfach die abgelehnten Dateien manuell ändern.

1 Stimmen

Patch -p1 .orig und eine .rej-Patchdatei erstellt, und Sie können die Änderungen manuell anwenden. Ich vermute, dass git apply --reject dasselbe tut und --whitespace=fix magischerweise besser ist.

397voto

Glory to Russia Punkte 15291

Johannes Sixt von der Mailingliste msysgit@googlegroups.com schlug vor, die folgenden Befehlszeilenargumente zu verwenden:

git apply --ignore-space-change --ignore-whitespace mychanges.patch

Dies hat mein Problem gelöst.

29 Stimmen

Kann mir jemand helfen und erklären, warum das funktioniert? Die andere Antwort hat bei mir nicht funktioniert, und ich hatte genau das gleiche Problem wie der Fragende beschreibt. Was haben Dateiattribute mit dem Ignorieren von Leerzeichen zu tun?

1 Stimmen

Mit Windows PowerShell wurde ein Patch, der mit Git Diff erstellt wurde, erfolgreich angewendet. Dies geschah wie folgt: git diff HEAD..613fee -- myfile.xml | git apply --ignore-space-change --ignore-whitespace. Das Speichern der Diff-Ausgabe als Datei funktionierte nicht. Falls jemand auf das gleiche Problem stößt.

2 Stimmen

Versuchen Sie auch den -C1-Schalter für die Anwendung, er reduziert den Kontext um hinzugefügte Teile, die als wichtig erachtet werden.

247voto

ruffin Punkte 14815

Wenn alles andere fehlschlägt, versuchen Sie es mit der Option --3way von git apply.

git apply --3way patchFile.patch

--3way
Wenn der Patch nicht sauber angewendet wird, greife im Falle eines 3-Wege-Merges auf drei Wege zurück, wenn der Patch die Identität der Blobs angibt, auf die er angewendet werden soll, und wir diese Blobs lokal zur Verfügung haben. Dies kann dazu führen, dass Konfliktmarkierungen in den Dateien im Arbeitsverzeichnis verbleiben, die der Benutzer lösen muss. Diese Option impliziert die Option --index und ist nicht kompatibel mit den Optionen --reject und --cached.

Im typischen Fehlerfall wendet git so viel wie möglich vom Patch an und hinterlässt Konflikte, die Sie auf die übliche Weise in git lösen müssen. Wahrscheinlich eine Stufe einfacher als die Alternative reject.

4 Stimmen

Dies ist die Antwort, die für mich funktioniert hat. Die Datei, die ich gepatcht habe, spiegelte nicht die Änderungen wider, die ich aus dem Patch generiert habe (weil ich die Änderungen gelöscht habe, nachdem ich den Patch erstellt hatte.)

3 Stimmen

Schöne allgemeine Lösung. Der 3-Wege-Diff sah nicht aus wie normalerweise, also war ich ein wenig verwirrt darüber, aber trotzdem hat mir das die Möglichkeit gegeben, den Konflikt zu lösen und den Patch anzuwenden.

25 Stimmen

Ich denke, dass dieses --3way das Standardverhalten sein sollte. Wenn das Patchen fehlschlägt, sagen Sie mir zumindest, was fehlgeschlagen ist, damit ich es manuell beheben kann. git apply scheitert einfach und meldet nicht, warum etwas fehlschlägt. Ich konnte nicht einmal *.rej Dateien wie die finden, die hg generiert.

65voto

Ivan Voroshilin Punkte 4821

Dieser Befehl wendet das Patch an, ohne es zu lösen und lässt fehlerhafte Dateien wie *.rej zurück:

git apply --reject --whitespace=fix mypath.patch

Du musst sie nur lösen. Sobald gelöst, führe aus:

git -am resolved

9 Stimmen

Wie man *.rej löst - alles, was ich finden kann, ist, die Änderungen manuell in der Quelldatei vorzunehmen & diese .rej-Dateien zu löschen. Gibt es einen anderen Weg?

1 Stimmen

@coding_idiot Wie üblich, überprüfen Sie einfach die .rej-Dateien, vergleichen Sie sie mit den konfliktierenden Dateien und fügen Sie schließlich die behobenen Dateien dem Index hinzu (mit "git add FIXED_FILES")

5 Stimmen

@coding_idiot du könntest wiggle verwenden, um es zu lösen. Zum Beispiel: wiggle --ersetzen Pfad/zur/Datei Pfad/zur/Datei.rej. Dieser Befehl wendet Änderungen aus der .rej Datei auf die Ursprungsdatei an. Es erstellt auch eine Kopie der Ursprungsdatei, wie Pfad/zur/Datei.porig. Bitte schau in der Dokumentation nach, um weitere Informationen über wiggle zu erhalten.

40voto

Pini Cheyni Punkte 4408

Versuchen Sie, die hier vorgeschlagene Lösung zu verwenden: https://www.drupal.org/node/1129120

patch -p1 < example.patch

Dies hat mir geholfen.

5 Stimmen

Ich weiß, dass man das nicht tun soll, aber VIELEN DANK! Du hast mir Stunden gerettet. Ich habe "Patch wird nicht angewendet" und alle möglichen Fehlermeldungen erhalten.

1 Stimmen

@sudorm-rfslash, warum sollen wir das nicht tun und warum hast du es dennoch gemacht?

0 Stimmen

Git: 'patch' ist kein Git-Befehl. auf Git Version 2.21.1 (Apple Git-122.3)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X