Wie wende ich einen Diff-Patch unter Windows an?

136

Es gibt viele Programme, die einen Diff-Patch erstellen können, aber ich habe verdammt viel Zeit damit, einen anzuwenden. Ich versuche, einen Patch zu verteilen, und habe von einem Benutzer eine Frage zur Anwendung erhalten. Also habe ich versucht, es selbst herauszufinden und festgestellt, dass ich keine Ahnung habe, und die meisten Tools, die ich finden kann, sind Befehlszeilen. (Ich kann mit einer Befehlszeile umgehen, aber viele Leute würden ohne eine nette, freundliche Benutzeroberfläche verloren gehen. Diese sind also für diesen Zweck nicht gut.)

Ich habe versucht, TortoiseSVN zu verwenden. Ich habe den Patch, den ich anwenden möchte. Ich klicke mit der rechten Maustaste auf den Patch, und im Untermenü TortoiseSVN gibt es eine Option mit der Aufschrift "Patch anwenden". Alles was es tut ist ein leeres Fenster hochzuziehen.

Also habe ich versucht, Open zu treffen. Es gibt zwei Möglichkeiten: Zusammenführen und Anwenden von Unified Diff. (Der Patch ist zum Glück im einheitlichen Diff-Format.) Aber die Apply-Option funktioniert einfach nicht: Sie fragt nach dem Patch und einem Ordner. Irgendwie hat es vergessen, nach der Datei zu fragen, auf die der Patch angewendet werden soll! TortoiseSVN funktioniert also einfach nicht. Gibt es ein Windows-GUI-basiertes Dienstprogramm, das einen Patch und eine Datei nimmt und ordnungsgemäß anwendet?

BEARBEITEN: Wenn man sich die bisherigen Antworten ansieht, scheint es, dass Tortoise es nur richtig macht, wenn es sich um eine Datei handelt, die bereits versioniert ist. Das ist hier nicht der Fall. Ich muss in der Lage sein, einen Patch auf eine Datei anzuwenden, die nicht aus einem SVN-Repository stammt. Ich habe gerade versucht, Tortoise zu verwenden, weil ich zufällig weiß, dass SVN Unterschiede verwendet und wissen muss, wie man sie sowohl erstellt als auch anwendet.

Mason Wheeler
quelle
Die Antwort von WinMerge klang gut, erklärt aber nur, wie man einen Patch erstellt, nicht wie man einen anwendet. TortoiseHG bietet eine großartige Möglichkeit, Patches anzuwenden, aber meines Wissens nur auf Dateien, die sich in einem HG-Repo befinden. Wenn der externe SVN TortoiseDiff dies nicht kann, frage ich mich, ob ein GUI-Tool dies kann.
Warren P
3
Wow, Sie haben Recht, die kurze Antwort lautet immer noch nein - zumindest in WinMerge. Feature-Anfrage auf WinMerge hier sourceforge.net/tracker/…
KCD

Antworten:

32

Patch anwenden

Mit TortoiseMerge:

  1. Suchen und öffnen Sie ein vorhandenes SVN-Repo-Verzeichnis
  2. Erstellen Sie ein neues Verzeichnis mit dem Namen "Zusammenführungen", falls es noch nicht vorhanden ist
  3. Kopieren Sie die Datei, auf die Sie die .patch-Datei anwenden möchten
  4. ADD und COMMIT zum svn-Repository, bevor Sie mit dem nächsten Schritt fortfahren
  5. Klicken Sie mit der rechten Maustaste auf Zusammenführungen und wählen Sie Patch anwenden ...
  6. Doppelklicken Sie auf die Datei aus der Liste
  7. Die gepatchte Datei mit diff wird im rechten Bereich angezeigt
  8. Klicken Sie auf diesen Bereich und klicken Sie auf Speichern oder exportieren mit Datei-> Speichern unter ...

Alternative Screeny, wenn Sie von TortoiseMerge öffnen. In der folgenden Abbildung bezieht sich das Verzeichnis auf das in Schritt 2 oben erwähnte Verzeichnis "Zusammenführen": Screeny

Screenshot der WinMerge-Benutzeroberfläche: Screeny

