utilisez Winmerge à l'intérieur de Git pour déposer diff

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

96
demandé sur Toby Allen 2009-12-10 18:08:13

8 réponses

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) est maintenant conscient de Winmerge comme un diff ou un outil de fusion!


réponse Originale à cette question (2009-2012)

(msysgit, 1.6.5, DOS session)

la première partie (en utilisant winmerge) est décrit dans" Comment puis-je voir la sortie ‘git diff’ avec le programme visual diff?

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 un répertoire partie de votre PATH :

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

(voir WinMerge options de ligne de Commande )

git difftool

va maintenant lancer WinMerge.

Si vous voulez que git diff lance WinMerge, mettez juste:

set GIT_EXTERNAL_DIFF=winmerge.sh

mais la vraie valeur ajoutée vient de la possibilité d'utiliser ce même outil de diff à présenter toutes les différences dans un lot au lieu de les présenter séquentiellement, vous forçant à fermer l'outil de diff windows un fichier à la fois.

Update June 2012 (2 ans et demi plus tard):

comparer les répertoires au lieu de file-by-file sera disponible bientôt:

Voir [annoncer] Git 1.7.11.rc1 :

git difftool " appris l'option " --dir-diff " pour lancer des outils externes diff qui peuvent comparer deux hiérarchies de répertoires à un moment après peupler deux répertoires temporaires, au lieu d'exécuter une instance de l'outil externe une fois par paire de fichiers .

voir " Patch difftool : enseigner difftool pour gérer le répertoire des diff ", et la réponse " Répertoire de la comparaison des branches Git " pour plus de détails.


Original difftool par les répertoires de script (décembre 2009)

comme Seba Illingworth mentions dans sa réponse , un script git-diffall.sh (également

#!/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, il ne fonctionnera pas en raison des fichiers temp étant supprimé par le difftool trop tôt)


C'est pourquoi j'aime l'approche de GitDiff.bat-power-diffing avec GI , qui vous permet de consulter la liste des fichiers avec une différence, avant de choisir l'un d'examiner ses différences internes.

Je l'ai modifié pour n'utiliser que des 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

il n'est pas assez robuste pour traiter des fichiers avec les mêmes noms dans différents répertoires, mais il vous donne une idée générale de ce qui est possible:

Ici, un seul WinMerge s'ouvrira, avec la liste des fichiers ayant des différences internes. Vous pouvez cliquer sur sur ceux que vous voulez examiner, alors un simple ESC fermera la session WinMerge-diff .

111
répondu VonC 2017-05-23 12:34:19

j'ai eu du mal à utiliser la première partie en 2 endroits et je l'ai fixée comme suit

  1. la deuxième commande pour la mise en place de winmerge.cmd avait besoin d'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. a changé le winmerge.sh fichier (sans cela, se droit chemin d'accès non valide erreur)

    #!/bin/sh
    echo Launching WinMergeU.exe: "$(cygpath -aw "")" "$(cygpath -aw "")"
    "$PROGRAMFILES/WinMerge/WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$(cygpath -aw "")" "$(cygpath -aw "")"
    
19
répondu Gopi 2011-10-10 04:57:04

comme le thread devient confus et bifurqué, voici des instructions consolidées pour la méthode WinMerge" --dir-diff " pour msysgit Git Windows.

Étape 1 - créer 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:  
"$PROGRAMFILES/WinMerge/WinMergeU.exe" -r -ub -dl "Remote" -dr "Local" "" ""

l'Étape 2 - Tapez les commandes suivantes dans Git Bash pour demandez à 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 WinMerge diff:

git difftool --dir-diff

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

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

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

diffdir
6
répondu robertcollier4 2013-10-22 07:10:02

j'ai un script qui va configurer les outils Diff et Merge dans la configuration Git avec les paramètres appropriés qui ne nécessitent pas de séparation .sh file to exist. Il semble bien fonctionner 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\""

Note - la totalité .partie cmd est cité de sorte que les paramètres seront énumérés dans le .gitconfig proprement dit

6
répondu Alf47 2014-09-22 20:00:27

j'étais confus sur la raison pour laquelle la solution a été présentée comme un fichier batch DOS, car mon installation Git est venu avec un shell bash. J'ai également été incapable d'obtenir un contexte DOS à partir de bash, donc j'ai essayé d'adapter ce qui était auparavant partagé dans un contexte bash.

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

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

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

j'ai aussi noté que les résultats des commandes git configure peuvent être trouvés et édités directement dans C:\Users\<username>\.gitconfigure

gitdiff.sh est alors exécuté à 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

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

2
répondu Shawn South 2011-11-24 00:59:36

sur windows vous pouvez le faire de cette façon:

1) Ouvert .gitconfig fichier. Il est situé dans votre répertoire: c:\users\username.gitconfig

2) Ajouter les lignes ci-dessous. Faites attention aux guillemets simples enveloppant le chemin de 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
2
répondu Caner 2015-06-03 08:44:43

sans configuration:

git difftool --tool winmerge

en supposant:

  • Winmerge est installé
  • Git pour windows est installé, à partir de "git version version 2.12.0.windows1" ou plus haut (bien que les versions précédentes de git aient pu introduire la commande).
1
répondu John Bentley 2017-03-01 13:34:08
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 WinMerge command line manual :" les paramètres sont préfixés avec un caractère Slash ( / ) ou dash ( - ) "

0
répondu Steve Lang 2016-03-17 01:09:52