Configurazione dello strumento diff con .gitconfig


159

Come configuro Git per usare uno strumento diverso per diffondere con il file .gitconfig?

Ho questo nel mio .gitconfig:

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

Non funziona; apre semplicemente la normale diff della riga di comando. Quando io faccio

export GIT_EXTERNAL_DIFF=git-chdiff

quindi git diffaprirò lo strumento diff esterno (quindi so che lo script dello strumento diff esterno funziona bene). Ho qualcosa di sbagliato nella mia configurazione .gitconfig per lo strumento diff?



Risposte:


140

Git offre una gamma di difftools preconfigurati "out-of-the-box" (kdiff3, kompare, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, diffuse, opendiff, p4merge e araxis) e ti consente anche per specificare il tuo. Per utilizzare uno dei difftools preconfigurati (ad esempio "vimdiff"), aggiungi le seguenti righe al tuo ~/.gitconfig:

[diff]
    tool = vimdiff

Ora sarai in grado di eseguire "git difftool" e utilizzare il tuo strumento preferito.

Specificare il tuo difftool, d'altra parte, richiede un po 'più di lavoro, vedi Come posso visualizzare l'output' git diff 'con il mio strumento / visualizzatore diff preferito?


Il primo collegamento è interrotto. Sembra che il dominio sia cambiato da .coma .org. Sono in grado di sfogliare jeetworks.org/software
RBT il

1
Cosa intendi con un difftool "preconfigurato" preconfigurato? Per impostare uno strumento diff esterno "winMerge" che non è nella tua lista ho dovuto fare la stessa impostazione che hai menzionato nel tuo post e tutto ha iniziato a funzionare senza alcuna configurazione aggiuntiva. Questo significa che git supporta "winMerge" anche fuori dagli schemi perché per quanto posso capire dal tuo post che richiede un lavoro extra / impostazioni / configurazione per impostare uno strumento diff che non è supportato out of the box di git.
RBT

169

Un altro modo per farlo (dalla riga di comando):

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

Le prime due righe imposteranno difftool e mergetool su tkdiff- cambiarlo in base alle tue preferenze. La terza riga disabilita il fastidioso prompt, quindi ogni volta che git difftoolsi preme avvierà automaticamente il difftool.


11
L'ho fatto, git config --global diff.tool diffmergema quando l'ho fatto mi ha git diff myfile.txtdato ancora il diff predefinito unix
anfibio

Forse hai una configurazione locale che definisce un altro strumento diff?
Omer Dagan,

1
forse è necessario passare i parametri corretti per diffondere: questo link spiega come farlo per la fusione
rptr

5
@amphibient: prova git diff tool myfile.txt per usare lo strumento.
JBR Wilkinson,

72

Altri hanno risposto al 99% su questo, ma resta un passo fuori. (La mia risposta verrà da OS X, quindi dovrai modificare i percorsi dei file di conseguenza.)

Apportate queste modifiche al vostro ~/.gitconfig:

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

Questo risolverà lo strumento diff. Puoi anche risolvere questo problema senza modificare ~/.gitconfigdirettamente immettendo questi comandi dal terminale:

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

L'1% che tutti gli altri non hanno menzionato è quando si utilizza questo non si può semplicemente eseguire git diff myfile.txt; devi correre git difftool myfile.txt.


23
Eseguito l'upgrade per l'ultimo 1%. Non c'è nulla di soddisfacente come un chiodo completamente martellato;)
Titou,

1
C'è un modo per renderlo lo strumento predefinito?
Math0ne,

6
Fantastico, ti manca il passaggio git config --global --add difftool.prompt false, però. ;)
Suma,

36

Ecco la parte del mio ~ / .gitconfig in cui configuro gli strumenti diff e merge. Mi piace diffmerge di SourceGear. (Mi piace moltissimo, di fatto).

