va maintenant lancer WinMerge.
Si vous souhaitez git difflancer WinMerge, définissez simplement:
set GIT_EXTERNAL_DIFF=winmerge.sh
Mais la vraie valeur ajoutée vient de la possibilité d'utiliser ce même outil de diff pour présenter toutes les différences dans un lot au lieu de les présenter séquentiellement, ce qui vous oblige à fermer les fenêtres de l'outil de diff un fichier à la fois.
Mise à jour juin 2012 (2 ans et demi plus tard):
La comparaison des répertoires au lieu de fichier par fichier sera bientôt disponible:
Voir [ANNONCE] Git 1.7.11.rc1 :
" git difftool" a appris l' --dir-diffoption " " pour générer des outils de diff externe qui peuvent 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 une fois par paire de fichiers .
Script original de difftool par répertoires (décembre 2009)
Comme Seba Illingworth le mentionne dans sa réponse , un script git-diffall.sh (également mis 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 fenêtres pour n fichiers (si vous essayez d'utiliser l' -soption de WinMerge, cela ne fonctionnera pas car les fichiers temporaires sont supprimés par le difftool trop tôt)
C'est pourquoi j'aime l'approche de GitDiff.bat - power-diffing 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 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 gérer des fichiers avec les mêmes noms dans des répertoires différents, 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 ayant des différences internes. Vous pouvez cliquer sur ceux que vous souhaitez examiner, puis un simple ESCfermera toute la WinMerge-diffsession.
Essayer cela avec la version 1.6.5.1.1367.gcd48 de git et il ne semble pas générer de fichiers dans ces dossiers temporaires. Des idées où chercher le problème? Merci!
Art
@Art: dans ces cas de débogage, j'essaye d'isoler le problème en simplifiant le script: 1 / si le script appelé avec le paramètre 7 (premier passage de git diff, pour copier les fichiers) 2 / est le script au moins rappelé à la fin du git diff?
VonC le
1
@Erik: concernant l'option -ub, voir la FAQ WinMerge : c'est la même chose que -u: il dit à WinMerge de ne pas ajouter les fichiers à la MRU.
VonC
1
@Erik: vous devriez voir une comparaison des fichiers dans c:\Temp\GitDiff\oldet c:\Temp\GitDiff\new, pas dans ' /tmp'. Êtes-vous sûr d'exécuter ce programme DOS à partir d'une session DOS (et non d'une session bash)?
VonC
1
@coffeemakr cela n'a pas été évalué ""dans mon cas (exécution de la git configcommande à partir d'un CMD Windows. Mais vous avez raison: il serait évalué ""s'il était exécuté à partir d'un shell bash.
VonC
19
J'ai rencontré des problèmes en utilisant la première partie à 2 endroits et je l'ai corrigée comme suit
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
J'ai suivi exactement les instructions de VonC, mais je recevais des arguments vides dans mon script winmerge.sh. L'utilisation de barres obliques supplémentaires a résolu le problème. Je vous remercie!
ashagi
6
Étant donné que 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éez un fichier nommé winmerge.sh à un emplacement accessible à votre chemin (tel que /home/bin/winmerge.sh) avec le contenu suivant.
Étape 2 - Tapez les commandes suivantes dans Git Bash pour demander à git d'utiliser winmerge.sh comme difftool (ces options sont stockées dans /home/.gitconfig):
Étape 3 - Vous pouvez maintenant tester en tapant la commande suivante dans Git Bash pour démarrer 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 à .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 - Vous pouvez maintenant voir rapidement un diff dans WinMerge en tapant simplement la commande suivante dans Git Bash
Il serait utile que quelqu'un explique la signification de $LOCALet $REMOTE.
Tola Odejayi
6
J'ai un script qui définira les outils Diff et Merge dans la configuration Git avec les paramètres appropriés qui ne nécessitent pas un fichier .sh séparé pour exister. Cela semble bien fonctionner pour moi.
La commande suivante n'a pas fonctionné pour moi. git config --global difftool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\"" Remarque: cette commande doit être exécutée à partir d'une invite de commande et non à partir de PowerShell. L'ajout manuel de ce qui suit à ma [difftool "winmerge"]section .gitconfig a fonctionné pour moi: cmd = 'C:/Program Files (x86)/WinMerge/WinMergeU.exe' -r -u -e -dl \"Local\" -dr \"Remote\" \"$LOCAL\" \"$REMOTE\"
Josh
1
Il n'a pas fonctionné, mais avec quelques changements, cela fonctionne: cmd ouvert en tant qu'administrateur, et exécutez: git config --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -r -u -e -dl \"Local\" -dr \"Remote\" \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\"". Il y avait quelques chaînes échappées incorrectes (notez quelques barres obliques inverses indésirables supplémentaires juste avant le $- je suppose $qu'il n'est pas nécessaire d'échapper). De plus, il manquait une fin "après WinMergeU?.exe. Courez git config --get mergetool.winmerge.cmdpour voir ce qui avait été réellement réglé. Quoi qu'il en soit, merci pour la non .shversion: +1!
falsarella
5
Sous 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 qui entourent le chemin de winmerge:
Faites également attention aux barres obliques avant au lieu des barres obliques inverses dans le chemin de la commande.
wisbucky
5
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 des versions antérieures de git aient peut-être introduit la commande).
Je ne savais pas pourquoi la solution était présentée comme un fichier batch DOS, car mon installation Git était livrée avec un shell bash. J'étais également incapable d'obtenir un contexte DOS fonctionnant à partir de bash, j'ai donc essayé d'adapter ce qui était précédemment partagé dans un contexte bash.
Comme git diffsemble 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-le gitprepdiff.shpour être l'outil de comparaison comme mentionné précédemment
Il convient également de noter que, sur mon installation, /tmp(en bash) mappé sur %LOCALAPPDATA%\Temp\1\(sous Windows), c'est pourquoi j'utilise ce dernier dans mon appel à WinMerge.
Cela semble ridicule de sauter à travers autant de cerceaux pour que cela fonctionne, mais c'est le cas. Vous obtenez tous les fichiers diffs en une seule fois, comme il se doit. J'ai dû également apporter les modifications mentionnées par @dobau pour gérer correctement les fichiers dans les sous-répertoires.
Réponses:
Mise à jour juin 2015, 6 ans plus tard:
Comme détaillé dans " git mergetool winmerge ", un simple
git config diff.tool winmerge
suffira.Git 2.5+ (Q2, 2015) est maintenant conscient de Winmerge en tant qu'outil de comparaison 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 visual diff? "
Avec
winmerge.sh
stocké dans un répertoire faisant partie de votrePATH
:(voir Options de la ligne de commande WinMerge )
va maintenant lancer WinMerge.
Si vous souhaitez
git diff
lancer WinMerge, définissez simplement:Mais la vraie valeur ajoutée vient de la possibilité d'utiliser ce même outil de diff pour présenter toutes les différences dans un lot au lieu de les présenter séquentiellement, ce qui vous oblige à fermer les fenêtres de l'outil de diff un fichier à la fois.
Mise à jour juin 2012 (2 ans et demi plus tard):
La comparaison des répertoires au lieu de fichier par fichier sera bientôt disponible:
Voir [ANNONCE] Git 1.7.11.rc1 :
Voir " Patch
difftool
: apprendredifftool
à gérer les différences de répertoires ", et la réponse " Comparaison des répertoires des branches Git " pour plus de détails.Script original de difftool par répertoires (décembre 2009)
Comme Seba Illingworth le mentionne dans sa réponse , un script git-diffall.sh (également mis dans le chemin) peut faire exactement cela:
Mais cela ne fonctionne qu'en ouvrant n fenêtres pour n fichiers (si vous essayez d'utiliser l'
-s
option de WinMerge, cela ne fonctionnera pas car les fichiers temporaires sont supprimés par le difftool trop tôt)C'est pourquoi j'aime l'approche de GitDiff.bat - power-diffing 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 n'utiliser que des commandes DOS
Il n'est pas assez robuste pour gérer des fichiers avec les mêmes noms dans des répertoires différents, 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 ayant des différences internes. Vous pouvez cliquer sur ceux que vous souhaitez examiner, puis un simple ESCfermera toute la
WinMerge-diff
session.la source
git diff
?-ub
, voir la FAQ WinMerge : c'est la même chose que-u
: il dit à WinMerge de ne pas ajouter les fichiers à la MRU.c:\Temp\GitDiff\old
etc:\Temp\GitDiff\new
, pas dans '/tmp
'. Êtes-vous sûr d'exécuter ce programme DOS à partir d'une session DOS (et non d'une session bash)?""
dans mon cas (exécution de lagit config
commande à partir d'un CMD Windows. Mais vous avez raison: il serait évalué""
s'il était exécuté à partir d'un shell bash.J'ai rencontré des problèmes en utilisant la première partie à 2 endroits et je l'ai corrigée comme suit
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
a changé le fichier winmerge.sh en (sans cela, obtenait une erreur de chemin droit invalide)
la source
Étant donné que 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éez un fichier nommé winmerge.sh à un emplacement accessible à votre chemin (tel que /home/bin/winmerge.sh) avec le contenu suivant.
Étape 2 - Tapez les commandes suivantes dans Git Bash pour demander à git d'utiliser winmerge.sh comme difftool (ces options sont stockées dans /home/.gitconfig):
Étape 3 - Vous pouvez maintenant tester en tapant la commande suivante dans Git Bash pour démarrer votre diff WinMerge:
É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 créez un fichier .bashrc avec cette ligne si le fichier n'existe pas déjà):
Étape 5 - Vous pouvez maintenant voir rapidement un diff dans WinMerge en tapant simplement la commande suivante dans Git Bash
la source
$LOCAL
et$REMOTE
.J'ai un script qui définira les outils Diff et Merge dans la configuration Git avec les paramètres appropriés qui ne nécessitent pas un fichier .sh séparé pour exister. Cela semble bien fonctionner pour moi.
Remarque - toute la partie .cmd est citée afin que les paramètres soient correctement répertoriés dans le .gitconfig
la source
git config --global difftool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\""
Remarque: cette commande doit être exécutée à partir d'une invite de commande et non à partir de PowerShell. L'ajout manuel de ce qui suit à ma[difftool "winmerge"]
section .gitconfig a fonctionné pour moi:cmd = 'C:/Program Files (x86)/WinMerge/WinMergeU.exe' -r -u -e -dl \"Local\" -dr \"Remote\" \"$LOCAL\" \"$REMOTE\"
git config --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -r -u -e -dl \"Local\" -dr \"Remote\" \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\""
. Il y avait quelques chaînes échappées incorrectes (notez quelques barres obliques inverses indésirables supplémentaires juste avant le$
- je suppose$
qu'il n'est pas nécessaire d'échapper). De plus, il manquait une fin"
aprèsWinMergeU?.exe
. Courezgit config --get mergetool.winmerge.cmd
pour voir ce qui avait été réellement réglé. Quoi qu'il en soit, merci pour la non.sh
version: +1!Sous 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 qui entourent le chemin de winmerge:
la source
Sans configuration:
En supposant:
la source
Je ne savais pas pourquoi la solution était présentée comme un fichier batch DOS, car mon installation Git était livrée avec un shell bash. J'étais également incapable d'obtenir un contexte DOS fonctionnant à partir de bash, j'ai donc 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, j'ai divisé ma solution en deux scripts bash:Tout d'abord, configurez-le
gitprepdiff.sh
pour être l'outil de comparaison comme mentionné précédemmentJ'ai également noté que les résultats des
git configure
commandes peuvent être trouvés et modifiés directement dansC:\Users\<username>\.gitconfigure
gitdiff.sh
est ensuite exécuté sur la ligne de commande où vous appelleriez normalementgit diff
Il convient également de noter que, sur mon installation,
/tmp
(en bash) mappé sur%LOCALAPPDATA%\Temp\1\
(sous Windows), c'est pourquoi j'utilise ce dernier dans mon appel à WinMerge.la source
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!Selon le manuel de la ligne de commande WinMerge : "Les paramètres sont précédés d'un caractère barre oblique (/) ou tiret (-)"
la source