Git: come configurare KDiff3 come strumento di unione e strumento diff


219

Recentemente stavo usando GitExtension 2.46, ma la versione Git che ha lo stesso è 1.9.4.msysgit.2. Volendo usare solo i comandi Git, ho disinstallato GitExtension e installato l'ultima versione disponibile di Git e KDiff3 .

Quando faccio un'unione e ho dei conflitti, eseguo il seguente comando:

$ git mergetool

Quindi ricevo il messaggio:

Lo strumento di unione kdiff3 non è disponibile come 'kdiff3'.

Immagino che debba essere sul percorso di KDiff3.

Ambiente

  • Sistema operativo: Windows 10
  • Git 2.6.1.windows.1
  • KDiff3 0.9.98 (64 bit)

Domande:

  • Cosa devo configurare nel file .gitconfig affinché il comando $ git mergetoolapra la GUI di KDiff3 con le versioni LOCAL , REMOTE , BASE e MERGED del file in conflitto?

  • Come configurarlo per usarlo ha diff-tool?


Risposte:


376

Questi siti sono stati molto utili, quasi, mergetool e difftool . Ho usato la configurazione globale, ma può essere utilizzato dal repository senza problemi. Hai solo bisogno di eseguire i seguenti comandi:

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

L'uso trustExitCodedell'opzione dipende da cosa si desidera fare quando lo strumento diff ritorna. Dalla documentazione :

git-difftool invoca uno strumento diff individualmente su ogni file. Gli errori segnalati dallo strumento diff sono ignorati per impostazione predefinita. Usa --trust-exit-code per uscire da git-difftool quando uno strumento diff invocato restituisce un codice di uscita diverso da zero.


5
Tuttavia, perché dovrei voler git-difftool non uscire se kdiff3 fallisce?
David Torres,

9
Per far riconoscere lo strumento diff da Visual Studio 2015, ho dovuto cambiare questa linea git config --global --add diff.guitool kdiff3 in questo modo: git config --global --add diff.tool kdiff3
Guillaume Raymond,

2
@DavidTorres Probabilmente perché gli strumenti di Windows che si sono comportati male (che escono con codici diversi da zero in caso di successo) lo rovinano per tutti.
Matthew Flaschen,

2
Secondo i documenti di riferimento, l'impostazione di trustExitCode su false non è necessaria, poiché l'impostazione predefinita è ignorarla comunque.
Matt Wilkie,

7
AFAIK, --addaggiungerà una seconda o terza voce quando invocato più volte. È difficile da risolvere in seguito, perché non può essere semplicemente rimosso con --remove. Basta impostare un valore senza --adddovrebbe essere ok.
Thomas Weller,

58

Solo per estendere la risposta di @ Joseph :

Dopo aver applicato questi comandi il tuo .gitconfigfile globale avrà le seguenti righe (per velocizzare il processo puoi semplicemente copiarle nel file) :

[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

@ Alex78191, la mia risposta riflette la risposta di Joseph e lì puoi trovare maggiori dettagli su questa impostazione.
Igor Kustov,

5
Mi ci è voluto molto tempo per farlo bene. 2 cose mi hanno portato fuori strada: (1) Il .gitconfigfile che stavo modificando non era quello in uso. Vedere stackoverflow.com/questions/2114111/… per identificare quelli che vengono caricati. (2) Non mescolare e abbinare cmd =e path =in gitconfig, TL; DR: elimina cmd e usa solo path
matt wilkie,

1
Ora su git bash usa .... git difftool <nomefile> o git difftool semplice per eseguire la diff gui kdiff3 che hai appena impostato.
Vivek,

32

Per utenti Mac

Ecco la risposta accettata da @ Joseph, ma con il percorso predefinito di installazione del Mac di kdiff3

(Nota che puoi copiarlo e incollarlo ed eseguirlo in una volta sola)

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

4
Non utilizzare in --addquanto ciò potrebbe comportare 2 voci di configurazione se si esegue il comando due volte. È un disastro ripulendolo, perché non è più possibile eliminare una singola voce. Vedi git-scm.com/docs/git-config : "È possibile aggiungere più righe a un'opzione"
Thomas Weller

11

Bene, il problema è che Git non riesce a trovare KDiff3 in% PATH%.

In una tipica installazione Unix tutti gli eseguibili risiedono in diverse posizioni note ( /bin/, /usr/bin/, /usr/local/bin/, etc.), e si può invocare un programma semplicemente digitando il suo nome in un processore shell (es cmd.exe:)).