[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\"

Quindi, vedi, stai definendo uno strumento chiamato "diffmerge" nella [difftool "diffmerge"]riga. Quindi sto impostando lo strumento "diffmerge" come predefinito nella [diff] tool =sezione.

Ovviamente ho il comando "diffmerge" nel mio percorso, qui. Altrimenti avrei bisogno di dare un percorso completo all'eseguibile.


Senza tutta la barra rovesciata in fuga:diffmerge --merge --result="$MERGED" "$LOCAL" "$(if test -f "$BASE"; then echo "$BASE"; else echo "$LOCAL"; fi)" "$REMOTE"
Tim Lovell-Smith,

1
Vado con il più semplicediffmerge --merge --result="$MERGED" "$LOCAL" "$BASE" "$REMOTE"
Tim Lovell-Smith,

E ha un utile script 'sgdm_cygwin.sh' per rendere la versione di Windows facile da usare da Cygwin.
thoni56,

Quindi puoi solo fare ln-s <pathtodiffmerge>/sgdm_cygwin.sh /usr/local/bin/diffmergee sei pronto per usare la configurazione sopra. Così come diffmergedirettamente dalla riga di comando di Cygwin con percorsi Cygwin.
thoni56,

Sarebbe sgdm.exeoggi
kzu,

22

Riproduzione della mia risposta da questo thread che era più specifico per l'impostazione oltre il confronto come strumento diff per Git. Tutti i dettagli che ho condiviso sono ugualmente utili per qualsiasi strumento diff in generale, quindi condividilo qui:

Il primo comando che eseguiamo è il seguente:

git config --global diff.tool bc3

Il comando precedente crea la voce seguente in .gitconfigtrova nella %userprofile%directory:

[diff]
    tool = bc3

Quindi esegui il comando seguente (L' esecuzione di questo comando è ridondante in questo caso particolare ed è richiesta solo in alcuni casi specializzati. Lo conoscerai tra poco ):

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

Il comando precedente crea la voce di seguito nel .gitconfigfile:

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

La cosa da sapere qui è la chiave bc3. Questa è una chiave ben nota per git corrispondente a una particolare versione di noti strumenti di confronto disponibili sul mercato ( bc3corrisponde alla terza versione dello strumento Beyond Compare). Se vuoi vedere tutte le chiavi predefinite, esegui il git difftool --tool-helpcomando su git bash. Ritorna sotto l'elenco:

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

Puoi usare una qualsiasi delle chiavi sopra o definire una tua chiave personalizzata. Se si desidera impostare del tutto un nuovo strumento (o una versione appena rilasciata di un noto strumento) che non si associa a nessuna delle chiavi sopra elencate, si è liberi di mapparlo su una qualsiasi delle chiavi sopra elencate o su una nuova chiave personalizzata di tua scelta.

E se fosse necessario impostare uno strumento di confronto che sia

  • Assolutamente nuovo nel mercato

O

  • È stata rilasciata una nuova versione di un noto strumento esistente che non è mappato su alcuna chiave predefinita in git ?

Come nel mio caso, avevo installato Beyond Compare. Quindi puoi seguire uno dei seguenti approcci:

  1. Posso mappare oltre lo strumento compare 4 alla chiave già esistente bc3che corrisponde alla versione oltre confronta 3. Non avevo a confronto la versione 3 sul mio computer, quindi non mi importava. Se avessi voluto avrei potuto mapparlo su una qualsiasi delle chiavi predefinite nell'elenco sopra anche ad es examdiff.

    Se si mappano le versioni ben note degli strumenti per appropriarsi della chiave già esistente / ben nota, non è necessario eseguire il secondo comando poiché il percorso di installazione è già noto a git .

    Ad esempio, se avessi installato oltre la versione 3 di confronto sulla mia scatola, avere una configurazione inferiore nel mio .gitconfigfile sarebbe stato sufficiente per iniziare:

    [diff]
    tool = bc3
    

    Ma se vuoi cambiare lo strumento associato predefinito, finisci per menzionare l' pathattributo separatamente in modo che git conosca il percorso da cui deve essere avviato l'ex del tuo nuovo strumento. Ecco la voce che foxes git lancerà al di là del confronto 4 invece. Nota il percorso dell'exe:

    [difftool "bc3"]
    path = c:/program files/Beyond Compare 4/bcomp.exe
    
  2. L'approccio più pulito è definire una nuova chiave del tutto per il nuovo strumento di confronto o una nuova versione di uno strumento ben noto. Come nel mio caso, ho definito una nuova chiave in bc4modo che sia facile da ricordare. In tal caso, è necessario eseguire due comandi in tutto, ma il secondo comando non imposterà il percorso dell'eseguibile del nuovo strumento. Invece devi impostare l' cmdattributo per il tuo nuovo strumento come mostrato di seguito:

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

    L'esecuzione sopra i comandi crea le voci seguenti nel .gitconfigfile:

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

Consiglio vivamente di seguire l'approccio n. 2 per evitare confusioni per se stessi in futuro.


16

L'aggiunta di uno dei blocchi sottostanti mi consente di utilizzare KDiff3 per i miei ambienti di sviluppo Windows e Linux. È uno strumento diffuso e di fusione multipiattaforma coerente e coerente.

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

finestre

[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

Hai trovato un modo per creare un singolo file .gitconfig multipiattaforma che specifica i percorsi giusti in modo condizionale sia per Linux che per Windows?
Jerry Asher,

1
Onestamente, sono passato alla fusione ovunque, e sembra funzionare.
moodboom

C'è un motivo per impostare trustExitCode = false? Da quanto ho capito se è impostato false, git ignorerebbe il codice di uscita diverso da zero dal tuo strumento. Quindi, se il tuo strumento schiaccia git penserebbe erroneamente che l'unione abbia successo. Ma può darsi che ci sia una ragione per impostarlo falso, per favore spiega.
Apollo

Credo che trustExitCode = falsefarà sì che Git ti chieda se l'unione ha avuto successo, piuttosto che fare affidamento sul fatto che lo strumento sia uscito con uno stato vero o falso.
moodboom il

4

Se vuoi avere un'opzione per usare più strumenti diff aggiungi un alias a .gitconfig

[alias]
    kdiff = difftool --tool kdiff3

per menzionare l' --toolopzione. Grazie
itMaxence

0

Fare riferimento a Microsoft vscode-tips-and-tricks . Basta eseguire questi comandi nel tuo terminale:

git config --global merge.tool code

Ma prima devi aggiungere il codecomando al tuo PERCORSO. inserisci qui la descrizione dell'immagine


0

In Windows è necessario eseguire il $git difftool --tool-helpcomando per visualizzare le varie opzioni come:

    '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.

e possiamo aggiungerne uno qualsiasi (ad esempio Winmerge) come

$  git difftool --tool=winmerge

Per configurare notepad ++ per vedere i file prima di eseguire il commit:

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

e l'utilizzo $ git commitaprirà le informazioni di commit in notepad ++

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.