Diff-Tool mit .gitconfig konfigurieren


159

Wie konfiguriere ich Git so, dass ein anderes Tool für die Abweichung von der .gitconfig-Datei verwendet wird?

Ich habe dies in meiner .gitconfig:

[diff]
    tool = git-chdiff #also tried /bin/git-chdiff

Es funktioniert nicht; Es öffnet nur das reguläre Kommandozeilen-Diff. Wenn ich es tue

export GIT_EXTERNAL_DIFF=git-chdiff

Dann git diffwird das externe Diffing-Tool geöffnet (daher weiß ich, dass das Skript für das externe Diff-Tool einwandfrei funktioniert). Habe ich ein Problem mit meiner .gitconfig-Konfiguration für das Diff-Tool?


1
Siehe stackoverflow.com/questions/255202/… (möglicherweise als Duplikat schließen)
Stein G. Strindhaug

Antworten:


140

Git bietet eine Reihe von Difftools an, die "out-of-the-box" vorkonfiguriert sind (kdiff3, kompare, tkdiff, meld, xxdiff, emer, vimdiff, gvimdiff, ecmerge, diffuse, opendiff, p4merge und araxis) und ermöglicht es Ihnen auch um Ihre eigenen zu spezifizieren. Um eines der vorkonfigurierten Difftools (z. B. "vimdiff") zu verwenden, fügen Sie Ihrem Folgendes die folgenden Zeilen hinzu ~/.gitconfig:

[diff]
    tool = vimdiff

Jetzt können Sie "git difftool" ausführen und das Tool Ihrer Wahl verwenden.

Das Angeben eines eigenen Difftools erfordert dagegen etwas mehr Arbeit. Siehe Wie kann ich die Ausgabe von "Git Diff" mit meinem bevorzugten Diff-Tool / Viewer anzeigen?


Der erste Link ist unterbrochen. Es scheint, dass sich die Domain von .comzu geändert hat .org. Ich kann jeetworks.org/software
RBT

1
Was meinen Sie mit einem vorkonfigurierten "Out-of-the-Box" -Difftool? Um ein externes Diff-Tool "winMerge" einzurichten, das nicht in Ihrer Liste enthalten ist, musste ich dieselbe Einstellung vornehmen, die Sie in Ihrem Beitrag erwähnt haben, und alles begann ohne zusätzliche Konfiguration zu funktionieren. Bedeutet das auch, dass git "winMerge" sofort unterstützt, da, soweit ich aus Ihrem Beitrag entnehmen kann, einige zusätzliche Arbeiten / Einstellungen / Konfigurationen erforderlich sind, um ein Diff-Tool einzurichten, das nicht sofort unterstützt wird Box von Git.
RBT

169

Eine zusätzliche Möglichkeit, dies zu tun (über die Befehlszeile):

git config --global diff.tool tkdiff
git config --global merge.tool tkdiff
git config --global --add difftool.prompt false

In den ersten beiden Zeilen werden Difftool und Mergetool so eingestellt, tkdiffdass sie sich nach Ihren Wünschen ändern. In der dritten Zeile wird die nervige Eingabeaufforderung deaktiviert. Wenn Sie git difftoolsie drücken, wird das Difftool automatisch gestartet.


11
Ich tat es, git config --global diff.tool diffmergeaber als ich es tat git diff myfile.txt, gab es mir immer noch das Standard-Unix-Diff
Amphibient

Vielleicht haben Sie eine lokale Konfiguration, die ein anderes Diff-Tool definiert?
Omer Dagan

1
Vielleicht müssen Sie die richtigen Parameter übergeben, um zu diffmerieren: Dieser Link erklärt, wie es für meld gemacht wird: Link: nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy
rptr

5
@amphibient: Versuchen Sie git diff tool myfile.txt, um das Tool zu verwenden.
JBRWilkinson

72

Andere haben eine 99% ige Antwort darauf gegeben, aber es bleibt ein Schritt aus. (Meine Antwort kommt von OS X, daher müssen Sie die Dateipfade entsprechend ändern.)

Sie nehmen folgende Änderungen an Ihrem ~/.gitconfig:

