git windows-xp msysgit diffmerge

¿Cómo configuro DiffMerge con msysgit/gitk?



windows-xp (4)

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

  • Estoy usando msysgit 1.6.2.2 en Windows XP
  • Durante la instalación, elegí la opción 1 para "Usar Git Bash solamente"

Estoy tratando de armar un script contenedor que puedo usar para reemplazar el git diff integrado con DiffMerge. Basado en este hilo en SO, creé 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%

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

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

Si ejecuto Git Bash y ejecuto git diff HEAD HEAD ~ - myfile

Recibo un mensaje File (/dev/null) not found , que dado que estoy en Windows no es sorprendente.

Presionando, lancé gitk y en Editar> Preferencias, elegí el mismo script de envoltura. Al probar la opción "diff externo" para un archivo en particular, aparece el mensaje de error críptico Unknown Option "

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


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

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

Así que trata de poner tu ".bat" (aunque no es exactamente un script de 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 de diferencias.

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 '', acabo de escribir O '' ESC '' para cerrar y salir de la herramienta diff: ¡funciona muy bien!)

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 qué parámetros se pasan cuando llamo a git diff ?

1 / ¡En realidad hay una manera de ver cuáles son los parámetros 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 (e.g., -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ás 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 ", así que la primera pregunta es:
¿Está seguro de que el bit " /title1 " no se puede utilizar como " -title1 " o " -t1 " o " --title1 " o " --t1 "? Eso es lo que Is puede ver en el capítulo 9 "Argumentos de las líneas de comando" de la documentación pdf de DiffMerge .
Si no, sospecho que algunas comillas dobles son para delimitar correctamente los diferentes parámetros. 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 la forma " -title1 " o " -t1 ":

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

debería funcionar bien


Busqué por todo Internet la respuesta a esto. He intentado todas las soluciones anteriores y en otros lugares. Podría hacer que la parte de fusión funcione y no la parte de diferencia o viceversa. Entonces, lo que finalmente hice fue juntar mi propia solución simple de toda la información que obtuve en Internet que me funciona. No requiere ningún script solo que edite su .gitconfig que normalmente reside en el siguiente directorio C:/Documents and Settings/[username] Ya deberá tener instalado el programa DiffMerge.

Aquí está el extracto relevante de mi archivo .gitconfig . Solo DiffMerge editar la ruta a donde está tu versión de DiffMerge . Tenga en cuenta que usé el antiguo formato 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 comandos git config --replace --global [options] si así lo desea.

Esta solución simple funciona perfectamente para mí, también. Para versiones más recientes de DiffMerge (3.3.1), se debe cambiar la ruta del comando:

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 va a http://therightstuff.de/2009/01/28/Setting-Up-SourceGear-DiffMerge-With-Git.aspx ;)


VonC: el cambio a -t1 y -t2 corrigió los errores. Diffmerge ahora funciona para git bash :)

Después de pinchar un poco en el parche gitk que agregó el soporte de Dif. Externa, me di cuenta de que está llamando a un programa de Difusión Externa directamente con los dos archivos como argumentos. Así que modifiqué gitk> Editar> Preferencias y puse el siguiente comando directamente en la opción de la herramienta de diferencia externa:

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

Ahora tengo a DiffMerge trabajando para gitk también :-)