Git: Comment configurer KDiff3 comme outil de fusion et outil de diff

219

Récemment, j'utilisais GitExtension 2.46, mais la version Git qui 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 KDiff3 .

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

$ git mergetool

Ensuite, 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)

Des questions:

  • Que dois-je configurer dans le fichier .gitconfig pour que la commande $ git mergetoolouvre l'interface graphique KDiff3 avec les versions LOCAL , REMOTE , BASE et MERGED du fichier en conflit?

  • Comment le configurer pour l'utiliser avec diff-tool?

Joseph
la source
Article connexe - Comment configurer un outil diff dans Git en général .
RBT

Réponses:

374

Ces sites étaient très utiles, presque, mergetool et difftool . J'ai utilisé la configuration globale, mais peut être utilisé par le référentiel sans problème. Il vous suffit d'exécuter les commandes suivantes:

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'utilisation de l' trustExitCodeoption dépend de ce que vous voulez faire lorsque l'outil diff revient. De la documentation :

git-difftool invoque un outil diff individuellement sur chaque fichier. Les erreurs signalées par l'outil diff sont ignorées par défaut. Utilisez --trust-exit-code pour faire git-difftool exit lorsqu'un outil diff invoqué retourne un code de sortie non nul.

Joseph
la source
5
Mais pourquoi voudrais-je que git-difftool ne se ferme pas si kdiff3 échoue?
David Torres
9
Pour que l'outil de reconnaissance soit reconnu par Visual Studio 2015, j'ai dû changer cette ligne git config --global --add diff.guitool kdiff3 en ceci: git config --global --add diff.tool kdiff3
Guillaume Raymond
2
@DavidTorres Probablement parce que les outils Windows mal comportés (qui sortent avec des codes différents de zéro en cas de succès) le ruinent pour tout le monde.
Matthew Flaschen
2
Selon les documents référencés, le paramètre trustExitCode sur false n'est pas nécessaire, car la valeur par défaut est de l'ignorer de toute façon.
matt wilkie
7
AFAIK, --addajoutera une deuxième ou une troisième entrée lorsqu'elle sera invoquée plusieurs fois. C'est difficile à corriger plus tard, car il ne peut pas simplement être supprimé avec --remove. La définition d'une valeur sans --adddevrait être correcte.
Thomas Weller
58

Juste pour étendre la réponse de @ Joseph :

Après avoir appliqué ces commandes, votre .gitconfigfichier global 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
Igor Kustov
la source
@ Alex78191, ma réponse reflète la réponse de Joseph et vous pouvez trouver plus de détails sur ce paramètre.
Igor Kustov
5
Il m'a fallu beaucoup de temps pour bien faire les choses. 2 choses m'ont égaré: (1) Le .gitconfigfichier que je modifiais n'était pas celui utilisé. Voir stackoverflow.com/questions/2114111/… pour identifier celui (s) en cours de chargement. (2) Ne pas mélanger et assortir cmd =et path =dans gitconfig, TL; DR: supprimer cmd et simplement utiliser le chemin
matt wilkie
1
Maintenant sur git bash, utilisez .... git difftool <nomfichier> ou simple git difftool pour exécuter le gui différent kdiff3 que vous venez de définir.
Vivek
32

Pour les utilisateurs Mac

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

(Notez que vous pouvez copier et coller cela et l'exécuter en une seule 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
kris
la source
4
N'utilisez pas --addcar cela peut entraîner 2 entrées de configuration si vous exécutez la commande deux fois. C'est un gâchis de nettoyer cela, car vous ne pouvez plus supprimer une seule entrée. Voir git-scm.com/docs/git-config : "Plusieurs lignes peuvent être ajoutées à une option"
Thomas Weller
11

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

Dans une installation typique Unix tous les exécutables résident dans plusieurs endroits bien connus ( /bin/, /usr/bin/, /usr/local/bin/, etc.), et on peut invoquer un programme en tapant simplement son nom dans un processeur shell (par exemple cmd.exe:)).

Dans Microsoft Windows, les programmes sont généralement installés dans des chemins dédiés, vous ne pouvez donc pas simplement taper kdiff3une cmdsession et lancer KDiff3.

La solution difficile: vous devez indiquer à Git où trouver KDiff3 en spécifiant le chemin complet vers kdiff3.exe. Malheureusement, Git n'aime pas les espaces dans la spécification de 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 s'il é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%. Testez ensuite si vous pouvez l'appeler à partir de cmd.exe par son nom, puis exécutez Git.

user3159253
la source
8

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

De plus, je devais recourir 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.

Martin
la source
6

Pour modifier la réponse de kris , en commençant par Git 2.20 (Q4 2018), la commande appropriée pour seragit mergetool

git config --global merge.guitool kdiff3 

C'est parce que " git mergetool" a appris à prendre l' --[no-]guioption " ", tout comme " git difftool".

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

mergetool: accepter -g/--[no-]guicomme arguments

Conformément à la façon dont difftoolaccepte une -g/--[no-]guioption, faites mergetoolaccepter la même option afin d'utiliser la merge.guitoolvariable pour trouver le mergetool par défaut au lieu de merge.tool.

VonC
la source
5

(En essayant de savoir comment utiliser kdiff3 à partir de WSL git, je me suis retrouvé ici et j'ai obtenu les dernières pièces, donc je vais publier ma solution pour quiconque trébuche également ici tout en essayant de trouver cette réponse)

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

Avec la mise à jour Windows 1903, c'est beaucoup plus facile; utilisez simplement wslpath et il n'est pas nécessaire de partager TMP de Windows vers WSL car le côté Windows a désormais accès au système de fichiers WSL via \ 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

Avant la mise à jour Windows 1903

Étapes pour utiliser kdiff3 installé sur Windows 10 comme outil de diff / fusion pour git dans WSL:

  1. Ajoutez le répertoire d'installation de kdiff3 au chemin Windows.
  2. Ajoutez TMP à la variable d'environnement WSLENV Windows (WSLENV = TMP / up). Le répertoire TMP sera utilisé par git pour les fichiers temporaires, comme les révisions précédentes des fichiers, donc 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 lors de l'appel à 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
Cola
la source