webentwicklung-frage-antwort-db.com.de

Wie kann ich WinMerge zu meinem Git Mergetool machen?

Ich versuche, WinMerge mit Git zu integrieren, wie ich es unter Windows 7 Ultimate gesehen habe.

Ich habe die folgenden Schritte befolgt, aber ein Fehler wird weiterhin angezeigt, wenn ich ein git mergetool mit vimdiff verwende.

Erstellt eine Datei mit dem Namen winmerge.sh im Stammverzeichnis von git: C/Programme (x86)/Git/mit: WinMergeU ist der korrekte Speicherort.

#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"C:/Program Files (x86)/WinMerge/WinMergeU.exe" 
git /e /u /dl "Base" /dr "Mine" "$1" "$2"

und benutzte die folgenden Befehle.

git config --global diff.tool winmerge
git config --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
git config --global difftool.Prompt false

Der Fehler wird angezeigt als:

git config option merge.tool set to unknown tool: winmerge
45
Wei Jin

Sie sprechen von merge-Tool, aber Sie (und einige andere Personen mit Antworten) konfigurieren es als diff-Tool.

Um ein Zusammenführungswerkzeug zu konfigurieren, müssen Sie anstelle von merge.tool und mergetooldiff.tool- und difftool-Konfigurationen verwenden.

git config --global merge.tool winmerge
git config --replace --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
git config --global mergetool.Prompt false

Und dann kannst du verwenden

git mergetool

dadurch werden die beiden zu bearbeitenden Dateien geöffnet.

Ein Kudos für @dvdvck, der in den Kommentaren erwähnt, dass in Befehlszeilenparameter Sie eine dritte Datei für die Ergebnisdatei für winmerge (Parameter Ausgabepfad) angeben können.

Der Vollständigkeit halber möchte ich noch erwähnen, dass es auch this Gist gibt, das auf die vollständige Konfiguration von winmerge sowohl als Diff als auch als Merge-Tool abzielt.

57
eis

Git 2.5+ (Q2 2015) enthält Winmerge als bekannten git mergetool !

Wenn sich Winmerge in Ihrem %PATH% befindet, brauchen Sie nur noch einen git config merge.tool winmerge!
(Funktioniert auch für das diff-Tool: git config diff.tool winmerge)

Siehe commit 3e4f237 von David Aguilar (davvid) , 20. Mai 2015.
(Zusammengeführt von Junio ​​C Hamano - gitster - in commit 324a9f4 , 01 Jun 2015)
Geholfen hat: Philip Oakley (PhilipOakley) , Johannes Schindelin (dscho) , Sebastian Schuberth (sschuberth) , SZEDER Gábor (szeder)

Die gesamte Konfiguration wird nun für Sie direkt in Git erledigt, mit mergetools/winmerge :

  • diff-Befehl: "$merge_tool_path" -u -e "$LOCAL" "$REMOTE"
  • zusammenführungsbefehl: "$merge_tool_path" -u -e -dl Local -dr Remote "$LOCAL" "$REMOTE" "$MERGED"

mergetools: Füge winmerge als eingebautes Werkzeug hinzu

Fügen Sie ein winmerge-Scriptlet mit den Befehlen hinzu, die in diesem Thread beschrieben sind, also dass Benutzer winmerge verwenden können, ohne dass .__ ausgeführt werden muss. zusätzliche Konfiguration.

25
VonC

Wenn Sie sich für SourceTree (oder für alle Google-Suchenden mit SourceTree) entscheiden, können Sie WinMerge für das Merge-Tool verwenden, indem Sie das Merge-Tool auf custom setzen und den Diff-Befehl auf WinMergeU.exe zeigen.

C:\Program Files (x86)\WinMerge\WinMergeU.exe

In Argumenten verwenden Sie:

-e -u -dl "Mine" -wr -dr "Theirs" $LOCAL $REMOTE $MERGED