In Microsoft Windows, i programmi sono generalmente installati in percorsi dedicati, quindi non puoi semplicemente digitare kdiff3una cmdsessione e far funzionare KDiff3.

La soluzione difficile: dovresti dire a Git dove trovare KDiff3 specificando il percorso completo per kdiff3.exe. Sfortunatamente, a Git non piacciono gli spazi nella specifica del percorso nella sua configurazione, quindi l'ultima volta che ne ho avuto bisogno, sono finito con quegli antichi "C: \ Progra ~ 1 ... \ kdiff3.exe" come se fosse tardi Anni '90 :)

La soluzione semplice: modifica le impostazioni del tuo computer e includi la directory con kdiff3.exe in% PATH%. Quindi prova se puoi invocarlo da cmd.exe con il suo nome ed esegui Git.


8

Avevo bisogno di aggiungere i parametri della riga di comando o KDiff3 si apriva solo senza file e mi chiedeva base, locale e remoto. Ho usato la versione fornita con TortoiseHg .

Inoltre, dovevo ricorrere ai buoni vecchi nomi di file DOS 8.3.

[merge]
    tool = kdiff3

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

Tuttavia, ora funziona correttamente.


6

Per modificare kris ' risposta , a partire da Git 2.20 (Q4 2018), il comando appropriato per git mergetoolsarà

git config --global merge.guitool kdiff3 

Questo perché " git mergetool" ha imparato a prendere l' --[no-]guiopzione " ", proprio come " git difftool".

Vedi commit c217b93 , commit 57ba181 , commit 063f2bd (24 ott 2018) di Denton Liu ( Denton-L) .
(Unita da Junio ​​C Hamano - gitster- in commit 87c15d1 , 30 ott 2018)

mergetool: accetta -g/--[no-]guicome argomenti

In linea con la modalità di difftoolaccettazione di -g/--[no-]guiun'opzione, mergetoolaccetta la stessa opzione per utilizzare la merge.guitoolvariabile per trovare la fusione predefinita invece di merge.tool.


5

(Quando provo a scoprire come usare kdiff3 da WSL git sono finito qui e ho ottenuto i pezzi finali, quindi posterò la mia soluzione per chiunque anche inciampare qui mentre provo a trovare quella risposta)

Come usare kdiff3 come strumento diff / merge per WSL git

Con Windows Update 1903 è molto più semplice; basta usare wslpath e non è necessario condividere TMP da Windows a WSL poiché il lato Windows ora ha accesso al filesystem WSL tramite \ wsl $:

[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

Prima dell'aggiornamento di Windows 1903

Passaggi per l'utilizzo di kdiff3 installato su Windows 10 come strumento diff / merge per git in WSL:

  1. Aggiungi la directory di installazione di kdiff3 al percorso di Windows.
  2. Aggiungi TMP alla variabile d'ambiente Windows WSLENV (WSLENV = TMP / up). La directory TMP verrà utilizzata da git per i file temporanei, come le revisioni precedenti dei file, quindi il percorso deve trovarsi sul filesystem di Windows affinché funzioni.
  3. Impostare TMPDIR su TMP in .bashrc:
# If TMP is passed via WSLENV then use it as TMPDIR
[[ ! -z "$WSLENV" && ! -z "$TMP" ]] && export TMPDIR=$TMP
  1. Converti unix-path in windows-path quando chiami kdiff3. Esempio del mio .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
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.