Sheriff Md
quelle
@ WarrenP: Ja, es erklärt, wie man den Patch mit TortoiseMerge
Walter Stabosz
4
Mein Kommentar war vor der Bearbeitung sinnvoll und nach der Bearbeitung nicht mehr sinnvoll. Bist du schon verwirrt? Der obige Bearbeitungszeitstempel (24. März '11) scheint falsch zu sein, da das OP seine Antwort seit Oktober 2011 erneut bearbeitet hat. Ich denke, der Zeitstempel in meinem Kommentar ist auch falsch.
Warren P
9
@SheriffMd Erhalten Sie nicht die Fehlermeldung "D: \ Ordner ist keine Arbeitskopie"?
onmyway133
1
@SheriffMd Ich erhalte auch die Meldung "Ordner ... ist keine Arbeitskopie". Wie ist es also möglich, mit Tortoise Merge einen Patch auf nicht versionierte Dateien anzuwenden?
Peter T.
1
@ onmyway133, ich habe die Schritte umformuliert. Siehe Schritt 2 und Schritt 4. Sie erhalten keine Fehlermeldung "Keine Arbeitskopie".
Sheriff Md
21

Ich habe nur dafür ein reines Python-Tool erstellt . Es hat ein vorhersehbares plattformübergreifendes Verhalten. Obwohl keine neuen Dateien erstellt werden (zum Zeitpunkt des Schreibens) und keine grafische Benutzeroberfläche vorhanden ist, kann es als Bibliothek zum Erstellen von Grafikwerkzeugen verwendet werden.

UPDATE : Es sollte bequemer sein, es zu verwenden, wenn Sie Python installiert haben.

pip install patch
python -m patch
anatoly techtonik
quelle
1
Ich benutze das oft. Danke @techtonik. Gibt es Neuigkeiten, wie man es mit Python3 zum Laufen bringt?
Pelson
Führen Sie den Pip-Installations-Patch mit Administratorrechten aus, um sicherzustellen, dass er funktioniert.
Vertexwahn
@Vertexwahn ist es unter Linux?
Anatoly Techtonik
Python läuft überall - ich habe es mit Windows 10 getestet
Vertexwahn
Funktionierte unter Windows 10, wenn der Git-Patch nicht funktionierte. Danke dir!
sqrl0
19

TortoiseMerge ist ein separates Dienstprogramm, das im Lieferumfang von TortoiseSVN enthalten ist.

Es kann auch separat im Archiv TortoiseDiff.zip heruntergeladen werden . Auf diese Weise können Sie einheitliche Unterschiede auf nicht versionierte Dateien anwenden.

Paul Shannon
quelle
21
AFAIK Dies kann keinen Patch auf eine nicht versionierte Datei anwenden.
Pihentagy
Ich hatte kein Problem damit, es auf eine nicht versionierte Datei anzuwenden.
Paul Shannon
andere wollen irgendwie: S.
UmNyobe
1
Version 1.8.7 gibt einen Fehler darüber aus, dass das Ziel nicht versioniert wird.
Nick Westgate
15

Ich weiß, dass Sie gesagt haben, Sie würden eine GUI bevorzugen, aber die Befehlszeilentools werden die Arbeit gut machen. Unter GnuWin finden Sie eine Portierung von Unix-Tools für Windows. Du brauchst natürlich den Patch-Befehl ;-)

Möglicherweise tritt jedoch ein Problem mit der Leitungsbeendigung auf. Der GnuWin-Port geht davon aus, dass die Patchdatei über einen Zeilenabschluss im DOS-Stil (CR / LF) verfügt. Versuchen Sie, die Patchdatei in einem einigermaßen intelligenten Editor zu öffnen, damit sie für Sie konvertiert wird.

Sardaukar
quelle
Gut ausgedrückt. Ohne diesen Kommentar hätte ich das Leitungsbeendigungsproblem nicht herausfinden können.
Bryan
Eine andere Möglichkeit, mit den Zeilenenden umzugehen, besteht darin, der Befehlszeile die Option "--binary" hinzuzufügen.
BeReal82
4
Das hat mich auf den richtigen Weg gebracht. Unter Windows 7 oder höher müssen Sie jedoch das Manifest von patch.exe aktualisieren, um zu vermeiden, dass das UAC-Popup jedes Mal angezeigt wird. Auf dieser Seite finden Sie eine Anleitung
Anttu
1
Selbst mit den UAC-Korrekturen bringt die GnuWin-Version des Patches die Einstellungen für die Dateisicherheit durcheinander. Der mit git gelieferte Build leidet nicht unter beiden Problemen.
Artfunkel
8

