Lorsque je tape git diff
, je souhaite voir la sortie avec mon outil de diff visuel de choix (SourceGear “diffmerge” sous Windows). Comment configurer git pour le faire?
Depuis Git1.6.3, vous pouvez utiliser le script git difftool : voir ma réponse ci-dessous .
Peut-être cet article va vous aider. Voici les meilleures parties:
Il existe deux manières différentes de spécifier un outil de diff externe.
La première est la méthode que vous avez utilisée, en définissant la variable GIT_EXTERNAL_DIFF. Cependant, la variable est supposée pointer vers le chemin complet de l’exécutable. De plus, l’exécutable spécifié par GIT_EXTERNAL_DIFF sera appelé avec un ensemble fixe de 7 arguments:
path old-file old-hex old-mode new-file new-hex new-mode
Comme la plupart des outils diff requièrent un ordre différent (et seulement certains) des arguments, vous devrez probablement spécifier un script wrapper à la place, qui à son tour appelle l’outil de diff réel.
La seconde méthode, que je préfère, consiste à configurer l’outil de diff externe via “git config” . Voici ce que j’ai fait:
1) Créez un script “git-diff-wrapper.sh” qui contient quelque chose comme
-->8-(snip)-- #!/bin/sh # diff is called by git with 7 parameters: # path old-file old-hex old-mode new-file new-hex new-mode "" "$2" "$5" | cat --8<-(snap)--
Comme vous pouvez le voir, seuls les deuxièmes arguments ("old-file") et cinquième ("new-file") seront transmis à l'outil diff.
2) Type
$ git config --global diff.external
à l'invite de commande, en remplaçant par le chemin "git-diff-wrapper.sh", votre ~ / .gitconfig contient
-->8-(snip)-- [diff] external = --8<-(snap)--
Veillez à utiliser la syntaxe correcte pour spécifier les chemins d'access au script et à l'outil diff, par exemple, utilisez des barres obliques au lieu de barres obliques inverses. Dans mon cas, j'ai
[diff] external = \"c:/Documents and Settings/sschuber/git-diff-wrapper.sh\"
dans .gitconfig et
"d:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat
dans le script wrapper. Attention au "chat" qui traîne!
(Je suppose que le ' | cat
' n'est nécessaire que pour certains programmes qui peuvent ne pas renvoyer un état de retour correct ou cohérent. Vous pouvez essayer sans le chat final si votre outil diff a un statut de retour explicite)
Cela (l'article cité ci-dessus) est la théorie de l'outil externe défini par le fichier de configuration (pas par la variable d'environnement).
En pratique (toujours pour la définition du fichier de configuration de l'outil externe), vous pouvez vous référer à:
Pour compléter ma précédente réponse à la configuration “diff.external” ci-dessus:
Comme mentionné par Jakub , Git1.6.3 a introduit git difftool , initialement proposé en septembre 2008:
USAGE = '[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
(Voir --extcmd
dans la dernière partie de cette réponse)
$LOCAL
contient le contenu du fichier de la révision de départ et $REMOTE
contient le contenu du fichier dans la révision de fin.
$BASE
contient le contenu du fichier dans le fichier
Il s’agit essentiellement de
git-mergetool
modifié pour fonctionner sur l’index / worktree de git.Le cas d’utilisation habituel de ce script est lorsque vous avez effectué des modifications par étapes ou non et que vous souhaitez voir les modifications dans un visualiseur de différences côte à côte (par exemple,
xxdiff
,tkdiff
, etc.).
git difftool [*]
Un autre cas d’utilisation est celui où vous souhaitez voir les mêmes informations, mais comparez des commits arbitraires (c’est la partie où l’parsing Revarg pourrait être meilleure)
git difftool --start=HEAD^ --end=HEAD [-- *]
Le dernier cas d’utilisation est celui où vous souhaitez comparer votre worktree actuel à autre chose que HEAD (par exemple, une balise)
git difftool --commit=v1.0.0 [-- *]
Note: puisque Git 2.5, git config diff.tool winmerge
est suffisant!
Voir ” git mergetool winmerge ”
Et depuis Git 1.7.11 , vous avez l’option --dir-diff
, afin de générer des outils de diff 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 une fois par paire de fichiers.
Avant Git 2.5:
Cas pratique pour configurer difftool
avec votre outil de personnalisation:
C:\myGitRepo>git config --global diff.tool winmerge C:\myGitRepo>git config --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\"" C:\myGitRepo>git config --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 "C:/Program Files/WinMerge/WinMergeU.exe" -u -e "$1" "$2" -dl "Local" -dr "Remote"
Si vous avez un autre outil (kdiff3, P4Diff, …), créez un autre script shell et la directive de configuration difftool.myDiffTool.cmd
appropriée.
Ensuite, vous pouvez facilement changer d’outils avec la configuration diff.tool
.
Vous avez également cette entrée de blog par Dave pour append d’autres détails.
(Ou cette question pour les options winmergeu
)
L’intérêt de ce paramètre est le script winmerge.sh
: vous pouvez le personnaliser pour prendre en compte les cas particuliers.
Voir par exemple la réponse de David Marble ci-dessous pour un exemple qui traite de:
Comme Kem Mason le mentionne dans sa réponse , vous pouvez également éviter tout wrapper en utilisant l’option --extcmd
:
--extcmd=
Spécifiez une commande personnalisée pour l’affichage des diffs.
git-difftool
ignore les valeurs par défaut configurées et exécute$command $LOCAL $REMOTE
lorsque cette option est spécifiée.
Par exemple, gitk
est capable d’exécuter / utiliser n’importe quel outil de diff
.
Dans l’esprit de répondre à des questions quelque peu différentes de celles posées. Essayez cette solution:
$ meld my_project_using_git
Meld comprend git et permet de naviguer autour des changements récents.
Depuis la version 1.6.3 de git, il existe ” git difftool ” que vous pouvez configurer pour utiliser votre outil de comparaison graphique préféré. Les logiciels actuellement pris en charge sont kdiff3, kompare, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, diffuse et opendiff ; Si l’outil que vous souhaitez utiliser ne figure pas dans cette liste, vous pouvez toujours utiliser l’option de configuration ‘ difftool.
‘.
“git difftool” accepte les mêmes options que “git diff”.
Avec new git difftool , c’est aussi simple que de l’append à votre fichier .gitconfig :
[diff] tool = any-name [difftool "any-name"] cmd = "\"C:/path/to/my/ext/diff.exe\" \"$LOCAL\" \"$REMOTE\""
Consultez également diffall , un script simple que j’ai écrit pour étendre le comportement diff par défaut de l’ouverture (IMO) de chaque ouverture en série.
J’ai un ajout à cela. J’aime utiliser régulièrement une application diff qui n’est pas prise en charge comme l’un des outils par défaut (par exemple, le kaléidoscope), via
git difftool -t
J’aime aussi avoir le diff
par défaut qui ne soit que la ligne de commande normale, par conséquent, définir la variable GIT_EXTERNAL_DIFF
n’est pas une option.
Vous pouvez utiliser une application diff
arbitraire avec cette commande:
git difftool --extcmd=/usr/bin/ksdiff
Il ne fait que passer les 2 fichiers à la commande que vous spécifiez, vous n’avez donc probablement pas besoin d’un wrapper.
En vous appuyant sur la réponse de VonC pour gérer les suppressions et les ajouts de fichiers, utilisez les commandes et scripts suivants:
> git config --global diff.tool winmerge > git config --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\" \"$BASE\"" > git config --global difftool.prompt false
Ce qui revient à mettre ceci dans votre .gitconfig
global:
[diff] tool = winmerge [difftool "winmerge"] cmd = winmerge.bat "$LOCAL" "$REMOTE" "$BASE" [difftool] prompt = false
Ensuite, mettez ce qui suit dans winmerge.sh
qui doit être sur votre chemin:
#!/bin/sh NULL="/dev/null" if [ "$2" = "$NULL" ] ; then echo "removed: $3" elif [ "$1" = "$NULL" ] ; then echo "added: $3" else echo "changed: $3" "C:/Program Files (x86)/WinMerge/WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$1" "$2" fi
Après avoir lu les réponses, j’ai découvert un moyen plus simple consistant à ne changer qu’un seul fichier.
Créez un fichier de commandes pour appeler votre programme diff, avec les arguments 2 et 5. Ce fichier doit se trouver quelque part dans votre chemin. (Si vous ne savez pas où c’est, mettez-le dans c: \ windows). Appelez-le, par exemple, “gitdiff.bat”. Le mien est:
@echo off REM This is gitdiff.bat "C:\Program Files\WinMerge\WinMergeU.exe" %2 %5
Définissez la variable d’environnement pour qu’elle pointe sur votre fichier de commandes. Par exemple: GIT_EXTERNAL_DIFF=gitdiff.bat
. Ou via powershell en tapant git config --global diff.external gitdiff.bat
.
Il est important de ne pas utiliser de guillemets ou de spécifier des informations de chemin, sinon cela ne fonctionnera pas. C’est pourquoi gitdiff.bat doit être sur votre chemin.
Maintenant, lorsque vous tapez “git diff”, il appellera votre visualiseur de diff externe.
Si vous le faites via cygwin, vous devrez peut-être utiliser cygpath :
$ git config difftool.bc3.cmd "git-diff-bcomp-wrapper.sh \$LOCAL \$REMOTE" $ cat git-diff-bcomp-wrapper.sh #!/bin/sh "c:/Program Files (x86)/Beyond Compare 3/BComp.exe" `cygpath -w $1` `cygpath -w $2`
Cela fonctionne pour moi sur Windows 7. Pas besoin de scripts intermédiaires
contenu de .gitconfig:
[diff] tool = kdiff3 [difftool] prompt = false [difftool "kdiff3"] path = C:/Program Files (x86)/KDiff3/kdiff3.exe cmd = "$LOCAL" "$REMOTE"
Un bref résumé des réponses ci-dessus:
git difftool --tool-help git config --global diff.tool git config --global --add difftool.prompt false
Ensuite, utilisez-le en tapant (en spécifiant éventuellement le nom du fichier):
git difftool
Pour référence, j’aimerais inclure ma variation dans la réponse de VonC. Gardez à l’esprit que j’utilise la version MSys de Git (1.6.0.2 pour le moment) avec PATH modifié, et que Git s’exécute à partir de Powershell (ou cmd.exe), pas le shell Bash.
J’ai introduit une nouvelle commande, gitdiff
. Exécuter cette commande temporairement redirige git diff
pour utiliser un programme de diff visuel de votre choix (par opposition à la solution de VonC qui le fait de manière permanente). Cela me permet d’avoir à la fois la fonctionnalité de diff Git par défaut ( git diff
) ainsi que la fonctionnalité de diff visuelle ( gitdiff
). Les deux commandes prennent les mêmes parameters. Par exemple, vous pouvez, par exemple, modifier visuellement les modifications apscopes à un fichier particulier.
gitdiff path/file.txt
Notez que $GitInstall
est utilisé comme espace réservé pour le répertoire dans lequel Git est installé.
Créez un nouveau fichier, $GitInstall\cmd\gitdiff.cmd
@echo off setlocal for /F "delims=" %%I in ("%~dp0..") do @set path=%%~fI\bin;%%~fI\mingw\bin;%PATH% if "%HOME%"=="" @set HOME=%USERPROFILE% set GIT_EXTERNAL_DIFF=git-diff-visual.cmd set GIT_PAGER=cat git diff %* endlocal
Créez un nouveau fichier, $GitInstall\bin\git-diff-visual.cmd
(remplaçant l’espace réservé [visual_diff_exe]
par le chemin complet du programme diff de votre choix)
@echo off rem diff is called by git with 7 parameters: rem path old-file old-hex old-mode new-file new-hex new-mode echo Diffing "%5" "[visual_diff_exe]" "%2" "%5" exit 0
Vous avez maintenant terminé. L’exécution de gitdiff
partir d’un référentiel Git doit maintenant appeler votre programme de diff visuel pour chaque fichier modifié.
Voici un fichier de commandes qui fonctionne pour Windows – suppose que DiffMerge installé à l’emplacement par défaut, gère x64, gère le remplacement des barres obliques inverses si nécessaire et qu’il est capable de s’installer. Devrait être facile de remplacer DiffMerge avec votre programme diff préféré.
À installer:
gitvdiff --install
gitvdiff.bat:
@echo off REM ---- Install? ---- REM To install, run gitvdiff --install if %1==--install goto install REM ---- Find DiffMerge ---- if DEFINED ProgramFiles^(x86^) ( Set DIFF="%ProgramFiles(x86)%\SourceGear\DiffMerge\DiffMerge.exe" ) else ( Set DIFF="%ProgramFiles%\SourceGear\DiffMerge\DiffMerge.exe" ) REM ---- Switch forward slashes to back slashes ---- set oldW=%2 set oldW=%oldW:/=\% set newW=%5 set newW=%newW:/=\% REM ---- Launch DiffMerge ---- %DIFF% /title1="Old Version" %oldW% /title2="New Version" %newW% goto :EOF REM ---- Install ---- :install set selfL=%~dpnx0 set selfL=%selfL:\=/% @echo on git config --global diff.external %selfL% @echo off :EOF
Si vous utilisez un Mac et que vous avez XCode, FileMerge est installé. La commande du terminal est opendiff, vous pouvez donc simplement faire git difftool -t opendiff
Pour une version Linux de la configuration d’un outil de diff sur les versions de git antérieures à 1.6.3 (1.6.3 a ajouté difftool à git), il s’agit d’un excellent tutoriel concis,
en bref:
Étape 1: ajoutez ceci à votre .gitconfig
[diff] external = git_diff_wrapper [pager] diff =
Étape 2: créez un fichier nommé git_diff_wrapper, placez-le quelque part dans votre $ PATH
#!/bin/sh vimdiff "$2" "$5"
Installer la fusion
# apt-get install meld
Ensuite, choisissez cela comme difftool
$ git config --global diff.tool meld
Si vous voulez l’exécuter sur le type de console:
$ git difftool
Si vous souhaitez utiliser le type de mode graphique:
$ git mergetool
Et la sortie serait:
'git mergetool' will now attempt to use one of the following tools: meld opendiff kdiff3 tkdiff xxdiff tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge araxis bc3 codecompare emerge vimdiff Merging: www/css/style.css www/js/controllers.js Normal merge conflict for 'www/css/style.css': {local}: modified file {remote}: modified file Hit return to start merge resolution tool (meld):
Il suffit donc d’appuyer sur Entrée pour utiliser Meld (par défaut), cela ouvrirait le mode graphique, effectuerait la sauvegarde magique et appuierait sur celle qui résoudrait la fusion. C’est tout
Sur Mac OS X,
git difftool -t diffuse
fait le travail pour moi dans le dossier git. Pour installer diffuse, on peut utiliser le port –
sudo port install diffuse
vous pouvez utiliser git difftool
.
Par exemple, si vous avez fusionné , vous pouvez éditer les twigs master
et les déployer par:
git config --global diff.external meld git difftool master..devel
Après avoir examiné d’autres outils de diff externes, j’ai constaté que l’affichage des diff
dans IntelliJ IDEA (et Android Studio) était le meilleur pour moi.
Si vous souhaitez utiliser IntelliJ IDEA comme outil de comparaison, vous devez d’abord configurer IntelliJ IDEA à partir de la ligne de commande en suivant les instructions ci- dessous :
Sous macOS ou UNIX:
Tools | Create Command-line Launcher
Tools | Create Command-line Launcher
. La boîte de dialog Créer un script de lancement s’ouvre, avec le chemin suggéré et le nom du script de lancement. Vous pouvez accepter la valeur par défaut ou spécifier votre propre chemin. Faites-en attention, car vous en aurez besoin plus tard. En dehors de IntelliJ IDEA, ajoutez le chemin et le nom du script de lancement à votre chemin. Sous Windows:
En suivant les instructions sur cet article de blog :
Frapper
export INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS PATH=$IDEA_HOME $PATH
Poisson
set INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS set PATH $INTELLIJ_HOME $PATH
Maintenant, ajoutez ce qui suit à votre git config:
[merge] tool = intellij [mergetool "intellij"] cmd = idea merge $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE") $(cd $(dirname "$BASE") && pwd)/$(basename "$BASE") $(cd $(dirname "$MERGED") && pwd)/$(basename "$MERGED") trustExitCode = true [diff] tool = intellij [difftool "intellij"] cmd = idea diff $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE")
Vous pouvez l’essayer avec git difftool
ou git difftool HEAD~1
J’ai essayé les trucs de fantaisie ici (avec tkdiff) et rien n’a fonctionné pour moi. J’ai donc écrit le script suivant, tkgitdiff. Il fait ce que j’ai besoin de faire.
$ cat tkgitdiff #!/bin/sh # # tkdiff for git. # Gives you the diff between HEAD and the current state of your file. # newfile=$1 git diff HEAD -- $newfile > /tmp/patch.dat cp $newfile /tmp savedPWD=$PWD cd /tmp patch -R $newfile < patch.dat cd $savedPWD tkdiff /tmp/$newfile $newfile
J’utilise ce bit dans ~/.gitconfig
depuis longtemps:
[diff] external = ~/Dropbox/source/bash/git-meld
Avec git-meld
:
#!/bin/bash if [ "$DISPLAY" = "" ]; then diff $2 $5 else meld $2 $5 fi
Mais maintenant je me suis fatigué de toujours utiliser Meld dans un environnement graphique, et il n’est pas sortingvial d’invoquer le diff normal avec cette configuration, alors je suis passé à ceci:
[alias] v = "!sh -c 'if [ $# -eq 0 ] ; then git difftool -y -t meld ; else git difftool -y $@ ; fi' -"
Avec cette configuration, des choses comme ce travail:
git v git v --staged git v -t kompare git v --staged -t tkdiff
Et je continue à garder le bon vieux git diff
.
J’utilise kompare sur Ubuntu:
sudo apt-get install kompare
Pour comparer deux twigs:
git difftool -t kompare master
Si vous avez déjà un outil diff associé à des types de fichiers (par exemple, parce que vous avez installé TortoiseSVN fourni avec un visualiseur de différences), vous pouvez simplement générer la sortie régulière de git diff
dans un fichier “temp”. savoir quelque chose sur le spectateur:
git diff > "~/temp.diff" && start "~/temp.diff"
La définir comme un alias global fonctionne encore mieux: git what
[alias] what = "!f() { git diff > "~/temp.diff" && start "~/temp.diff"; }; f"
Si vous n’en faites pas partie pour la ligne de commande, si vous installez tortoise git, vous pouvez cliquer avec le bouton droit sur un fichier pour obtenir un sous-menu tortoisegit avec l’option “Diff later”.
Lorsque vous sélectionnez cette option dans le premier fichier, vous pouvez cliquer avec le bouton droit sur le second fichier, accéder au sous-menu tortoisegit et sélectionner “Diff with == yourfilehere ==”. Cela donnera le gui tortoisegitmerge pour le résultat.
Vous pouvez essayer xd http://github.com/jiqingtang/xd , qui est un wrapper graphique pour GIT / SVN diff. Ce n’est pas un outil de diff lui-même. Vous exécutez xd
lorsque vous voulez lancer git diff
ou svn diff
et vous verrez une liste de fichiers, une fenêtre de prévisualisation et vous pourrez lancer n’importe quel outil de diff, comme tkdiff, xxdiff, gvimdiff, emacs (ediff), xemacs ( ediff), meld, diffuse, kompare et kdiff3. Vous pouvez également exécuter n’importe quel outil personnalisé.
Malheureusement, l’outil ne prend pas en charge Windows.
Disclosure : Je suis l’auteur de cet outil.