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.)

Était-ce utile?

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.

Comme déjà répondu ici (et ici et < a href = "https://stackoverflow.com/questions/161813/how-do-i-fix-merge-conflicts-in-git"> ici ), mergetool est la commande permettant de configurer cela. Pour une interface graphique intéressante, je recommande kdiff3 (GPL).

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top