In TortoiseSVN funktioniert das Anwenden von Patches. Sie müssen den Patch auf dasselbe Verzeichnis anwenden, aus dem er erstellt wurde . Es ist immer wichtig, dies zu berücksichtigen. So geht's in TortoiseSVN:

Klicken Sie mit der rechten Maustaste auf den Ordner, auf den Sie den Patch anwenden möchten. Es wird ein Dialogfeld angezeigt, in dem Sie nach dem Speicherort der Patch-Datei gefragt werden. Wählen Sie die Datei aus, und dies sollte ein kleines Dateilistenfenster öffnen, in dem die geänderten Dateien aufgelistet sind. Wenn Sie auf jedes Element klicken, wird ein Diff-Fenster geöffnet, in dem angezeigt wird, was der Patch mit dieser Datei tun soll.

Viel Glück.

Dan
quelle
8
Das hilft nicht. Die Zieldateien stammen nicht aus einem SVN-Archiv. (Siehe die Bearbeitung des ursprünglichen Beitrags.)
Mason Wheeler
8

Das Dienstprogramm patch.exe aus der Git-Installation funktioniert unter Windows 10.

Installieren Sie Git für Windows und verwenden Sie den "C:\Program Files\Git\usr\bin\patch.exe"Befehl, um einen Patch anzuwenden.

Wenn Hunk #1 FAILED at 1 (different line endings).beim Anwenden eines Patches eine Fehlermeldung wie a in der Ausgabe angezeigt wurde, versuchen Sie, die -l(das ist eine Verknüpfung für --ignore-whitespace) oder die --binarySchalter zur Befehlszeile hinzuzufügen .

Evgeniy Generalov
quelle
Bei dieser Frage handelt es sich hauptsächlich um ein GUI-Tool für Gelegenheitsbenutzer, die mit den typischen Befehlszeilentools nicht vertraut sind. Ihre Antwort wäre nützlicher, wenn Sie zumindest einige vollständige Beispielbefehle als Beispiel angeben würden.
Álvaro González
Arbeitet mit Komponisten in Windows 10.
Ecdani
7

Sie können diesen nativen Win32-Port des Patch-Dienstprogramms verwenden.

Es wird mit einer größeren Auswahl anderer Dienstprogramme geliefert und benötigt im Gegensatz zu Cygwin und ähnlichen keine DLLs oder ähnliches. Wählen Sie einfach eine kleine ausführbare Datei Ihrer Wahl aus und speichern Sie sie, wo immer Sie möchten.

Einfache Verwendung:

patch.exe -i <patchfile>

Holen Sie sich weitere Hilfe:

patch.exe --help
logisch
quelle
4
Unter Windows 7 habe ich Probleme damit: Es öffnet ein neues CMD-Fenster und fordert beim Ausführen der Ausführung zur Eingabe von Administratorrechten auf patch.exe.
Roy Tinker
3
Die ausführbare Patch-Datei finden Sie auch im Git for Windows-Bundle.
Snicksie
6
Wenn beim Ausführen von patch.exe Probleme auftreten, können Sie es in alles umbenennen, was nicht enthalten ist patch. Windows betrachtet alle Exes mit dem Wort patchals verdächtig.
wbond
2

BEARBEITEN: Wenn man sich die bisherigen Antworten ansieht, scheint es, dass Tortoise es nur richtig macht, wenn es sich um eine Datei handelt, die bereits versioniert ist. Das ist hier nicht der Fall. Ich muss in der Lage sein, einen Patch auf eine Datei anzuwenden, die nicht aus einem SVN-Repository stammt. Ich habe gerade versucht, Tortoise zu verwenden, weil ich zufällig weiß, dass SVN Unterschiede verwendet und wissen muss, wie man sie sowohl erstellt als auch anwendet.