[diff]
    tool = diffmerge
[difftool "diffmerge"]
    cmd = /Applications/Diffmerge.app/Contents/MacOS/diffmerge $LOCAL $REMOTE

Dadurch wird das Diff-Tool repariert. Sie können dies auch beheben, ohne das ~/.gitconfigdirekt zu bearbeiten, indem Sie diese Befehle über das Terminal eingeben:

git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd "/Applications/DiffMerge.appContents/MacOS/diffmerge \$LOCAL \$REMOTE"

Die 1%, die alle anderen nicht erwähnt haben, sind, wenn Sie dies verwenden, können Sie nicht einfach laufen git diff myfile.txt; du musst rennen git difftool myfile.txt.


23
Upvoted für die letzten 1%. Es gibt nichts so zufriedenstellendes wie einen voll gehämmerten Nagel;)
Titou

1
Gibt es eine Möglichkeit, es zum Standardwerkzeug zu machen?
Math0ne

6
Großartig, aber Sie verpassen den Schritt git config --global --add difftool.prompt false. ;)
Suma

36

Hier ist der Teil meiner ~ / .gitconfig, in dem ich Diff- und Merge-Tools konfiguriere. Ich mag Diffmerge von SourceGear. (Ich mag es tatsächlich sehr sehr).

[merge]
        tool = diffmerge
[mergetool "diffmerge"]
        cmd = "diffmerge --merge --result=\"$MERGED\" \"$LOCAL\" \"$(if test -f \"$BASE\"; then echo \"$BASE\"; else echo \"$LOCAL\"; fi)\" \"$REMOTE\""
        trustExitCode = false
[diff]
        tool = diffmerge
[difftool "diffmerge"]
        cmd = diffmerge \"$LOCAL\" \"$REMOTE\"

Sie definieren also ein Werkzeug mit dem Namen "diffmerge" in der [difftool "diffmerge"]Zeile. Dann setze ich das Tool "diffmerge" als Standard in diesem [diff] tool =Abschnitt.

Ich habe hier offensichtlich den Befehl "diffmerge" auf meinem Weg. Andernfalls müsste ich der ausführbaren Datei einen vollständigen Pfad geben.


Ohne dass der Backslash entkommt:diffmerge --merge --result="$MERGED" "$LOCAL" "$(if test -f "$BASE"; then echo "$BASE"; else echo "$LOCAL"; fi)" "$REMOTE"
Tim Lovell-Smith

1
Ich gehe mit dem einfacherendiffmerge --merge --result="$MERGED" "$LOCAL" "$BASE" "$REMOTE"
Tim Lovell-Smith

Und es hat ein praktisches 'sgdm_cygwin.sh'-Skript, mit dem die Windows-Version von Cygwin aus einfach zu verwenden ist.
Thoni56

Sie können dies also einfach tun ln-s <pathtodiffmerge>/sgdm_cygwin.sh /usr/local/bin/diffmergeund können die oben beschriebene Konfiguration verwenden. Sowie diffmergedirekt von der Cygwin-Kommandozeile mit Cygwin-Pfaden.
Thoni56

Es wäre sgdm.exeheutzutage
kzu

22

Wiedergabe meiner Antwort aus diesem Thread, der spezifischer war als das Vergleichstool für Git. Alle Details, die ich geteilt habe, sind für jedes Diff-Tool im Allgemeinen gleichermaßen nützlich. Teilen Sie sie hier:

Der erste Befehl, den wir ausführen, lautet wie folgt:

git config --global diff.tool bc3

Der obige Befehl erstellt den folgenden Eintrag im .gitconfiggefundenen %userprofile%Verzeichnis:

[diff]
    tool = bc3

Dann führen Sie den folgenden Befehl aus (das Ausführen dieses Befehls ist in diesem speziellen Fall redundant und nur in einigen speziellen Fällen erforderlich. Sie werden es in Kürze wissen ):

git config --global difftool.bc3.path "c:/program files/beyond compare 3/bcomp.exe"

Der obige Befehl erstellt den folgenden Eintrag in der .gitconfigDatei:

