web-dev-qa-db-fra.com

Git: Comment configurer KDiff3 en tant qu'outil de fusion et outil de comparaison

J'utilisais récemment GitExtension 2.46, mais la version de Git qui en a le même est 1.9.4.msysgit.2. Désireux d'utiliser uniquement les commandes Git, j'ai désinstallé GitExtension et installé la dernière version disponible de Git et KDiff .

Lorsque je fais une fusion et que j'ai des conflits, j'exécute la commande suivante:

$ git mergetool

Puis je reçois le message:

L'outil de fusion kdiff3 n'est pas disponible en tant que 'kdiff3'.

Je suppose que ce doit être par le chemin KDiff3.

Environnement

  • Système d'exploitation: Windows 10
  • Git 2.6.1.Windows.1
  • KDiff3 0.9.98 (64 bits)

Questions:

  • Qu'est-ce que je dois configurer dans le fichier .gitconfig pour la commande $ git mergetool afin d'ouvrir l'interface graphique de KDiff3 avec les versions LOCAL, DISTANT, BASE et FUSIONNÉ d'un fichier en conflit?

  • Comment le configurer pour l'utiliser a-t-il diff-tool?

187
Joseph

Ces sites ont été très utiles, presque, mergetool et difftool . J'ai utilisé la configuration globale, mais peut être utilisé par le référentiel sans problèmes. Vous devez juste exécuter les commandes suivantes:

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

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

L'utilisation de l'option trustExitCode dépend de ce que vous voulez faire lorsque l'outil diff est renvoyé. De documentation :

git-difftool appelle un outil de différenciation individuellement sur chaque fichier. Les erreurs signalées par l'outil diff sont ignorées par défaut. Utilisez - trust-exit-code pour rendre git-difftool exit lorsqu'un outil de diff appelé est renvoyé un code de sortie non nul.

325
Joseph

Juste pour prolonger la réponse de @ Joseph :

Après avoir appliqué ces commandes, votre fichier global .gitconfig aura les lignes suivantes (pour accélérer le processus, vous pouvez simplement les copier dans le fichier) :

[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
49
Igor Kustov

Pour les utilisateurs de Mac

Voici la réponse acceptée par @ Joseph, mais avec l'emplacement du chemin d'installation Mac par défaut, kdiff3

(Notez que vous pouvez copier et coller ceci et l'exécuter en une fois)

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
22
kris

Eh bien, le problème est que Git ne peut pas trouver KDiff3 dans le% PATH%.

Dans une installation Unix typique, tous les exécutables se trouvent dans plusieurs emplacements bien connus (/bin/, /usr/bin/, /usr/local/bin/, etc.), et on peut appeler un programme en tapant simplement son nom dans un champ. Processeur Shell (par exemple, cmd.exe :)).

Dans Microsoft Windows, les programmes sont généralement installés dans des chemins d'accès dédiés; vous ne pouvez donc pas simplement taper kdiff3 dans une session cmd et exécuter KDiff3.

La solution difficile: vous devez dire à Git où trouver KDiff3 en spécifiant le chemin complet de kdiff3.exe. Malheureusement, Git n'aime pas les espaces dans la spécification du chemin dans sa configuration, donc la dernière fois que j'en ai eu besoin, je me suis retrouvé avec ces anciens "C:\Progra ~ 1 ...\kdiff3.exe" comme si c'était tard. Années 1990 :)

La solution simple: modifiez les paramètres de votre ordinateur et incluez le répertoire avec kdiff3.exe dans% PATH%. Puis testez si vous pouvez l'invoquer à partir de cmd.exe par son nom, puis exécutez Git.

10
user3159253

Pour modifier kris ' réponse , à partir de Git 2.20 (Q4 2018), la commande appropriée pour git mergetool sera

git config --global merge.guitool kdiff3 

En effet, "git mergetool" a appris à utiliser l'option "--[no-]gui", tout comme "git difftool".

Voir commit c217b9 , commit 57ba181 , commit 063f2bd (24 oct 2018) par Denton Liu (Denton-L) .
(Fusionné par Junio ​​C Hamano - gitster - dans commit 87c15d1 , 30 octobre 2018)

mergetool: accepte -g/--[no-]gui comme arguments

Conformément à la manière dont difftool accepte une option -g/--[no-]gui, assurez-vous que mergetool acceptez la même option afin de pouvoir utiliser la variable merge.guitool afin de trouver l'outil de fusion par défaut au lieu de merge.tool.

5
VonC

J'avais besoin d'ajouter les paramètres de ligne de commande ou KDiff3 ne s'ouvrirait que sans fichiers et Me demander de base, local et distant. J'ai utilisé la version fournie avec TortoiseHg .

De plus, je devais avoir recours aux bons vieux noms de fichiers DOS 8.3.

[merge]
    tool = kdiff3

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

Cependant, cela fonctionne correctement maintenant.

4
martin

(En essayant de savoir comment utiliser kdiff3 de WSL git, je me suis retrouvé ici et j'ai eu les derniers éléments, alors je vais poster ma solution pour tous ceux qui trébuchent aussi en essayant de trouver la réponse.)

Comment utiliser kdiff3 comme outil de différenciation/fusion pour WSL git

Étapes à suivre pour utiliser kdiff3 installé sur Windows 10 en tant qu'outil de comparaison/fusion pour git dans WSL:

  1. Ajoutez le répertoire d'installation kdiff3 au chemin Windows.
  2. Ajoutez TMP à la variable d’environnement Windows WSLENV (WSLENV = TMP/up). Le répertoire TMP sera utilisé par git pour les fichiers temporaires, comme les révisions précédentes de fichiers, de sorte que le chemin doit être sur le système de fichiers Windows pour que cela fonctionne.
  3. Définissez TMPDIR sur TMP dans .bashrc:
# If TMP is passed via WSLENV then use it as TMPDIR
[[ ! -z "$WSLENV" && ! -z "$TMP" ]] && export TMPDIR=$TMP
  1. Convertissez unix-path en windows-path lorsque vous appelez kdiff3. Exemple de mon .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
2
cola