web-dev-qa-db-fra.com

Git sur Windows: Comment configurez-vous un outil mergetool?

J'ai essayé msysGit et Git sur Cygwin. Les deux fonctionnent très bien et les deux 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.)

336
Jake

Pour faire suite à la réponse de Charles Bailey, voici ma configuration git qui utilise p4merge (outil de fusion multi-plateformes multiplate-forme gratuit); 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 changements (par rapport à 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 "mergetool. [outil] .cmd", pas "fusion. [outil] .cmd" (ça me rend bête, j'ai passé une heure à dépanner pourquoi git n'arrêtait pas de se plaindre d'un outil inexistant)
  • ajout de guillemets doubles 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 Perforce ajoutera par défaut 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échargement: http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools


EDIT (février 2014)

Comme indiqué par @ Gregory Pakosz , le dernier msys git maintenant "nativement" prend en charge p4merge ( testé sur 1.8.5.2.msysgit.).

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, c'est dans votre CHEMIN et il vous suffit de définir merge.tool =:

git config --global merge.tool p4merge

S'il était indiqué 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 est un exemple de chemin lorsque p4merge a été installé pour l'utilisateur actuel, et non pour l'ensemble du système (ne nécessite ni droits d'administrateur ni élévation du contrôle de compte d'utilisateur).
  • Bien que ~ doive ê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 fonctionna 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 fonctionner cela, merci de me le faire savoir ou de mettre à jour cette réponse. )
296
Milan Gardian

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.

git config --global mergetool.p4merge.path 'C:\Program Files\Perforce\p4merge.exe'
git config --global merge.tool p4merge

Alors ça va marcher.

87
daizuozhuo

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. De toutes les interfaces graphiques que j'ai vérifiées, KDiff s'est révélé le plus transparent à utiliser.

Mais j’ai trouvé les instructions dont j’avais besoin pour que cela fonctionne sous Windows dans cet article de blog , instructions qui diffèrent légèrement des autres approches énumérées ici. Cela revenait essentiellement à ajouter ces lignes à mon fichier .gitconfig:

[merge]
    tool = kdiff3

[mergetool "kdiff3"]
    path = C:/YourPathToBinaryHere/KDiff3/kdiff3.exe
    keepBackup = false
    trustExitCode = false

Travailler bien maintenant!

58
Dɑvïd

Sous Cygwin, la chose seulement 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)"'

De plus, j'aime bien désactiver le message d'invite pour difftool:

git config --global difftool.Prompt false
20
splicer

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 utilisateur merge.tool.

Si l'outil de fusion est l'un de ceux pris en charge de manière 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é comme suit: merge.tool.

Sinon, vous pouvez définir mergetool.<tool>.cmd sur un fragment de Shell à évaluer au moment de l'exécution avec les variables Shell $BASE, $LOCAL, $REMOTE, $MERGED définies sur les fichiers appropriés. Vous devez être prudent avec l'échappement, que vous modifiez directement un fichier de configuration ou que vous définissiez la variable avec la commande git config.

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 simplement d’exécuter git mergetool chaque fois que vous avez des conflits à résoudre.

L'outil p4merge de Perforce est un très bon outil de fusion autonome.

16
CB Bailey

Au-delà de comparer sur Windows 7

git config --global merge.tool bc3
git config --global mergetool.bc3.path "C:\Program Files (x86)\Beyond Compare 3\BCompare.exe"
7
developer747

Il semble que les nouvelles versions de git supportent directement 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.

6
friederbluemle

Comme déjà répondu ici (et ici et ici ), mergetool est la commande pour configurer ceci. Pour une belle interface graphique, je recommande kdiff (GPL).

5
hlovdal

J'ai dû laisser tomber la citation supplémentaire en utilisant msysGit sur Windows 7, je ne sais pas pourquoi.

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
4
Mike Glenn

j'utilise une application appelée WinMerge ( http://winmerge.org/ ) avec les informations de leur manuel ( http://manual.winmerge.org/CommandLine.html )

c'est le script bash que j'utilise depuis la directive mergetool 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"

en gros, bash rend compte du résultat du diff dans un fichier vide et crée un nouveau fichier temporaire à l'emplacement correct.

3
xero

Bah, cela enfin a 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'utiliser cygpath!

3
Nathan McDaniel

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`'
3
idbrii

J'ai trouvé deux façons de configurer "SourceGear DiffMerge" en tant que difftool et mergetool dans github Windows.

Les commandes suivantes dans une fenêtre d'invite de commande mettront à jour votre .gitconfig pour 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 être 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\"
2
vineel

Pour IntelliJ IDEA (Community Edition) Configuration git mergetool à 3 voies 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

~/Winpath.sh consiste à convertir les chemins en Windows sur msys et provient de question de conversion du chemin 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 "$@" 
1
Usman Saleem

Vous voudrez peut-être aussi 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 les citations et les slash de la réponse de Milan Gardian m'ont tout gâché.

1
Roberto

Si quelqu'un veut utiliser gvim comme outil de diff sur TortoiseGit, voici ce que vous devez entrer dans la saisie de texte pour le chemin d'accès à l'outil de diff externe:

path\to\gvim.exe -f -d -c "wincmd R" -c "wincmd R" -c "wincmd h" -c "wincmd J"
1
Attila Szeremi

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

0
Kautsky Lozano

Pour configurer p4merge, installé à l'aide de chocolatey sur Windows pour les fusions et les diff, jetez un coup d'œil ici: https://Gist.github.com/CamW/88e95d8f9f0786d746a

0
CamW