Pregunta

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

  • Estoy usando msysgit 1.6.2.2 en Windows XP
  • Durante la instalación, he elegido la opción 1 para "Git Bash solo"

Estoy tratando de armar un contenedor de secuencia de comandos que puede utilizar para reemplazar el construido en git diff con DiffMerge.Basado en este hilo en ASÍ, 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%

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

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

Si me lanzamiento Git Bash y ejecutar git diff CABEZA CABEZA~ -- miarchivo

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

Pulsando sobre el, me lanzó gitk y en Edición>Preferencias, yo elegí el mismo contenedor de secuencia de comandos.Tratando de la "externa diff" opción para un archivo en particular da el críptico mensaje de error Unknown Option "

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

¿Fue útil?

Solución

Me acaba de experimentar una experiencia algo similar con configuración de Notepad ++ como mi editor externo con msysgit1.6.2.2 .

La clave fue darse cuenta de la envoltura no era una secuencia de comandos de DOS, pero a / bin / sh guión.

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 '\' Go '/':. Se hace por las secuencias de comandos de Git que llaman la herramienta externa de diferenciar

no he probado con DiffMerge, pero con WinMerge, funciona muy bien, tanto desde una sesión de DOS o un Shell Git.

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

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


text alt average_geek añade en los comentarios:

  

añade el encabezado '/bin/sh' y trató de correr git diff de nuevo.
  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 / Hay en realidad es una manera de ver lo que están consiguiendo que pasaban los parámetros
Agregue 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} $@."
#### END ADDITION ABOVE
    eval "${GIT_EDITOR:=vi}" '"$@"'
}

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 podría ser utilizado como "-title1" o "-t1" o "--title1" o "--t1"? Eso es lo que se puede ver en la capítulo 9 "Comando líneas Argumentos" de la documentación en pdf de DiffMerge .
Si no es así, sospecho algunas citas dobles son con el fin de 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.

Otros consejos

Miré por todas partes el internet para encontrar la respuesta a esto.He probado todas las soluciones anteriores y en otros lugares.Yo podría conseguir la combinación con el trabajo y no el diff de la parte o viceversa.Así que lo que hice finalmente fue a hackear mi propia solución simple a partir de toda la información que me metí en internet que funciona para mí.No requiere sólo secuencias de comandos que se modifica el .gitconfig que normalmente se encuentra en el directorio siguiente C:\Documents and Settings\[username] Usted necesitará tener DiffMerge programa ya instalado.

Aquí es pertinente extracto de mi .gitconfig archivo.Usted sólo tendrá que modificar la ruta de acceso donde su versión de de DiffMerge es. Nota que he utilizado 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 configurar el uso de los comandos git config --replace --global [options] si así lo desea.


Esta sencilla solución funciona a la perfección para mí, demasiado.Para las versiones más recientes de DiffMerge (3.3.1), la ruta de comandos necesita ser modificado:

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

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"

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

VonC - cambiar a -T1 y -t2 fija los errores. DiffMerge ahora trabaja para fiesta de git:)

Después de un poco de empujar en el parche gitk que 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 he DiffMerge trabajar para gitk también :-)

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