[difftool "bc3"]
    path = c:/program files/Beyond Compare 3/bcomp.exe

Das, was Sie hier wissen müssen, ist der Schlüssel bc3. Dies ist ein bekannter Git-Schlüssel, der einer bestimmten Version bekannter Vergleichstools entspricht, die auf dem Markt erhältlich sind ( bc3entspricht der dritten Version des Beyond Compare-Tools). Wenn Sie alle vordefinierten Schlüssel sehen möchten, führen Sie einfach den git difftool --tool-helpBefehl auf git bash aus. Es kehrt unter der Liste zurück:

vimdiff
vimdiff2
vimdiff3
araxis
bc
bc3
codecompare
deltawalker
diffmerge
diffuse
ecmerge
emerge
examdiff
gvimdiff
gvimdiff2
gvimdiff3
kdiff3
kompare
meld
opendiff
p4merge
tkdiff
winmerge
xxdiff

Sie können einen der oben genannten Schlüssel verwenden oder einen eigenen benutzerdefinierten Schlüssel definieren. Wenn Sie ein neues Tool (oder eine neu veröffentlichte Version eines bekannten Tools) einrichten möchten, das keinem der oben aufgeführten Schlüssel zugeordnet ist, können Sie es einem der oben aufgeführten Schlüssel oder einem neuen Schlüssel zuordnen Eigener Schlüssel.

Was ist, wenn Sie ein Vergleichstool einrichten müssen?

  • Absolut neu auf dem Markt

ODER

  • Es wurde eine neue Version eines vorhandenen bekannten Tools veröffentlicht, das keinen vordefinierten Schlüsseln in git zugeordnet ist .

Wie in meinem Fall hatte ich Beyond Compare 4 installiert. Beyond Compare ist ein bekanntes Tool für Git, aber die Version 4 ist standardmäßig keinem der vorhandenen Schlüssel zugeordnet. Sie können also einen der folgenden Ansätze verfolgen:

  1. Ich kann das Tool "Beyond Compare 4" einem bereits vorhandenen Schlüssel bc3zuordnen, der der Version "Beyond Compare 3" entspricht. Ich hatte keine vergleichbare Version 3 auf meinem Computer, also war es mir egal. Wenn ich wollte, hätte ich es auch einem der vordefinierten Schlüssel in der obigen Liste zuordnen können, z examdiff.

    Wenn Sie eine bekannte Version von Tools einem geeigneten bereits vorhandenen / bekannten Schlüssel zuordnen, müssen Sie den zweiten Befehl nicht ausführen, da der Installationspfad bereits bekannt ist .

    Wenn ich beispielsweise über Version 3 hinaus auf meiner Box installiert .gitconfighätte, wäre es ausreichend gewesen , die folgende Konfiguration in meiner Datei zu haben, um loszulegen:

    [diff]
    tool = bc3
    

    Wenn Sie jedoch das standardmäßig zugeordnete Tool ändern möchten, wird das pathAttribut am Ende separat erwähnt, damit git den Pfad kennt, von dem aus die Exe Ihres neuen Tools gestartet werden muss. Hier ist der Eintrag, den Foxes Git jenseits von Vergleich 4 starten soll. Beachten Sie den Pfad der Exe:

    [difftool "bc3"]
    path = c:/program files/Beyond Compare 4/bcomp.exe
    
  2. Am saubersten ist es, einen neuen Schlüssel für das neue Vergleichstool oder eine neue Version eines bekannten Tools zu definieren. Wie in meinem Fall habe ich einen neuen Schlüssel definiert, bc4damit er leicht zu merken ist. In einem solchen Fall müssen Sie insgesamt zwei Befehle ausführen, aber Ihr zweiter Befehl legt nicht den Pfad der ausführbaren Datei Ihres neuen Tools fest. Stattdessen müssen Sie das cmdAttribut für Ihr neues Werkzeug wie unten gezeigt festlegen :

    git config --global diff.tool bc4
    
    git config --global difftool.bc4.cmd "\"C:\\Program Files\\Beyond Compare 4\\bcomp.exe\" -s \"\$LOCAL\" -d \"\$REMOTE\""
    

    Wenn Sie die obigen Befehle ausführen, werden die folgenden Einträge in Ihrer .gitconfigDatei erstellt:

    [diff]
    tool = bc4
    [difftool "bc4"]
    cmd = \"C:\\Program Files\\Beyond Compare 4\\bcomp.exe\" -s \"$LOCAL\" -d \"$REMOTE\"
    

