Git: So konfigurieren Sie KDiff3 als Merge-Tool und Diff-Tool

218

Vor kurzem habe ich GitExtension 2.46 verwendet, aber die Git-Version mit der gleichen Version ist 1.9.4.msysgit.2. Da ich nur Git-Befehle verwenden wollte, habe ich GitExtension deinstalliert und die neueste verfügbare Version von Git und KDiff3 installiert .

Wenn ich eine Zusammenführung durchführe und Konflikte habe, führe ich den folgenden Befehl aus:

$ git mergetool

Dann erhalte ich die Nachricht:

Das Zusammenführungstool kdiff3 ist nicht als 'kdiff3' verfügbar.

Ich denke, es muss über den KDiff3-Pfad sein.

Umgebung

  • Betriebssystem: Windows 10
  • Git 2.6.1.windows.1
  • KDiff3 0,9,98 (64 Bit)

Fragen:

  • Was muss ich in der .gitconfig-Datei konfigurieren, damit der Befehl $ git mergetooldie KDiff3-GUI mit den Versionen LOCAL , REMOTE , BASE und MERGED der Konfliktdatei öffnet ?

  • Wie konfiguriere ich es für die Verwendung mit Diff-Tool?

Joseph
quelle
In Verbindung stehender Beitrag - So konfigurieren Sie ein Diff-Tool in Git im Allgemeinen .
RBT

Antworten:

373

Diese Seiten waren sehr hilfreich, fast Mergetool und Difftool . Ich habe die globale Konfiguration verwendet, kann aber problemlos vom Repository verwendet werden. Sie müssen nur die folgenden Befehle ausführen:

git config --global merge.tool kdiff3
git config --global mergetool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
git config --global mergetool.kdiff3.trustExitCode false

git config --global diff.guitool kdiff3
git config --global difftool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
git config --global difftool.kdiff3.trustExitCode false

Die Verwendung der trustExitCodeOption hängt davon ab, was Sie tun möchten, wenn das Diff-Tool zurückgegeben wird. Aus der Dokumentation :

git-difftool ruft für jede Datei ein Diff-Tool einzeln auf. Vom Diff-Tool gemeldete Fehler werden standardmäßig ignoriert. Verwenden Sie --trust-exit-code , um git-difftool zu beenden, wenn ein aufgerufenes diff-Tool einen Exit-Code ungleich Null zurückgibt.

Joseph
quelle
5
Warum sollte git-difftool nicht beendet werden sollen, wenn kdiff3 fehlschlägt?
David Torres
9
Damit ich das Diff-Tool von Visual Studio 2015 erkennen konnte, musste ich diese Zeile folgendermaßen ändern git config --global --add diff.guitool kdiff3 : git config --global --add diff.tool kdiff3
Guillaume Raymond
2
@DavidTorres Wahrscheinlich, weil schlecht benommene Windows-Tools (die bei Erfolg mit Codes ungleich Null beendet werden) es für alle ruinieren.
Matthew Flaschen
2
Gemäß den referenzierten Dokumenten ist es nicht erforderlich, trustExitCode auf false zu setzen, da es standardmäßig sowieso ignoriert wird.
Matt Wilkie
7
AFAIK --addfügt bei mehrmaligem Aufruf einen zweiten oder dritten Eintrag hinzu. Das ist später schwer zu beheben, da es nicht einfach mit entfernt werden kann --remove. Nur einen Wert ohne --addeinzustellen, sollte in Ordnung sein.
Thomas Weller
58

Nur um die Antwort von @ Joseph zu erweitern :

Nach dem Anwenden dieser Befehle enthält Ihre globale .gitconfigDatei die folgenden Zeilen (um den Vorgang zu beschleunigen, können Sie sie einfach in die Datei kopieren) :

[merge]
    tool = kdiff3
[mergetool "kdiff3"]
    path = C:/Program Files/KDiff3/kdiff3.exe
    trustExitCode = false
[diff]
    guitool = kdiff3