Sie können Cygwin installieren und dann den Patch mit dem Befehlszeilen- Patch- Tool anwenden. Siehe auch diese Unix-Manpage , die für Patches gilt .

Brian Clapper
quelle
4
Ja, ich könnte. Ich habe tatsächlich Cygwin. Ich könnte wahrscheinlich auch Ihre Lösung zum Laufen bringen. Ich werde meine Benutzer jedoch nicht dazu zwingen. Sie haben eine Idee, wie viele Windows-Benutzer heutzutage nicht einmal wissen, was eine Befehlszeile ist? : P
Mason Wheeler
2

Es scheint, dass TortoiseSVN (TortoiseMerge) die ZeileIndex: foobar.py in der Diff / Patch-Datei benötigt. Dies ist, was ich tun musste, damit eine Nicht-TortoiseSVN-Patch-Datei mit TortoiseSVNs Rechtsklick- Befehl Patch anwenden funktioniert .

Vor:

--- foobar.py.org   Sat May 08 16:00:56 2010
+++ foobar.py   Sat May 08 15:47:48 2010

Nach dem:

Index: foobar.py
===================================================================
--- foobar.py
+++ foobar.py   (working copy)

Oder wenn Sie die spezifische Revision kennen, von der aus Ihr Mitwirkender gearbeitet hat:

Index: foobar.py
===================================================================
--- foobar.py   (revision 1157)
+++ foobar.py   (working copy)
matt wilkie
quelle
2

Ich benutze MSYS2 von http://www.msys2.org/

Es bietet viele Dienstprogramme wie patch, which, git, tree, und viele mehr.

Führen Sie nach der Installation von MSYS2 einfach den Paketmanager aus, um Folgendes zu installieren patch:

pacman -S patch
Isapir
quelle
Dies ist nur eine komplizierte Methode zum Installieren eines Befehlszeilentools. Ich vermute, Sie lesen nur den Fragentitel und nicht die Frage selbst. :)
Álvaro González
1

Der Patch gibt an, auf welche Datei angewendet werden soll. Die Kopfzeile sollte ungefähr so ​​aussehen (im Editor oder in Ihrem bevorzugten Texteditor anzeigen):

--- Folder/old_file
+++ Folder/new_file

Im Fall eines Subversion-Patches hätten Sie auch Revisionsnummern (da die Dateinamen identisch sind).

Mit dem GNU-Patch können Sie diese Namen überschreiben , aber ich kenne keine GUI-Tools, um dasselbe zu tun. Ich würde mich bei den verschiedenen Diff-Programmen erkundigen - es scheint jedoch nicht, dass WinMerge das Anwenden von Patches unterstützt.

Mark Brackett
quelle
Nein, oben in meinem Patch gibt es nichts Vergleichbares. Wollen Sie damit sagen, dass der Dateiname und der Pfad im Diff selbst enthalten sein müssen? Wer hat sich das ausgedacht? Was sollen Sie tun, wenn Sie ein Diff an jemanden verteilen möchten, der möglicherweise Dinge in anderen Ordnern installiert hat?!?
Mason Wheeler
Der Anfang des Patches beginnt wie folgt: --- / +++ / @@ -6,12 +6,12 @@ Keine Dateinamen oder ähnliches. Wie soll ein eingebauter Pfad funktionieren? Was ist, wenn ich den Patch unter XP erstellt habe und jemand versucht, ihn unter Vista zu verwenden (oder umgekehrt) und der Pfad zum Ordner "Dokumente" anders ist?
Mason Wheeler
1
Die Dateinamen beziehen sich auf das Stammverzeichnis des Repositorys, sodass Unterschiede in der XP / Vista-Ordnerstruktur keine Rolle spielen. Der Grund für Dateinamen im Patch ist, dass die meisten Patches mehrere Dateien betreffen.
David Z
Aha. OK, das macht mehr Sinn. Danke, dass du das geklärt hast, David!
Mason Wheeler
1

Eclipse sollte dazu in der Lage sein, zur TeamSynchronize-Perspektive und dann zu Projekt-> Patch anwenden wechseln

Jose Ospina
quelle
1

