120 votes

utiliser Winmerge à l'intérieur de Git pour différencier les fichiers

Existe-t-il un moyen d'utiliser Winmerge à l'intérieur de git pour faire des Diffs ?

0 votes

0 votes

Article connexe - Comment faire configurer un outil de diff dans Git en général .

6voto

robertcollier4 Points 372

Puisque le fil de discussion devient confus et bifurqué, voici des instructions consolidées pour la méthode WinMerge de Directory Listing "--dir-diff" pour msysgit Git Windows.

Étape 1 - Créez un fichier nommé winmerge.sh à un emplacement accessible par votre chemin d'accès (tel que /home/bin/winmerge.sh) avec le contenu suivant.

#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"$PROGRAMFILES/WinMerge/WinMergeU.exe" -r -ub -dl "Remote" -dr "Local" "$1" "$2"

Étape 2 - Tapez les commandes suivantes dans Git Bash pour indiquer à git d'utiliser winmerge.sh comme difftool (ces options sont stockées dans /home/.gitconfig) :

git config --replace --global diff.tool winmerge
git config --replace --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
git config --replace --global difftool.prompt false

Étape 3 - Maintenant vous pouvez tester en tapant la commande suivante dans Git Bash pour lancer votre diff WinMerge :

git difftool --dir-diff

Étape 4 - Pour un accès plus rapide, créez un alias pour cette commande en ajoutant cette ligne au fichier .bashrc dans votre dossier personnel (ou créez le fichier .bashrc avec cette ligne si le fichier n'existe pas déjà) :

alias diffdir='git difftool --dir-diff'

Étape 5 - Maintenant vous pouvez rapidement voir une différence dans WinMerge juste en tapant la commande suivante dans Git Bash

diffdir

0 votes

Il serait utile d'avoir quelqu'un qui explique les significations de $LOCAL et $REMOTE .

3voto

Je vois beaucoup de réponses longues et confuses ici, donc je poste la version simplifiée et minimale qui a fonctionné pour moi en 2021 sur windows10.

 git config diff.tool winmerge
 git config --replace --global difftool.prompt false

2voto

Shawn South Points 375

Je ne comprenais pas pourquoi la solution était présentée sous la forme d'un fichier batch DOS, car mon installation de Git était fournie avec un shell bash. Je n'ai pas non plus réussi à faire fonctionner un contexte DOS à partir de bash, j'ai donc tenté d'adapter ce qui avait été partagé précédemment dans un contexte bash.

Depuis git diff semble exécuter la commande spécifiée une fois pour chaque fichier, j'ai divisé ma solution en deux scripts bash :

Tout d'abord, configurez gitprepdiff.sh pour être le difftool comme mentionné précédemment

#!/bin/sh
#echo ...gitprepdiff.sh
cp -v $1 "$TMP/GitDiff/old/$2"
cp -v $2 "$TMP/GitDiff/new"

J'ai également noté que les résultats de la git configure peuvent être trouvées et modifiées directement dans C:\Users\<username>\.gitconfigure

gitdiff.sh est ensuite exécuté en ligne de commande, là où vous appelleriez normalement git diff

#!/bin/sh
#echo Running gitdiff.sh...

DIFFTEMP=$TMP/GitDiff

echo Deleting and re-creating $DIFFTEMP...
rm -rf $DIFFTEMP;
mkdir $DIFFTEMP;

echo Creating $DIFFTEMP/old...
mkdir $DIFFTEMP/old;

echo Creating $DIFFTEMP/new...
mkdir $DIFFTEMP/new;

git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename";
done

"$PROGRAMFILES\WinMerge\WinMergeU.exe" -r -e -dl "Repository" -dr "Working" $LOCALAPPDATA\\Temp\\1\\GitDiff\\old $LOCALAPPDATA\\Temp\\1\\GitDiff\\new

Il faut aussi noter que, sur mon installation, /tmp (dans bash) mappé à %LOCALAPPDATA%\Temp\1\ (dans Windows), c'est pourquoi j'utilise ce dernier dans mon appel à WinMerge.

2 votes

J'ai changé gitprepdiff.sh pour #!/bin/sh #echo ...gitprepdiff.sh mkdir -vp "$TMP/GitDiff/old/$(dirname $2)" cp -v $1 "$TMP/GitDiff/old/$2" cp -v --parents $2 "$TMP/GitDiff/new" Merci !

0 votes

Il semble ridicule de devoir franchir autant d'obstacles pour que cela fonctionne, mais c'est le cas. Vous obtenez toutes les différences de fichiers en une seule fois comme il se doit. J'ai dû faire les changements mentionnés par @dobau aussi pour gérer correctement les fichiers dans les sous-répertoires.

1voto

Steve Lang Points 299
git config --global diff.tool winmerge
git config --global difftool.winmerge.cmd "\"$PROGRAMFILES\\WinMerge\\WinMergeU.exe\" -u -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\""
git config --global difftool.prompt false

Conformément à la Manuel de ligne de commande de WinMerge : "Les paramètres sont préfixés par un caractère barre oblique ( / ) ou tiret ( - )".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X