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?

Ryanzec
quelle

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?

Fredrik Pihl
quelle
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.

Omer Dagan
quelle
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.

tgoza
quelle
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.

Dan Ray
quelle
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.

RBT
quelle
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
Moodboom
quelle
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
Alexander Katz
quelle
zur Erwähnung der --toolOption. Vielen Dank
itMaxence
0

Weitere Informationen finden Sie unter Microsoft Vscode-Tipps und Tricks . Führen Sie einfach die folgenden Befehle in Ihrem Terminal aus:

git config --global merge.tool code

Aber zuerst müssen Sie codeIhrem PATH einen Befehl hinzufügen . Geben Sie hier die Bildbeschreibung ein

sudoz
quelle
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 ++

Goyal Vicky
quelle