Pregunta

He intentado msysGit y Git en Cygwin. Ambos funcionan bien por sí mismos y ambos ejecutan gitk y git-gui perfectamente.

Ahora, ¿cómo diablos configuro una herramienta de combinación? (Vimdiff funciona en Cygwin, pero preferiblemente me gustaría algo un poco más fácil de usar para algunos de nuestros compañeros de trabajo amantes de Windows).

¿Fue útil?

Solución

Para seguir la respuesta de Charles Bailey, aquí está mi configuración de git que está usando p4merge (herramienta de combinación de 3 vías multiplataforma gratuita); probado en la instalación de msys Git (Windows):

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"'

o, desde un shell de Windows cmd.exe, la segunda línea se convierte en:

git config --global mergetool.p4merge.cmd "p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""

Los cambios (en relación con Charles Bailey):

  • agregado a la configuración global de git, es decir, válido para todos los proyectos de git, no solo el actual
  • el valor de configuración de la herramienta personalizada reside en " mergetool. [tool] .cmd " ;, no " merge. [tool] .cmd " (tonto, pasé una hora resolviendo problemas por los que git seguía quejándose de una herramienta inexistente)
  • agregó comillas dobles para todos los nombres de archivo para que la herramienta de combinación pueda encontrar archivos con espacios (probé esto en msys Git de Powershell)
  • tenga en cuenta que, de forma predeterminada, Perforce agregará su directorio de instalación a PATH, por lo que no es necesario especificar la ruta completa para p4merge en el comando

Descargar: http: //www.perforce. com / product / components / perforce-visual-merge-and-diff-tools


EDITAR (febrero de 2014)

Como señaló @Gregory Pakosz , último msys git ahora " nativamente " admite p4merge (probado en 1.8.5.2.msysgit.0 ).

Puede mostrar la lista de herramientas compatibles ejecutando:

git mergetool --tool-help

Debería ver p4merge en la lista disponible o válida . De lo contrario, actualice su git.

Si p4merge aparece como disponible , está en su PATH y solo tiene que configurar merge.tool :

git config --global merge.tool p4merge

Si figuraba como válido , debe definir mergetool.p4merge.path además de merge.tool :

git config --global mergetool.p4merge.path c:/Users/my-login/AppData/Local/Perforce/p4merge.exe
  • Lo anterior es una ruta de ejemplo cuando se instaló p4merge para el usuario actual, no en todo el sistema (no necesita derechos de administrador ni elevación de UAC)
  • Aunque ~ debería expandirse al directorio de inicio del usuario actual (por lo que, en teoría, la ruta debería ser ~/AppData/Local/Perforce/p4merge.exe), esto no funcionó para mí
  • Aún mejor hubiera sido aprovechar una variable de entorno (por ejemplo, $LOCALAPPDATA/Perforce/p4merge.exe), git no parece estar expandiendo las variables de entorno para las rutas (si sabe cómo hacer que esto funcione, hágamelo saber o actualice esto respuesta)

Otros consejos

la configuración de mergetool.p4merge.cmd ya no funcionará ya que Git ha comenzado a tratar de admitir p4merge, consulte libexec / git-core / git-mergetool--lib.así que solo necesitamos especificar la ruta de mergetool para git, por ejemplo el p4merge:

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

Entonces funcionará.

Estoy usando Portable Git en WinXP (¡funciona de maravilla!), y necesitaba resolver un conflicto que surgió en la ramificación. De todas las gui que verifiqué, KDiff3 demostró ser el más transparente de usar.

Pero encontré las instrucciones que necesitaba para que funcionara en Windows en esta publicación de blog , instrucciones que difieren ligeramente de los otros enfoques enumerados aquí. Básicamente equivalía a agregar estas líneas a mi .gitconfig archivo:

[merge]
    tool = kdiff3

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

¡Funciona bien ahora!

En Cygwin, lo único que funcionó para mí es lo siguiente:

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)"'

Además, me gusta desactivar el mensaje de solicitud de difftool:

git config --global difftool.prompt false

git mergetool es totalmente configurable para que pueda elegir su herramienta favorita.

