2009-04-23 9 views
21

que acaba de comenzar el uso de Git y es posible que me he perdido algo obvio, pero aquí va:¿Cómo configuro DiffMerge con msysgit/gitk?

  • estoy usando msysgit 1.6.2.2 en Windows XP
  • Durante la instalación, me cogí la opción 1 para "Usar solo Git Bash"

Estoy tratando de armar un script de envoltura que pueda usar para reemplazar el diff de git incorporado con DiffMerge. Sobre la base de this thread en tanto, he creado el siguiente archivo por lotes:

@echo off 
REM ---- Switch forward slashes to back slashes ---- 
set oldW=%2 
set oldW=%oldW:/=\% 
set newW=%5 
set newW=%newW:/=\% 

REM ---- Launch DiffMerge ---- 
"C:/Programs/SourceGear/DiffMerge/DiffMerge.exe" /title1="Old Version" %oldW% /title2="New Version" %newW% 

coloqué el archivo bat en% GIT_INSTALL%/cmd y editado mi archivo .gitconfig de la siguiente manera:

[diff] 
external = C:/Programs/git/cmd/git-diff-wrapper.bat 

Si lanzo Git Bash y ejecutar git diff HEAD HEAD ~ - miarchivo

Recibo un mensaje File (\dev\null) not found - lo cual teniendo en cuenta que estoy en Windows no es sorprendente.

Al continuar, lancé gitk y en Edición> Preferencias, elegí el mismo guión de envoltura. Probar la opción "diff externo" para un archivo en particular da el mensaje de error críptico Unknown Option "

Claramente, no tengo idea de lo que estoy haciendo, así que cualquier ayuda sería muy apreciada.

+0

Acaba de terminar mi respuesta con algunos "DiffMerge" elementos específicos, conforme a lo solicitado. – VonC

Respuesta

9

Acabo de experimentar una experiencia similar con setting Notepad++ as my external editor with msysgit1.6.2.2.

La clave era darse cuenta de que el contenedor no era un script DOS, sino un script/bin/sh.

Así que trate de poner en su ".bat" (a pesar de que no es exactamente un guión murciélago, la extensión no es importante en este caso):

#!/bin/sh 

# diff is called by git with 7 parameters: 
# path old-file old-hex old-mode new-file new-hex new-mode 

"C:/Programs/SourceGear/DiffMerge/DiffMerge.exe" /title1="Old Version" "$2" /title2="New Version" "$5" | cat 

No se preocupe por lo que todos los '\' vaya '/': se realiza mediante los scripts de Git llamando a la herramienta externa diff.

No lo probé con DiffMerge, pero con WinMerge, funciona bien, tanto desde una sesión de DOS como desde un Git Shell.

#!/bin/sh 
"C:/Program Files/WinMerge/WinMergeU.exe" -e -ub "$2" "$5" | cat 

(con la opción '-e', que tienen tipo que acaba de OT en 'ESC' para cerrar y salir de la herramienta de diferencias: que funciona muy bien)


alt textaverage_geek añade en los comentarios :

agregó el encabezado '/bin/sh' e intentó ejecutar git diff nuevamente.
Esta vez el error es:
Unexpected parameter 'C:/Docume~/avggeek/LOCALS~1/Temp/.diff_b08444
¿Hay una manera de ver cuáles son los parámetros conseguir pasar cuando llamo git diff?

1/En realidad, hay una manera de ver lo que están consiguiendo que pasaban los parámetros!
añadir la siguiente línea en el archivo C:\Program Files\Git\libexec\git-core\git-sh-setup:

git_editor() { 
    : "${GIT_EDITOR:=$(git config core.editor)}" 
    : "${GIT_EDITOR:=${VISUAL:-${EDITOR}}}" 
    case "$GIT_EDITOR,$TERM" in 
    ,dumb) 
     echo >&2 "No editor specified in GIT_EDITOR, core.editor, VISUAL," 
     echo >&2 "or EDITOR. Tried to fall back to vi but terminal is dumb." 
     echo >&2 "Please set one of these variables to an appropriate" 
     echo >&2 "editor or run $0 with options that will not cause an" 
     echo >&2 "editor to be invoked (e.g., -m or -F for git-commit)." 
     exit 1 
     ;; 
    esac 
#### ADD THIS LINE BELOW 
    echo >&2 "editor is ${GIT_EDITOR:=vi} [email protected]" 
#### END ADDITION ABOVE 
    eval "${GIT_EDITOR:=vi}" '"[email protected]"' 
} 

Usted verá lo que el editor está siendo llamado, con lo que el parámetro.

Ahora, en relación con el parámetro "inesperado" parte:
Yo tenía el mismo tipo de error cuando llamé WinMergeU.exe con "/e /ub" en lugar de "-e -ub", por lo que la primera pregunta es:
¿Seguro que el bit "/title1" no se pudo usar como "-title1" o "-t1" o "--title1" o "--t1"? Eso es lo que se puede ver en el chapter 9 "Command Lines Arguments" of the pdf documentation of DiffMerge.
Si no, sospecho que hay comillas dobles para delimitar adecuadamente los diferentes parámetros. Algo así como:

"/title1="Old Version"" "$2" "/title2="New Version"" "$5" 
or 
"/title1=\"Old Version\"" "$2" "/title2=\"New Version\"" "$5" 

Pero mi dinero preferiría estar en la "-title1" o forma "-t1":

-t1="Old Version" "$2" -t2="New Version" "$5" 

debería funcionar bien.

+0

Agregué el encabezado '/ bin/sh' e intenté ejecutar git diff nuevamente. Esta vez el error es: Parámetro inesperado 'C: /Docume~'/avggeek/LOCALS~1/Temp/.diff_b08444 ¿Hay alguna manera de ver qué parámetros se pasan cuando llamo a 'git diff'? –

+0

"La clave era darse cuenta de que el contenedor no era un script DOS, sino un script/bin/sh". Para aquellos que como yo no activamos la opción "Usar solo Git Bash", debe ser un script de Windows (.cmd está más de moda ...) Igual que tu pero usando% 2 en lugar de $ 2 – PhiLho

4

VonC - al cambiar a -t1 y -t2 corrigió los errores. DiffMerge ahora trabaja para fiesta de git :)

Después de un poco de hurgando en the gitk patch que ha añadido soporte externas de diferencias, me di cuenta de que está llamando a un programa externas de diferencias directamente con los dos archivos como argumentos. Así que he modificado gitk> Editar> Preferencias y poner el siguiente comando directamente en la opción de herramientas externas de diferencias:

"C:/Programs/SourceGear/DiffMerge/DiffMerge.exe" -t1="Old Version" -t2="New Version" 

ahora tengo DiffMerge trabajar para gitk también :-)

+0

¡Impresionante, funcionó! Y gracias por los comentarios sobre gitk. +1 – VonC

+0

Con la última ruta Diffmerge es más probable "C:/Archivos de programa/SourceGear/Common/DiffMerge/sgdm.exe" y -t1/-t2 ya no funciona. Si dejas eso de lado obtienes al menos la ventana de comparación – Ghita

8

Esto funciona para mí con la siguiente manera :

En ~/.gitconfig:

[merge] 
tool = diffmerge 
[mergetool "diffmerge"] 
cmd = \"C:/Program Files/git/cmd/git-diffmerge-merge.sh\" \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\" 
trustExitCode = false 

En C:\Program Files\Git\cmd\git-diffmerge-merge.sh:

#!/bin/sh 

localPath="$2" 
basePath="$1" 
remotePath="$3" 
resultPath="$4" 

if [ ! -f $basePath ] 
then 
    basePath="~/diffmerge-empty" 
fi 

"C:/Program Files/SourceGear/DiffMerge/DiffMerge.exe" --merge --result="$resultPath" "$localPath" "$basePath" "$remotePath" --title1="Mine" --title2="Merged: $4" --title3="Theirs" 

parte del mérito es de http://therightstuff.de/2009/01/28/Setting-Up-SourceGear-DiffMerge-With-Git.aspx;)

+0

Gracias. Me salvaste con este. – Andrei

14

miré por toda la Internet para la respuesta a esto. Intenté todas las soluciones anteriores y en otros lugares. Pude hacer funcionar la parte de combinación y no la parte de diferencia o viceversa. Así que lo que finalmente hice fue hackear mi propia solución simple de toda la información que obtuve en Internet que funcionaba para mí. No requiere más scripts que solo edite su .gitconfig que normalmente reside en el siguiente directorio C:\Documents and Settings\[username] Deberá tener instalado el programa DiffMerge.

Aquí está el extracto relevante de mi archivo .gitconfig. Solo deberá editar la ruta a donde se encuentra su versión de DiffMerge. Nota que utilicé el viejo DOS 8.3 Formato en el camino

[diff] 
    tool = diffm 
[difftool "diffm"] 
    cmd = "H:/PROGRA~1/SourceGear/DiffMerge/DiffMerge.exe $LOCAL $REMOTE" 
    prompt = false 

[merge] 
    tool = diffmerge 
[mergetool "diffmerge"] 
    cmd = "H:/PROGRA~1/SourceGear/DiffMerge/DiffMerge.exe --merge --result=$MERGED $LOCAL $BASE $REMOTE" 
    trustExitCode = false 
    keepBackup = false 

También puede configurarlo usando los comandos git config --replace --global [options] si así lo desea.


Esta solución simple funciona perfectamente para mí también. Para las versiones más recientes de DiffMerge (3.3.1), la ruta de comandos necesita ser cambiado:

cmd = "C:/PROGRA~1/SourceGear/Common/DiffMerge/sgdm.exe ...etc..." 
+0

Apoyos para una solución simple que simplemente tiene sentido. – Bnjmn

+0

Me gusta @Bnjmn dijo, +1 para una solución simple que solo requiere editar .gitconfig – JeffH

+0

La clave para mí fue cambiar '.../merge/replace = ...' a '... --merge --replace =. ..'; [Los documentos de SourceGear] (https://sourcegear.com/diffmerge/webhelp/sec__git__windows__msysgit.html) parecen estar equivocados. –

Cuestiones relacionadas