Ich würde Ihnen dringend empfehlen, Ansatz 2 zu befolgen, um in Zukunft keine Verwirrung für sich selbst zu verursachen.


16

Das Hinzufügen eines der folgenden Blöcke funktioniert für mich, um KDiff3 für meine Windows- und Linux-Entwicklungsumgebungen zu verwenden. Dies sorgt für ein schönes, konsistentes plattformübergreifendes Diff- und Merge-Tool.

Linux

[difftool "kdiff3"]
    path = /usr/bin/kdiff3
    trustExitCode = false
[difftool]
    prompt = false
[diff]
    tool = kdiff3
[mergetool "kdiff3"]
    path = /usr/bin/kdiff3
    trustExitCode = false
[mergetool]
    keepBackup = false
[merge]
    tool = kdiff3

Windows

[difftool "kdiff3"]
    path = C:/Progra~1/KDiff3/kdiff3.exe
    trustExitCode = false
[difftool]
    prompt = false
[diff]
    tool = kdiff3
[mergetool "kdiff3"]
    path = C:/Progra~1/KDiff3/kdiff3.exe
    trustExitCode = false
[mergetool]
    keepBackup = false
[merge]
    tool = kdiff3

Haben Sie eine Möglichkeit gefunden, eine einzige plattformübergreifende .gitconfig-Datei zu erstellen, in der die richtigen Pfade sowohl für Linux als auch für Windows unter bestimmten Bedingungen angegeben werden?
Jerry Asher

1
Ehrlich gesagt, ich habe überall gewechselt, um zu verschmelzen, und es scheint einfach zu funktionieren.
Moodboom

Gibt es einen Grund, trustExitCode = false zu setzen? Nach meinem Verständnis würde git, wenn false gesetzt ist, den Exit-Code ungleich Null aus Ihrem Tool ignorieren. Wenn Ihr Tool Crush Git fälschlicherweise denkt, dass die Zusammenführung erfolgreich ist. Aber vielleicht gibt es einen Grund, es falsch zu setzen, bitte erklären Sie.
Apollo

Ich glaube trustExitCode = false, Git wird Sie fragen, ob die Zusammenführung erfolgreich war, anstatt sich darauf zu verlassen, ob das Tool zufällig mit einem wahren oder falschen Status beendet wurde.
Moodboom

4

Wenn Sie die Option haben möchten, mehrere Diff-Tools zu verwenden, fügen Sie .gitconfig einen Alias ​​hinzu

[alias]
    kdiff = difftool --tool kdiff3

zur Erwähnung der --toolOption. Vielen Dank
itMaxence


0

In Windows müssen wir den $git difftool --tool-helpBefehl ausführen , um die verschiedenen Optionen zu sehen:

    'git difftool --tool=<tool>' may be set to one of the following:
                    vimdiff
                    vimdiff2
                    vimdiff3

    The following tools are valid, but not currently available:
                    araxis
                    bc
                    bc3
                    codecompare
                    deltawalker
                    diffmerge
                    diffuse
                    ecmerge
                    emerge
                    examdiff
                    gvimdiff
                    gvimdiff2
                    gvimdiff3
                    kdiff3
                    kompare
                    meld
                    opendiff
                    p4merge
                    tkdiff
                    winmerge
                    xxdiff
Some of the tools listed above only work in a windowed
environment. If run in a terminal-only session, they will fail.

und wir können jeden von ihnen (zum Beispiel winmerge) wie hinzufügen

$  git difftool --tool=winmerge

So konfigurieren Sie Notepad ++, um Dateien vor dem Festschreiben anzuzeigen:

 git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"

und using $ git commitöffnet die Commit-Informationen in Notepad ++

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.