utiliser Winmerge dans Git pour déposer diff

Est-il possible d’utiliser Winmerge à l’intérieur de git pour faire des Diffs?

    Mise à jour juin 2015, 6 ans plus tard:

    Comme détaillé dans ” git mergetool winmerge “, un simple git config diff.tool winmerge sera suffisant.

    Git 2.5+ (Q2, 2015) connaît désormais Winmerge en tant qu’outil de diff ou de fusion!


    Réponse originale (2009-2012)

    (msysgit, 1.6.5, session DOS)

    La première partie (en utilisant winmerge) est décrite dans ” Comment afficher la sortie ‘git diff’ avec le programme de diff visuel? ”

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

    Avec winmerge.sh stocké dans une partie du répertoire de votre PATH :

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

    (voir les options de la ligne de commande WinMerge )

     git difftool 

    va maintenant lancer WinMerge.
    Si vous voulez que git diff lance WinMerge, il suffit de définir:

     set GIT_EXTERNAL_DIFF=winmerge.sh 

    Mais la véritable valeur ajoutée provient de la possibilité d’utiliser le même outil diff pour présenter toutes les différences d’un lot au lieu de les présenter de manière séquentielle, ce qui vous oblige à fermer les fenêtres de l’outil de diff par fichier.

    Mise à jour de juin 2012 (2 ans et demi plus tard):

    La comparaison des répertoires au lieu de fichiers par fichiers sera bientôt disponible:
    Voir [ANNONCE] Git 1.7.11.rc1 :

    git difftool ” a appris l’ --dir-diff--dir-diff ” pour générer des outils de comparaison externes capables de comparer deux hiérarchies de répertoires à la fois après avoir rempli deux répertoires temporaires, au lieu d’exécuter une instance de l’outil externe par paire de fichiers .

    Pour plus de détails, reportez-vous à la section ” difftool correctifs difftool apprendre à gérer les différences de répertoires ” et à la réponse ” Comparaison de répertoires des twigs Git “.


    Script original difftool par répertoires (décembre 2009)

    Comme Seba Illingworth le mentionne dans sa réponse , un script git-diffall.sh (également placé dans le chemin) peut faire exactement cela:

     #!/bin/sh git diff --name-only "$@" | while read filename; do git difftool "$@" --no-prompt "$filename" & done 

    Mais cela ne fonctionne qu’en ouvrant n windows pour n fichiers (si vous essayez d’utiliser l’option -s de WinMerge, cela ne fonctionnera pas car les fichiers temporaires seront supprimés trop tôt par difftool)


    C’est pourquoi j’aime l’approche de GitDiff.bat – la différence de puissance avec GI , qui vous permet de revoir la liste des fichiers avec une différence, avant d’en sélectionner un pour examiner ses différences internes.
    Je l’ai modifié pour utiliser uniquement les commandes DOS

     @echo off setlocal if "%1" == "-?" ( echo GitDiff - enables diffing of file lists, instead of having to serially echo diff files without being able to go back to a previous file. echo Command-line options are passed through to git diff. echo If GIT_FOLDER_DIFF is set, it is used to diff the file lists. Default is windff. goto END ) if "%GIT_DIFF_COPY_FILES%"=="" ( rd /s /q %TEMP%\GitDiff mkdir %TEMP%\GitDiff mkdir %TEMP%\GitDiff\old mkdir %TEMP%\GitDiff\new REM This batch file will be called by git diff. This env var indicates whether it is REM being called directly, or inside git diff set GIT_DIFF_COPY_FILES=1 set GIT_DIFF_OLD_FILES=%TEMP%\GitDiff\old set GIT_DIFF_NEW_FILES=%TEMP%\GitDiff\new set GIT_EXTERNAL_DIFF=%~dp0\GitDiff.bat echo Please wait and press q when you see "(END)" printed in reverse color... call git diff %* if defined GIT_FOLDER_DIFF ( REM This command using GIT_FOLDER_DIFF just does not work for some reason. %GIT_FOLDER_DIFF% %TEMP%\GitDiff\old %TEMP%\GitDiff\new goto END ) if exist "%ProgramFiles%\Beyond Compare 2\BC2.exe" ( set GIT_FOLDER_DIFF="%ProgramFiles%\Beyond Compare 2\BC2.exe" "%ProgramFiles%\Beyond Compare 2\BC2.exe" %TEMP%\GitDiff\old %TEMP%\GitDiff\new goto END ) "%ProgramFiles(x86)%\WinMerge\WinMergeU.exe" -r -e -dl "Local" -dr "Remote" %TEMP%\GitDiff\old %TEMP%\GitDiff\new goto END ) REM diff is called by git with 7 parameters: REM path old-file old-hex old-mode new-file new-hex new-mode copy %TEMP%\%~nx2 %GIT_DIFF_OLD_FILES%\%1 copy %5 %GIT_DIFF_NEW_FILES% :END 

    Ce n’est pas assez robuste pour gérer des fichiers avec les mêmes noms dans différents répertoires, mais cela vous donne une idée générale de ce qui est possible:
    Ici, un seul WinMerge s’ouvre, avec la liste des fichiers présentant des différences internes. Vous pouvez cliquer sur ceux que vous souhaitez examiner, puis un simple ESC ferme la session WinMerge-diff .

    J’ai eu du mal à utiliser la première partie en 2 endroits et je l’ai réparée comme suit

    1. La deuxième commande pour configurer winmerge.cmd nécessitait une barre oblique supplémentaire sur cmdline (avant $ LOCAL et $ REMOTE), sinon cygwin remplaçait la variable dans cmdline.

       C:\myGitRepo>git config --replace --global difftool.winmerge.cmd "winmerge.sh \"\$LOCAL\" \"\$REMOTE\"" 
    2. changé le fichier winmerge.sh en (sans cela, obtenait une erreur non valide)

       #!/bin/sh echo Launching WinMergeU.exe: "$(cygpath -aw "$1")" "$(cygpath -aw "$2")" "$PROGRAMFILES/WinMerge/WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$(cygpath -aw "$1")" "$(cygpath -aw "$2")" 

    Étant donné que le thread devient confus et bifurqué, voici les instructions consolidées pour la méthode d’annuaire “–dir-diff” de WinMerge pour msysgit Git Windows.

    Étape 1 – Créez un fichier nommé winmerge.sh à un endroit accessible à votre chemin (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 démarrer votre diff WinMerge:

     git difftool --dir-diff 

    Étape 4 – Pour un access plus rapide, créez un alias pour cette commande en ajoutant cette ligne à .bashrc dans votre dossier personnel (ou créez un 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 un diff dans WinMerge en tapant simplement la commande suivante dans Git Bash

     diffdir 

    J’ai un script qui définira les outils Diff et Merge dans la configuration de Git avec les parameters appropriés qui n’exigent pas l’existence d’un fichier .sh distinct. Cela semble fonctionner correctement pour moi.

     git config --global diff.tool winmerge git config --global difftool.prompt false git config --global difftool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\"" git config --global merge.tool winmerge git config --global mergetool.prompt false git config --global mergetool.winmerge.trustExitCode true git config --global mergetool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\" \"\$BASE\" \"\$MERGED\"" 

    Remarque : l’intégralité de la partie .cmd est citée afin que les parameters soient correctement répertoriés dans le fichier .gitconfig

    Je ne comprenais pas pourquoi la solution était présentée en tant que fichier de commandes DOS, car mon installation Git était fournie avec un shell bash. Je n’ai pas non plus réussi à obtenir un contexte DOS à partir de bash, alors j’ai essayé d’adapter ce qui était précédemment partagé dans un contexte bash.

    Comme git diff semble exécuter la commande spécifiée une fois pour chaque fichier, je divise ma solution en deux scripts bash:

    Tout d’abord, configurez gitprepdiff.sh pour qu’il soit le difftool 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 des commandes git configure peuvent être trouvés et modifiés directement dans C:\Users\\.gitconfigure

    gitdiff.sh est alors exécuté sur la ligne de commande 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 convient également de noter que, sur mon installation, /tmp (en bash) a été mappé sur %LOCALAPPDATA%\Temp\1\ (sous Windows), c’est pourquoi j’utilise ce dernier dans mon appel à WinMerge.

    Sur Windows, vous pouvez le faire de cette façon:

    1) Ouvrez le fichier .gitconfig. Il se trouve dans votre répertoire personnel: c: \ users \ username.gitconfig

    2) Ajoutez les lignes ci-dessous. Faites attention aux guillemets simples entourant le chemin vers winmerge:

     [diff] tool = winmerge [difftool "winmerge"] cmd = "'C:/Program Files (x86)/WinMerge/WinMergeU.exe'" -e "$LOCAL" "$REMOTE" [difftool] prompt = false [merge] tool = winmerge [mergetool "winmerge"] cmd = "'C:/Program Files (x86)/WinMerge/WinMergeU.exe'" \"$MERGED\" \"$REMOTE\" [mergetool] keepBackup = false trustExitCode = false 

    Sans configuration:

     git difftool --tool winmerge 

    En supposant:

    • Winmerge est installé
    • Git pour Windows est installé, à partir de “git version 2.12.0.windows1” ou supérieur (bien que les versions antérieures de git aient pu introduire la commande).
     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 

    Selon le manuel de la ligne de commande WinMerge : “Les parameters sont préfixés par une barre oblique (/) ou un tiret (-)”