Für Java-Projekte habe ich NetBeans verwendet , um Patch-Dateien anzuwenden. Wenn der Java-Code, den Sie patchen, noch kein NetBeans-Projekt ist, erstellen Sie ein Projekt dafür. So erstellen Sie ein neues Projekt:

  • Wählen Sie das Menü Datei -> Neues Projekt
  • Machen Sie es im daraufhin angezeigten Dialogfeld zu einem Java-Anwendungsprojekt . Geben Sie ihm im Dialogfeld einen Namen und klicken Sie auf Finish.
  • Klicken Sie mit der rechten Maustaste auf den Namen Ihres Projekts und wählen Sie im Kontextmenü die Option Eigenschaften
  • Wählen Sie im daraufhin angezeigten Dialogfeld Quellen aus und fügen Sie einen Quellordner hinzu . Navigieren Sie zu Ihrer Java-Quelle.

Nachdem Sie ein Projekt haben, wenden Sie den Patch an:

  • Markieren Sie Ihr Projekt, um es auszuwählen
  • Wählen Sie im Hauptmenü das Menü Extras -> Diff Patch anwenden
  • Navigieren Sie im daraufhin angezeigten Dialogfeld zu Ihrer Patch-Datei, wählen Sie sie aus und klicken Sie auf die Schaltfläche Patch.

Das ist es. Ihr Patch sollte angewendet werden und Sie sollten ein Diff-Fenster sehen, in dem die Änderungen angezeigt werden.

user1984699
quelle
1

Ich verwende bereits BeyondCompare (kommerziell) für Differentiale und verschmilzt, und dieses Tool auch die Fähigkeit hat , erstellen, anzeigen und Patches anwenden.

Zweiundvierzig
quelle
1

Wenn Sie Mercurial verwenden , erfolgt dies über "Importieren". Also in der Kommandozeile den hg importBefehl oder (Sie können den finden--no-commit Option nützlich) oder "Repository" => "Importieren ..." in Hg Workbench.

Beachten Sie, dass diese die Änderungen standardmäßig festschreiben. Sie können diese hg import --no-commitOption vermeiden , wenn Sie die Befehlszeile verwenden oder wenn Sie Hg Workbench verwendet haben. Möglicherweise ist es hilfreich, sie hg rollbacknach dem Zusammenführen auszugeben.

Marc Gravell
quelle
Genau das, wonach ich gesucht habe! Ich habe mich gefragt, wie ich das Commit vermeiden kann.
Keshav
0

Beim Anwenden von Patches mit TortoiseSVN speichere ich den Pfad normalerweise im Stammverzeichnis des ausgecheckten Repositorys. Sie sollten dann in der Lage sein, mit der rechten Maustaste auf den Patch zu klicken, zum TortoiseSVN-Menü zu wechseln und auf ApplyPatch zu klicken. ApplyPatch sollte automatisch herausfinden, auf welcher Ebene in der Verzeichnishierarchie der Patch erstellt wurde.

Ich hatte jedoch in der Vergangenheit Probleme beim Anwenden von Patches, die neue Dateien enthalten oder die das Umbenennen von Dateien beinhalten. Welchen Algorithmus Tortoise auch immer dafür verwendet, scheint diese Szenarien nicht sehr gut zu handhaben. Unicode kann Ihnen ähnliche Probleme bereiten.

Tsellon
quelle
0

Haben Sie zwei Monitore? Ich hatte das gleiche Problem mit TortoiseMerge und stellte fest, dass beim Deaktivieren eines der Monitore das kleine Fenster mit der Dateiliste angezeigt wurde. Hoffe das hilft dir.

Bruno
quelle
0

Wenn die Fehlermeldung "Keine Arbeitskopie" angezeigt wird, wählen Sie im Dialogfeld "TortoiseMerge" ein Verzeichnis aus, bei dem es sich um ein Arbeitsverzeichnis von SVN handelt.

Vinod Dalvi
quelle
0

Ein BusyBox- Port für Windows verfügt sowohl über einen Diff- als auch einen Patch-Befehl, unterstützt jedoch nur ein einheitliches Format.

Miau
quelle
0

Benutz einfach:

patch -p0 < path-file.patch

Denken Sie daran, diesen Befehl nur an dem Ordner auszuführen, an dem Sie den Patch erstellt haben.

Ashish Lohia
quelle