web-dev-qa-db-fra.com

Pourquoi «git diff» n'appelle-t-il pas l'outil de diff externe?

Dans mon référentiel, si je tape

$ git diff some-file

ou

$ git difftool some-file

J'obtiens l'affichage de différence dans le terminal. Je pense que cela ne devrait pas se produire, car j'ai mis en place un outil de diff externe, comme le montre la sortie de git config -l:

$ git config -l
user.name=blah blah
user.email=blah blah
http.sslverify=true
diff.external=/home/daniel/bin/git-diff  <--This is the important line
Push.default=simple
core.filemode=false
core.editor=gedit
alias.tree=log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset) %C(auto)%d%C(reset)
         %C(black)[%cr]%C(reset)  %x09%C(black)%an: %s %C(reset)'
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
remote.Origin.url=https://daniel@skynet/git/pyle.git
remote.Origin.fetch=+refs/heads/*:refs/remotes/Origin/*
branch.master.remote=Origin
branch.master.merge=refs/heads/master
branch.daniel.remote=Origin
branch.daniel.merge=refs/heads/daniel

Le fichier git-diff référencé dans le diff.external la ligne ressemble à ceci

#!/bin/bash

meld $2 $5

Pourquoi git diff invoquer la fusion?

J'obtiens le même comportement si je configure les choses pour que git config -l a la ligne suivante:

diff.tool = meld

ou

diff.external = usr/bin/meld

Remarque : les autres référentiels sur ma machine n'ont pas ce problème.

Connexes, mais pas équivalentes, SO questions:

  1. Quelle est la différence entre git diff et git difftool?
  2. Impossible de faire git diff utiliser diff.external pour l'outil de diff externe
29
DanielSank

J'obtiens l'affichage de différence dans le terminal. Si cela ne devrait pas se produire, car j'ai mis en place un outil de diff externe

Oui, il devrait: diff.external is pour "affichage diff dans le terminal".

(de git config page de manuel )

diff.external

Si cette variable de configuration est définie, la génération de diff n'est pas effectuée en utilisant la machinerie de diff interne, mais en utilisant la commande donnée .
Peut être remplacé par le GIT_EXTERNAL_DIFF variable d'environnement.
La commande est appelée avec des paramètres comme décrit sous "git Diffs" dans git (1). Remarque: si vous souhaitez utiliser un programme de diff externe uniquement sur un sous-ensemble de vos fichiers, vous pouvez utiliser gitattributes (5) à la place.

La question que vous liez explique pourquoi meld ne pourrait pas jouer le rôle de "diff externe".

Visualiser un diff visuellement avec un autre outil se fait avec:

git difftool --dir-diff shaOfHisCheckIn^!
git difftool --tool=meld --dir-diff shaOfHisCheckIn^!
git difftool -t meld -d shaOfHisCheckIn^!

meld peut être configuré sous Windows comme un outil différent: voir " Git Diff et Meld sous Windows ".


Si vous vouliez configurer meld pour git diff, vous pourriez (sur Ubuntu) utiliser le diff.external, mais avec un script wrapper :

créer un fichier appelé git-diff.sh, en utilisant le contenu suivant:

#!/bin/bash
meld "$2" "$5" > /dev/null 2>&1

Enregistrez-le dans un emplacement tel que /usr/local/bin, en lui donnant des droits exécutables:

$ Sudo mv git-diff.sh /usr/local/bin/
$ Sudo chmod +x /usr/local/bin/git-diff.sh

La dernière étape consiste à ouvrir votre $HOME/.gitconfig fichier et ajoutez les quelques lignes suivantes:

[diff]
        external = /usr/local/bin/git-diff.sh

La prochaine fois que vous taperez git diff dans un projet Git avec des modifications, Meld sera lancé vous montrant un visualiseur de différences de volet divisé.
Notez que vous devez fermer l'instance ouverte de fusion avant d'ouvrir le visualiseur de différences suivant.

16
VonC

Il paraît que git diff (au moins, à partir de git version 1.7.12.4) n'exécutera rien d'autre que le diff interne à la console uniquement sur un fichier qui est à l'état "les deux modifiés". git mergetool fonctionne sur ces fichiers, cependant.

14
Trebor Rude

En général, je veux simplement vérifier si les modifications que je m'apprête à enregistrer sont correctes. J'ai donc suivi la procédure suggérée ici (similaire à celle notée par VonC). Cependant, l'exécution de git difftool n'a toujours pas ouvert la fusion. J'ai ensuite créé un alias:

alias git-diff='git difftool $(git rev-parse HEAD)'

Enregistrez-le dans votre .bashrc ou .zshrc ou dans la configuration correspondante pour votre Shell. Cela compare essentiellement l'état de la branche avec le commit précédent sur la branche.

Fait une git-diff pour voir les modifications fichier par fichier ou git-diff --dir pour voir toutes les modifications dans une vue de répertoire.

2
Lodewyk