[difftool "kdiff3"]
    path = C:/Program Files/KDiff3/kdiff3.exe
    trustExitCode = false
Igor Kustov
quelle
@ Alex78191, meine Antwort spiegelt die Antwort von Joseph wider und dort finden Sie weitere Details zu dieser Einstellung.
Igor Kustov
5
Ich habe lange gebraucht, um das richtig zu machen. 2 Dinge haben mich in die Irre geführt: (1) Die .gitconfigDatei, die ich bearbeitet habe, wurde nicht verwendet. Unter stackoverflow.com/questions/2114111/… finden Sie Informationen zu den geladenen. (2) Nicht mischen und abgleichen cmd =und path =in gitconfig, TL; DR: cmd löschen und einfach path
matt wilkie
1
Verwenden Sie jetzt bei git bash .... git difftool <Dateiname> oder einfaches git difftool, um das soeben eingestellte diff gui kdiff3 auszuführen.
Vivek
32

Für Mac-Benutzer

Hier ist die akzeptierte Antwort von @ Joseph, jedoch mit dem Standard-Mac-Installationspfad von kdiff3

(Beachten Sie, dass Sie dies kopieren und einfügen und auf einmal ausführen können.)

git config --global --add merge.tool kdiff3 
git config --global --add mergetool.kdiff3.path  "/Applications/kdiff3.app/Contents/MacOS/kdiff3" 
git config --global --add mergetool.kdiff3.trustExitCode false

git config --global --add diff.guitool kdiff3
git config --global --add difftool.kdiff3.path "/Applications/kdiff3.app/Contents/MacOS/kdiff3"
git config --global --add difftool.kdiff3.trustExitCode false
kris
quelle
4
Nicht verwenden, --addda dies zu 2 Konfigurationseinträgen führen kann, wenn Sie den Befehl zweimal ausführen. Es ist ein Chaos, das aufzuräumen, weil Sie keinen einzigen Eintrag mehr löschen können. Siehe git-scm.com/docs/git-config : " Einer Option können mehrere Zeilen hinzugefügt werden"
Thomas Weller
11

Das Problem ist, dass Git KDiff3 im% PATH% nicht finden kann.

In einer typischen Installation Unix alle ausführbaren Dateien befinden sich in einer Reihe von bekannten Orten ( /bin/, /usr/bin/, /usr/local/bin/, etc.), und man kann , indem man einfach seinen Namen in einem Shell - Prozessor (zB ein Programm aufrufen cmd.exe:)).

In Microsoft Windows werden Programme normalerweise in dedizierten Pfaden installiert, sodass Sie nicht einfach kdiff3eine cmdSitzung eingeben und KDiff3 zum Laufen bringen können.

Die schwierige Lösung: Sie sollten Git mitteilen, wo sich KDiff3 befindet, indem Sie den vollständigen Pfad zu angeben kdiff3.exe. Leider mag Git keine Leerzeichen in der Pfadspezifikation in seiner Konfiguration. Als ich dies das letzte Mal brauchte, hatte ich das alte "C: \ Progra ~ 1 ... \ kdiff3.exe", als wäre es spät 1990er Jahre :)

Die einfache Lösung: Bearbeiten Sie Ihre Computereinstellungen und fügen Sie das Verzeichnis mit kdiff3.exe in% PATH% ein. Testen Sie dann, ob Sie es von cmd.exe mit seinem Namen aufrufen können, und führen Sie dann Git aus.

user3159253
quelle
8

Ich musste die Befehlszeilenparameter hinzufügen, sonst würde KDiff3 nur ohne Dateien geöffnet und mich zur Eingabe von base, local und remote auffordern. Ich habe die mit TortoiseHg gelieferte Version verwendet .

Außerdem musste ich auf die guten alten DOS 8.3-Dateinamen zurückgreifen.

[merge]
    tool = kdiff3

[mergetool "kdiff3"]
    cmd = /c/Progra~1/TortoiseHg/lib/kdiff3.exe $BASE $LOCAL $REMOTE -o $MERGED

