¿Cómo configuro DiffMerge con msysgit / gitk?

Acabo de empezar a usar Git y es posible que haya olvidado algo obvio, pero aquí va:

  • Estoy usando msysgit 1.6.2.2 en Windows XP
  • Durante la installation, escogí la opción 1 para "Usar solo Git Bash"

Estoy tratando de armar un script de envoltura que pueda usar para replace el diff de git incorporado con DiffMerge. Basado en este hilo en SO, creé el siguiente file 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 file bat bajo% GIT_INSTALL% / cmd y edité mi file .gitconfig de la siguiente manera:

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

Si lanzo Git Bash y ejecuto git diff HEAD HEAD ~ – myfile

Aparece un post que File (\dev\null) not found cual dado que estoy en Windows no es sorprendente.

Al presionar, lancé gitk y en Edición> Preferences, elegí el mismo guión de envoltura. Al probar la opción "diff externo" para un file en particular, aparece el post de error críptico Unknown Option "

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

Acabo de experimentar una experiencia similar con la configuration de Notepad ++ como mi editor externo con msysgit1.6.2.2 .

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

Intenta poner tu ".bat" (aunque no es exactamente un script bat, la extensión no es importante aquí):

 #!/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 hacer todo el ' \ ' go ' / ': lo hacen los scripts de Git llamando a la herramienta externa diff.

No lo probé con DiffMerge, pero con WinMerge, funciona bien, tanto desde una session 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 ', simplemente escribí ' ESC ' para cerrar y salir de la herramienta diff: ¡eso funciona muy bien!)


texto alternativo average_geek agrega 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 alguna manera de ver cuáles son los parameters que se pasan cuando llamo a git diff ?

1 / ¡De hecho, hay una manera de ver cuáles son los parameters que se pasan!
Agregue la siguiente línea en el 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 (eg, -m or -F for git-commit)." exit 1 ;; esac #### ADD THIS LINE BELOW echo >&2 "editor is ${GIT_EDITOR:=vi} $@." #### END ADDITION ABOVE eval "${GIT_EDITOR:=vi}" '"$@"' } 

Verá a qué editor se está llamando, con qué parámetro.

Ahora, con respecto a la parte "Parámetro inesperado":
Tuve el mismo tipo de error cuando llamé a WinMergeU.exe con " /e /ub " en lugar de " -e -ub ", por lo que la primera pregunta es:
¿Estás seguro de que el bit " /title1 " no se puede usar como " -title1 " o " -t1 " o " --title1 " o " --t1 "? Eso es lo que se puede ver en el capítulo 9 "Argumentos de líneas de command" de la documentation en pdf de DiffMerge .
Si no, sospecho que algunas comillas dobles están en order para delimitar adecuadamente los diferentes parameters. Algo 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 el -title1 " -title1 " o " -t1 ":

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

debería funcionar bien

Busqué en Internet toda 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. Entonces, lo que finalmente hice fue crear mi propia solución simple a partir de toda la información que obtuve en Internet que funciona para mí. No requiere ningún script solo que edite su .gitconfig que normalmente reside en el siguiente directory C:\Documents and Settings\[username] Necesitará tener el progtwig DiffMerge ya instalado.

Aquí hay un extracto relevante de mi file .gitconfig . Solo deberá editar la ruta hasta donde se encuentra su versión de DiffMerge . Tenga en count que utilicé el viejo formatting DOS 8.3 en la ruta

 [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 commands git config --replace --global [options] si lo desea.


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

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

Esto funciona para mí con lo siguiente:

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 crédito es para http://therightstuff.de/2009/01/28/Setting-Up-SourceGear-DiffMerge-With-Git.aspx 😉

VonC: al cambiar a -t1 y -t2 se corrigieron los errores. Diffmerge ahora trabaja para git bash 🙂

Después de hurgar un poco en el parche de gitk que agregó compatibilidad con External Diff, me di count de que llamaba a un progtwig de Diff externo directamente con los dos files como arguments. Así que modifiqué gitk> Edit> Preferences y puse el siguiente command directamente en la opción External Diff Tool:

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

Ahora tengo DiffMerge trabajando para gitk también 🙂