Dies hat zur Folge, dass die linke Seite (mit der Bezeichnung "Mine") bearbeitet werden kann, und es wird die Ausgabedatei sein, wenn Sie in WinMerge speichern. Die rechte Seite (mit der Bezeichnung "Theirs") ist schreibgeschützt (das ist das Argument -wr). Dies ist erforderlich, da WinMerge alle gespeicherten Dateien in die $ MERGED-Datei ausgibt. Wenn also beide Seiten bearbeitet wurden, würde sie die linke Seite ausgeben überschreibe das mit der rechten Seite; Am besten vermeiden Sie diese Art von Verwirrung.

Wenn Sie die Option für die Sicherungsdatei aktiviert lassen, generiert WinMerge eine .bak-Datei. Der Inhalt dieser Datei ist entweder die Originaldatei der linken Seite oder die vorletzte Ausgabedatei, wenn Sie mehrmals gespeichert haben. Sie können dies entweder deaktivieren oder * .bak zu Ihrer .gitignore-Datei hinzufügen.

Git selbst erstellt eine * .orig-Konfliktdatei, NACHDEM der Konflikt gelöst ist, nur für den Fall, dass Sie ihn missbraucht haben. Sie können * .orig erneut zu Ihrer .gitignore-Datei hinzufügen oder diese Funktion deaktivieren. Leider verfügt SourceTree nicht über eine GUI-Option. Starten Sie Ihre Git-Bas oder, wenn Sie sich während der Installation für die richtige PATH-Option entschieden haben, die Windows-Eingabeaufforderung.

git config --global mergetool.keepBackup false

Dadurch wird Git die * .orig-Dateien erstellen. Sie können die Konfigurationsdatei auch direkt bearbeiten, indem Sie die .gitconfig-Datei im Stammverzeichnis Ihres Benutzerverzeichnisses suchen. Wenn Sie wissen, wie VIM verwendet wird, können Sie das Ganze mit diesem Befehl bearbeiten:

git config --global --edit
24
CapinWinky

Hier ist meins (in %userprofile%\.gitconfig oder ~/.gitconfig auf * nix), kein Wrapper (Win 7 Home Pro):

[diff]
    tool = winmerge
[difftool "winmerge"]
    cmd = c:/path/to/winmergeu.exe -e -u -x -wl -wr -dl "base" -dr "mine" \"$LOCAL\" \"$REMOTE\"
13
ellotheth

Das ist einfacher zu tun und hat für mich funktioniert:

git config --global diff.tool winmerge

git config --replace --global difftool.winmerge.cmd "\"C:\path to winmerge\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" $LOCAL $REMOTE"

git config --global difftool.Prompt false
7
gman

Ihr Pfad ist falsch, es sollte "/c/Program Files (x86)/WinMerge/WinMergeU.exe" sein.

Sie arbeiten in einer Shell-Skriptumgebung und nicht in der systemeigenen Eingabeaufforderung von Windows.

4
Thach Mai

So führen Sie WinMerge als Vergleichs- und Zusammenführungswerkzeug für das Git-Plugin von Visual Studio 2017 aus:

Vom Windows-Befehl Eingabeaufforderung: Geben Sie >> git config --global --edit Ein. Dadurch wird die .getconfig-Datei zum Bearbeiten geöffnet.

Bitte aktualisieren Sie mit dem folgenden Befehl:

[mergetool]
   Prompt = false
   keepBackup = false
   keepTemporaries = false
[merge]
   tool = winmerge
   [mergetool "winmerge"]
   name = WinMerge
   trustExitCode = true
   cmd = \"C:\\Program Files (x86)\\WinMerge\\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"
[diff]
   tool = winmerge
   [difftool "winmerge"]
   name = WinMerge
   trustExitCode = true
   cmd = \"C:\\Program Files (x86)\\WinMerge\\WinMergeU.exe\" -u -e $LOCAL $REMOTE
3
Zin Min

Nachdem ich mich über eine Stunde lang damit beschäftigt hatte, installierte ich tortoisegit und bis jetzt gibt es mir genau das, was ich will.

Die Einstellungen von Winmerge für Tortoise git werden in http://thoai-nguyen.blogspot.com.au/2012/03/setup-tortoise-git-and-winmerge.html beschrieben.

1
andersonbd1

