Git sur Windows: Comment configurez-vous un outil mergetool?
Question
J'ai essayé msysGit et Git sur Cygwin. Les deux fonctionnent très bien en eux-mêmes et gitk et git-gui fonctionnent parfaitement.
Maintenant, comment diable puis-je configurer un outil mergetool? (Vimdiff fonctionne sur Cygwin, mais de préférence je voudrais quelque chose d’un peu plus convivial pour certains de nos collègues épris de Windows.)
La solution
Pour faire suite à la réponse de Charles Bailey, voici ma configuration git qui utilise p4merge (outil de fusion multi-plateformes gratuit inter-plateformes); testé sur msys Git (Windows) installer:
git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"'
ou, à partir d'un shell Windows cmd.exe, la deuxième ligne devient:
git config --global mergetool.p4merge.cmd "p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
Les modifications (relatives à Charles Bailey):
- ajouté à la configuration globale de git, c'est-à-dire valable pour tous les projets git et pas seulement pour celui en cours
- la valeur de configuration de l'outil personnalisé réside dans & "; outil de fusion. [outil] .cmd &"; pas & "; fusion. [outil] .cmd &"; (idiote moi, passé une heure à dépanner pourquoi git n'arrêtait pas de se plaindre d'un outil inexistant)
- a ajouté des guillemets pour tous les noms de fichiers afin que les fichiers avec des espaces puissent toujours être trouvés par l'outil de fusion (j'ai testé cela dans msys Git de Powershell)
- notez que par défaut, Perforce ajoutera son répertoire d'installation à PATH, il n'est donc pas nécessaire de spécifier le chemin complet de p4merge dans la commande
Télécharger: http: //www.perforce. com / produit / composants / perforce-visual-merge-and-diff-tools
MODIFIER (février 2014)
Comme indiqué par @Gregory Pakosz , le dernier msys git maintenant &" en mode natif & "; prend en charge p4merge (testé sur 1.8.5.2.msysgit.0 ).
Vous pouvez afficher la liste des outils pris en charge en exécutant:
git mergetool --tool-help
Vous devriez voir p4merge dans la liste disponible ou valide . Sinon, veuillez mettre à jour votre git.
Si p4merge était répertorié comme disponible , il se trouve dans votre CHEMIN et il vous suffit de définir merge.tool :
git config --global merge.tool p4merge
S'il était répertorié comme valide , vous devez définir mergetool.p4merge.path en plus de merge.tool :
git config --global mergetool.p4merge.path c:/Users/my-login/AppData/Local/Perforce/p4merge.exe
- L'exemple ci-dessus représente un chemin d'accès lors de l'installation de p4merge pour l'utilisateur actuel, mais pas à l'échelle du système (ne nécessite ni droits d'administrateur ni élévation du contrôle de compte d'utilisateur)
- Bien que
~
devrait être étendu au répertoire de base de l'utilisateur actuel (donc théoriquement, le chemin devrait être~/AppData/Local/Perforce/p4merge.exe
), cela ne fonctionnait pas pour moi - Mieux encore, il aurait été préférable de tirer parti d'une variable d'environnement (par exemple,
$LOCALAPPDATA/Perforce/p4merge.exe
), git ne semble pas développer les variables d'environnement pour les chemins (si vous savez comment faire en sorte que cela fonctionne, faites-le moi savoir ou mettez-le à jour. répondre)
Autres conseils
La définition de mergetool.p4merge.cmd ne fonctionnera plus car Git a commencé à essayer de prendre en charge p4merge, voir libexec / git-core / git-mergetool--lib.so, il suffit de spécifier le chemin du logiciel mergetool pour git, par exemple. le p4merge:
git config --global mergetool.p4merge.path 'C:\Program Files\Perforce\p4merge.exe'
git config --global merge.tool p4merge
Ensuite, cela fonctionnera.
J'utilise Portable Git sur WinXP (fonctionne à merveille!) et j'avais besoin de résoudre un conflit survenu lors de la création de branches. J'ai vérifié de toutes les interfaces graphiques que KDiff3 était la plus transparente à utiliser.
Mais j’ai trouvé les instructions nécessaires pour que cela fonctionne sous Windows dans cet article de blog , instructions légèrement différentes des autres approches répertoriées ici. Cela revient essentiellement à ajouter ces lignes à mon .gitconfig
fichier:
[merge]
tool = kdiff3
[mergetool "kdiff3"]
path = C:/YourPathToBinaryHere/KDiff3/kdiff3.exe
keepBackup = false
trustExitCode = false
Travaillez bien maintenant!
Sous Cygwin, la seule solution qui a fonctionné pour moi est la suivante:
git config --global merge.tool myp4merge
git config --global mergetool.myp4merge.cmd 'p4merge.exe "$(cygpath -wla $BASE)" "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)" "$(cygpath -wla $MERGED)"'
git config --global diff.tool myp4diff
git config --global difftool.myp4diff.cmd 'p4merge.exe "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)"'
J'aime aussi désactiver le message d'invite pour difftool:
git config --global difftool.prompt false
git mergetool
est entièrement configurable, vous pouvez donc choisir votre outil préféré.
La documentation complète est disponible ici: http: // www.kernel.org/pub/software/scm/git/docs/git-mergetool.html
En bref, vous pouvez définir un outil de fusion par défaut en définissant la variable de configuration de l'utilisateur merge.tool
.
Si l’outil de fusion est l’un de ceux pris en charge de façon native, il vous suffit de définir mergetool.<tool>.path
sur le chemin complet de l’outil (remplacez <tool>
par ce que vous avez configuré mergetool.<tool>.cmd
.
Sinon, vous pouvez définir $BASE, $LOCAL, $REMOTE, $MERGED
sur un morceau de shell à évaluer au moment de l'exécution avec les variables d'environnement git config
définies sur les fichiers appropriés. Vous devez être prudent avec l'échappement si vous éditez directement un fichier de configuration ou définissez la variable avec la commande <=>.
Quelque chose comme cela devrait donner une idée de ce que vous pouvez faire ("mymerge" est un outil fictif).
git config merge.tool mymerge
git config merge.mymerge.cmd 'mymerge.exe --base "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"'
Une fois que vous avez configuré votre outil de fusion préféré, il vous suffit de lancer <=> toutes les fois que vous avez des conflits à résoudre.
L'outil p4merge de Perforce est un très bon outil de fusion autonome.
Au-delà de la comparaison sur Windows 7
git config --global merge.tool bc3
git config --global mergetool.bc3.path "C:\Program Files (x86)\Beyond Compare 3\BCompare.exe"
Il semble que les nouvelles versions de git prennent directement en charge p4merge, donc
git config --global merge.tool p4merge
devrait être tout ce dont vous avez besoin, si p4merge.exe est sur votre chemin. Pas besoin de configurer cmd ou path.
J'ai dû supprimer la citation supplémentaire à l'aide de msysGit sous Windows 7, sans savoir pourquoi.
git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
Si vous le faites via cygwin, vous devrez peut-être utiliser cygpath:
git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge `cygpath -w $BASE` `cygpath -w $LOCAL` `cygpath -w $REMOTE` `cygpath -w $MERGED`'
Bah, cela a finalement fonctionné pour moi (Windows 7 + Cygwin + TortoiseMerge):
Dans .git / config:
cmd = TortoiseMerge.exe /base:$(cygpath -d \"$BASE\") /theirs:$(cygpath -d \"$REMOTE\") /mine:$(cygpath -d \"$LOCAL\") /merged:$(cygpath -d \"$MERGED\")
Merci aux affiches précédentes pour le conseil d'utilisation de cygpath!
J'utilise une application appelée WinMerge ( http://winmerge.org/ ) informations de leur manuel ( http://manual.winmerge.org/CommandLine.html )
c'est le script bash que j'utilise depuis la mergetool
directive via .gitconfig
#!/bin/sh
# using winmerge with git
# replaces unix style null files with a newly created empty windows temp file
file1=$1
if [ "$file1" == '/dev/null' ] || [ "$file1" == '\\.\nul' ] || [ ! -e "$file1" ]
then
file1="/tmp/gitnull"
`echo "">$file1`
fi
file2=$2
if [ "$file2" == '/dev/null' ] || [ "$file2" == '\\.\nul' ] || [ ! -e "$file2" ]
then
file2="/tmp/gitnull"
`echo "">$file2`
fi
echo diff : $1 -- $2
"C:\Program files (x86)\WinMerge\WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$file1" "$file2"
Fondamentalement, le compte bash indique quand le résultat du diff est créé dans un fichier vide et crée un nouveau fichier temporaire à l’emplacement correct.
J'ai trouvé deux façons de configurer & "; SourceGear DiffMerge &"; comme difftool et mergetool dans github Windows.
Les commandes suivantes dans une fenêtre d'invite de commande mettront à jour votre .gitconfig afin de configurer GIT, utilisez DiffMerge:
git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd 'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"'
git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd 'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe -merge -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"'
[ OU ]
Ajoutez les lignes suivantes à votre fichier .gitconfig. Ce fichier doit figurer dans votre répertoire personnel sous C: \ Users \ UserName:
[diff]
tool = diffmerge
[difftool "diffmerge"]
cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"
[merge]
tool = diffmerge
[mergetool "diffmerge"]
trustExitCode = true
cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe -merge -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"
Vous pouvez également ajouter ces options:
git config --global merge.tool p4mergetool
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
git config --global mergetool.p4mergetool.trustExitCode false
git config --global mergetool.keepBackup false
De plus, je ne sais pas pourquoi mais la citation et la barre oblique de la réponse de Milan Gardian m'a tout gâché.
Si quelqu'un veut utiliser gvim en tant qu'outil de différenciation sur TortoiseGit, vous devez entrer ceci dans la saisie de texte du chemin d'accès à l'outil de différenciation externe:
path\to\gvim.exe -f -d -c "wincmd R" -c "wincmd R" -c "wincmd h" -c "wincmd J"
Pour IntelliJ IDEA (Community Edition) Configuration à trois canaux git mergetool dans un environnement Windows (~/.gitconfig
)
Cygwin
[mergetool "ideamerge"]
cmd = C:/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe merge `cygpath -wa $LOCAL` `cygpath -wa $REMOTE` `cygpath -wa $BASE` `cygpath -wa $MERGED`
[merge]
tool = ideamerge
Msys
[mergetool "ideamerge"]
cmd = "/c/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe" merge `~/winpath.sh $LOCAL` `~/winpath.sh $REMOTE` `~/winpath.sh $BASE` `~/winpath.sh $MERGED`
[merge]
tool = ideamerge
Le fichier ~ / winpath.sh consiste à convertir les chemins d'accès en Windows sur msys. Il provient de la question de conversion du chemin d'accès msys sur stackoverflow
#! /bin/sh
function wpath {
if [ -z "$1" ]; then
echo "$@"
else
if [ -f "$1" ]; then
local dir=$(dirname "$1")
local fn=$(basename "$1")
echo "$(cd "$dir"; echo "$(pwd -W)/$fn")" | sed 's|/|\\|g';
else
if [ -d "$1" ]; then
echo "$(cd "$1"; pwd -W)" | sed 's|/|\\|g';
else
echo "$1" | sed 's|^/\(.\)/|\1:\\|g; s|/|\\|g';
fi
fi
fi
}
wpath "$@"
Pour configurer p4merge, installé à l'aide de chocolatey sur des fenêtres pour les fusions et les diff, jetez un oeil ici: https://gist.github.com/CamW/88e95ea8d9f0786d746a
Si vous rencontrez des problèmes pour ouvrir p4merge à partir de SourceTree, recherchez votre fichier de configuration local nommé config sous MyRepo.git et supprimez toute configuration de fusion. Dans mon cas, il essayait d'ouvrir Meld que je viens de désinstaller