La documentación completa está aquí: http: // www.kernel.org/pub/software/scm/git/docs/git-mergetool.html

En resumen, puede establecer una herramienta de combinación predeterminada configurando la variable de configuración del usuario merge.tool.

Si la herramienta de combinación es una de las admitidas de forma nativa, solo tiene que establecer mergetool.<tool>.path en la ruta completa de la herramienta (reemplace <tool> por lo que ha configurado para que sea mergetool.<tool>.cmd.

De lo contrario, puede establecer $BASE, $LOCAL, $REMOTE, $MERGED en un bit de shell para evaluar en tiempo de ejecución con las variables de shell git config configuradas en los archivos apropiados. Debe tener un poco de cuidado con el escape si edita directamente un archivo de configuración o establece la variable con el comando <=>.

Algo como esto debería darle el sabor de lo que puede hacer ('mymerge' es una herramienta ficticia).

git config merge.tool mymerge
git config merge.mymerge.cmd 'mymerge.exe --base "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"'

Una vez que haya configurado su herramienta de fusión favorita, es simplemente cuestión de ejecutar <=> cuando tenga conflictos que resolver.

La herramienta p4merge de Perforce es una herramienta de combinación independiente bastante buena.

Para más allá de comparar en Windows 7

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

Parece que las versiones más nuevas de git admiten p4merge directamente, así que

git config --global merge.tool p4merge

debería ser todo lo que necesita, si p4merge.exe está en su camino. No es necesario configurar cmd o ruta.

Como ya se respondió aquí (y aquí y < a href = "https://stackoverflow.com/questions/161813/how-do-i-fix-merge-conflicts-in-git"> aquí ), mergetool es el comando para configurar esto. Para una interfaz gráfica agradable, recomiendo kdiff3 (GPL).

Tuve que descartar las citas adicionales usando msysGit en Windows 7, no estoy seguro de por qué.

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

Si está haciendo esto a través de cygwin, es posible que necesite usar 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, esto finalmente funcionó para mí (Windows 7 + Cygwin + TortoiseMerge):

En .git / config:

cmd = TortoiseMerge.exe /base:$(cygpath -d \"$BASE\") /theirs:$(cygpath -d \"$REMOTE\") /mine:$(cygpath -d \"$LOCAL\") /merged:$(cygpath -d \"$MERGED\")

¡Gracias a los carteles anteriores por la sugerencia de usar Cygpath!

uso una aplicación llamada WinMerge ( http://winmerge.org/ ) información de su manual ( http://manual.winmerge.org/CommandLine.html )

esta es la secuencia de comandos bash que uso de la directiva mergetool a través de .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"

básicamente, bash explica cuándo el resultado de la diferencia en un archivo vacío y crea un nuevo archivo temporal en la ubicación correcta.

Encontré dos formas de configurar " SourceGear DiffMerge " como difftool y mergetool en github Windows.

Los siguientes comandos en una ventana del símbolo del sistema actualizarán su .gitconfig para configurar GIT usando 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\"'

[ O ]

Agregue las siguientes líneas a su .gitconfig. Este archivo debe estar en su directorio de inicio en 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\"

Es posible que desee agregar estas opciones también:

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

Además, no sé por qué, pero las citas y cortes de la respuesta de Milan Gardian me arruinaron las cosas.

Si alguien quiere usar gvim como su herramienta diff en TortoiseGit, entonces esto es lo que necesita ingresar en el ingreso de texto para la ruta a la herramienta diff externa:

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

Para la configuración de combinación de git mergetool de IntelliJ IDEA (Community Edition) en el entorno de 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

El ~ / winpath.sh es para convertir rutas a Windows en msys y se toma de pregunta de conversión de ruta msys en 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 "$@" 

Para configurar p4merge, instalado usando chocolatey en windows para fusionar y diff, mira aquí: https://gist.github.com/CamW/88e95ea8d9f0786d746a

Si tiene problemas para abrir p4merge desde SourceTree, busque su archivo de configuración local llamado config en MyRepo.git y elimine cualquier configuración de combinación. En mi caso, estaba tratando de abrir Meld, que acabo de desinstalar

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top