Die Eingabe der Einstellungen über die Befehlszeile wurde durch andere Antworten abgedeckt. Das .gitconfig -Datei für die vollständige 3-Wege-Zusammenführung mit WinMerge könnte folgendermaßen konfiguriert werden (dieses Beispiel stammt von Windows):

[merge]
    tool = WinMerge

[mergetool "WinMerge"]
    cmd = \"C:\\Program Files\\WinMerge\\WinMergeU.exe\" -e -u -dl \"Local\" -dm \"Base\" -dr \"Remote\" \"$LOCAL\" \"$BASE\" \"$REMOTE\" -o \"$MERGED\"
    trustExitCode = true
    keepBackup = false

[diff]
    tool = WinMerge

[difftool "WinMerge"]
    cmd = \"C:\\Program Files\\WinMerge\\WinMergeU.exe\" -e -u -dl \"Old $BASE\" -dr \"New $BASE\" \"$LOCAL\" \"$REMOTE\"
    trustExitCode = true

Informationen zur Flagge:

  • / e - Ermöglicht das Schließen von WinMerge durch einmaliges Drücken der Esc-Taste.
  • / u - Verhindert, dass WinMerge die Dateien in der Liste der zuletzt verwendeten Dateien protokolliert.
  • / dl,/dm und/dl - Beschreibungen für den linken, mittleren und rechten Bereich.
  • / o - Die Ausgabedatei. Wenn Sie EIN BELIEBIGES Fenster speichern, wird der Inhalt dieses Fensters in die Ausgabedatei ausgegeben.

trustExitCode = true weist git an, die Ausgabe ohne weitere Eingabeaufforderung zu akzeptieren.

keepBackup = false löscht automatisch das automatisch generierte *.orig Dateien.

Hinweis: Die Variablen $ BASE und $ MERGE enthalten bei Verwendung von difftool einfach den Dateinamen.

1
Isaac Brown

Ursprünglich habe ich @ CapinWinkys Antwort für die Verwendung von WinMerge von SourceTree positiv bewertet. Diese Antwort ist immer noch gültig, aber WinMerge unterstützt jetzt auch eine Drei-Wege-Zusammenführung, für die zusätzliche Parameter erforderlich sind.

Im Dialogfeld "SourceTree-Optionen" habe ich "Benutzerdefiniert" als Zusammenführungswerkzeug ausgewählt und den Befehl wie folgt eingegeben:

C:\Program Files\WinMerge\WinMergeU.exe

und die Argumente als:

-u -fm -wl -wr -dl Remote_RO -dm Local_Merged -dr Base_RO $REMOTE $LOCAL $BASE -o $MERGED

Es scheint nicht mehr notwendig zu sein, die Parameter remote/local/base in Anführungszeichen zu setzen, um Pfade mit Leerzeichen zu berücksichtigen.

Diese Konfiguration dient zur Verwendung des mittleren Bereichs als zusammengeführte Ausgabedatei.

Befehlszeilenreferenz

Ich hatte das Problem, dass sich WinMerge beim Zusammenführen nicht öffnen ließ. Sourcetree startet Git, um das Tool Ihrer Wahl zu öffnen. Wenn Sie die benutzerdefinierte Option von Sourcetree verwenden, wird Ihre Git-Konfigurationsdatei (z. B. C:\Users\Me\.gitconfig) geändert, um ein neues Merge-Tool namens "sourcetree" hinzuzufügen, und der Git-Befehl enthält --tool=sourcetree. Irgendwann war die .gitconfig-Datei nicht mehr korrekt aktualisiert worden und ich hatte zwei 'cmd'-Zeilen in diesem Abschnitt, von denen eine unterbrochen war:

[mergetool "sourcetree"]
    cmd = 'C:/Program Files/WinMerge/WinMergeU.exe' -u -fm -wl -wr -dl Remote_RO -dm Local_Merged -dr Base_RO $REMOTE $LOCAL $BASE -o $MERGED
    trustExitCode = true
    cmd = 'C:/Program '

Durch manuelles Reparieren der .gitconfig-Datei wurde das Problem behoben.

0
Daz

Beispiel:

git config --global --add diff.tool winmerge
git config --replace --global difftool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" $LOCAL $REMOTE"
git config --global difftool.Prompt false
0
zumalifeguard