Es funktioniert jedoch jetzt korrekt.

Martin
quelle
6

Zu ändern kris ' Antwort , mit Git 2,20 (Q4 2018) beginnen, den richtigen Befehl für git mergetoolsein wird

git config --global merge.guitool kdiff3 

Das liegt daran, dass " git mergetool" gelernt hat, die --[no-]guiOption " " zu wählen, genau wie " git difftool".

Siehe Commit c217b93 , Commit 57ba181 , Commit 063f2bd (24. Oktober 2018) von Denton Liu ( Denton-L) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 87c15d1 , 30. Oktober 2018)

mergetool: -g/--[no-]guials Argumente akzeptieren

In Übereinstimmung mit der Annahme difftooleiner -g/--[no-]guiOption müssen Sie mergetooldieselbe Option akzeptieren , um die merge.guitoolVariable zu verwenden, um das Standard-Mergetool anstelle von zu finden merge.tool.

VonC
quelle
5

(Als ich versuchte herauszufinden, wie man kdiff3 von WSL git benutzt, bin ich hier gelandet und habe die letzten Teile bekommen, also werde ich meine Lösung für alle anderen veröffentlichen, die auch hier stolpern, während ich versuche, diese Antwort zu finden.)

Verwendung von kdiff3 als Diff / Merge-Tool für WSL-Git

Mit Windows Update 1903 ist es viel einfacher; Verwenden Sie einfach wslpath und Sie müssen TMP nicht von Windows für WSL freigeben, da die Windows-Seite jetzt über \ wsl $ auf das WSL-Dateisystem zugreifen kann:

[merge]
    renormalize = true
    guitool = kdiff3
[diff]
    tool = kdiff3
[difftool]
    prompt = false
[difftool "kdiff3"]
    # Unix style paths must be converted to windows path style
    cmd = kdiff3.exe \"`wslpath -w $LOCAL`\" \"`wslpath -w $REMOTE`\"
    trustExitCode = false
[mergetool]
    keepBackup = false
    prompt = false
[mergetool "kdiff3"]
    path = kdiff3.exe
    trustExitCode = false

Vor dem Windows Update 1903

Schritte zur Verwendung von kdiff3 unter Windows 10 als Diff / Merge-Tool für Git in WSL:

  1. Fügen Sie das Installationsverzeichnis kdiff3 zum Windows-Pfad hinzu.
  2. Fügen Sie der Windows-Umgebungsvariablen WSLENV TMP hinzu (WSLENV = TMP / up). Das TMP-Verzeichnis wird von git für temporäre Dateien verwendet, wie bei früheren Revisionen von Dateien. Daher muss sich der Pfad im Windows-Dateisystem befinden, damit dies funktioniert.
  3. Setzen Sie TMPDIR in .bashrc auf TMP:
# If TMP is passed via WSLENV then use it as TMPDIR
[[ ! -z "$WSLENV" && ! -z "$TMP" ]] && export TMPDIR=$TMP
  1. Konvertieren Sie den Unix-Pfad in den Windows-Pfad, wenn Sie kdiff3 aufrufen. Beispiel meiner .gitconfig:
[merge]
    renormalize = true
    guitool = kdiff3
[diff]
    tool = kdiff3
[difftool]
    prompt = false
[difftool "kdiff3"]
    #path = kdiff3.exe
    # Unix style paths must be converted to windows path style by changing '/mnt/c/' or '/c/' to 'c:/'
    cmd = kdiff3.exe \"`echo $LOCAL | sed 's_^\\(/mnt\\)\\?/\\([a-z]\\)/_\\2:/_'`\" \"`echo $REMOTE | sed 's_^\\(/mnt\\)\\?/\\([a-z]\\)/_\\2:/_'`\"
    trustExitCode = false
[mergetool]
    keepBackup = false
    prompt = false
[mergetool "kdiff3"]
    path = kdiff3.exe
    trustExitCode = false
Cola
quelle