780 votos

¿Cómo puedo ver 'git diff' de salida con una visual programa diff?

Cuando yo escriba 'git diff', quiero ver el resultado con mi visual herramienta de comparación de elección (SourceGear diffmerge en Windows). ¿Cómo puedo configurar git para hacer esto?

396voto

VonC Puntos 414372

Desde Git1.6.3, puede utilizar el git difftool guión: ver mi respuesta a continuación.


Puede ser que este artículo le ayudará. Aquí están las mejores partes:

Hay dos maneras diferentes para especificar externa de una herramienta de comparación.

El primero es el método que utiliza, mediante el establecimiento de la GIT_EXTERNAL_DIFF variable. Sin embargo, la variable apunta a la ruta de acceso completa del archivo ejecutable. Por otra parte, el archivo ejecutable especificado por GIT_EXTERNAL_DIFF será llamado con un conjunto fijo de 7 argumentos:

path old-file old-hex old-mode new-file new-hex new-mode

Como la mayoría de los diff herramientas requieren de un orden diferente (y sólo algunos) de los argumentos, lo más probable es que tenga que especificar un contenedor de secuencia de comandos en su lugar, que a su vez llama a la real herramienta de comparación.

El segundo método, que yo prefiero, es para configurar el externo de la herramienta de comparación, a través de "git config". He aquí lo que hice:

1) Crear un contenedor de secuencia de comandos "git-diff-wrapper.sh" que contiene algo parecido a

-->8-(snip)--
#!/bin/sh

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

"<path_to_diff_executable>" "$2" "$5" | cat
--8<-(snap)--

Como se puede ver, sólo el segundo ("old-file") y quinto ("nuevo archivo") argumentos se pasa a la herramienta de comparación.

2) Tipo de

$ git config --global diff.external <path_to_wrapper_script>

en el símbolo del sistema, reemplazando con la ruta de acceso "git-diff-wrapper.sh", por lo que su ~/.gitconfig contiene

-->8-(snip)--
[diff]
    external = <path_to_wrapper_script>
--8<-(snap)--

Asegúrese de utilizar la sintaxis correcta para especificar las rutas de acceso al contenedor de secuencia de comandos y diferencial la herramienta, es decir. utilice hacia adelante recortó en lugar de barras diagonales inversas. En mi caso, he

[diff]
    external = c:/Documents and Settings/sschuber/git-diff-wrapper.sh

en .gitconfig y

"d:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat

en el contenedor de secuencia de comandos. La mente detrás de "gato"!

(Supongo que el '| cat' es necesario sólo para algunos programas que no puede devolver un adecuado coherente o el estado de retorno. Es posible que desee probar sin la cola de gato si su herramienta de comparación ha explícito estado de la devolución)


Que (el artículo citado arriba) es la teoría de herramienta externa se define a través del archivo de configuración (no a través de la variable de entorno).
En la práctica (aún para el archivo de configuración de definición de herramienta externa), puede referirse a:

216voto

VonC Puntos 414372

Para completar mi anterior "diff.external" config respuesta anterior:

Como mencionado por Jakub, Git1.6.3 introducido git difftool, propuesto originalmente en septiembre de 2008:

USO='[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
(Véase --extcmd en la última parte de esta respuesta)

$LOCAL contiene el contenido del archivo a partir de la revisión y $REMOTE contiene el contenido del archivo en la final de la revisión.
$BASE contiene el contenido del archivo en la wor

Se trata básicamente de git-mergetool modificados para operar en el git índice/worktree.

El uso habitual del caso para que este script es cuando usted simulados o unstaged cambios y le gustaría ver los cambios en un lado-por-lado visor de diferencias (p. ej. xxdiff, tkdiff, etc.).

git difftool [<filename>*]

Otro caso de uso es cuando gustaría ver la misma información, pero están comparando arbitraria comete (esta es la parte donde el revarg de análisis podría ser mejor)

git difftool --start=HEAD^ --end=HEAD [-- <filename>*]

El último caso de uso es cuando se desea comparar su actual worktree a algo distinto de la HEAD (p. ej. una etiqueta)

git difftool --commit=v1.0.0 [-- <filename>*]

Caso práctico para la configuración de difftool con tu herramienta de comparación:

C:\myGitRepo>git config --global diff.tool winmerge
C:\myGitRepo>git config --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
C:\myGitRepo>git config --global difftool.prompt false

Con winmerge.sh almacenado en un directorio a parte de su PATHde acceso:

#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"C:/Program Files/WinMerge/WinMergeU.exe" -e -ub "$1" "$2"

Si usted tiene otra herramienta (kdiff3, P4Diff, ...), crear otro script de shell, y el correspondiente difftool.myDiffTool.cmd config directiva.
Entonces usted puede fácilmente cambiar de herramientas con el diff.tool config.

Tiene también esta entrada de blog por Dave agregar otros detalles.

El interés de esta configuración es el winmerge.shsecuencia de comandos: se puede personalizar a tener en cuenta en casos especiales.

Véase, por ejemplo, David de Mármol's respuesta a continuación un ejemplo en el que se aborda:

  • los nuevos archivos, ya sea en origen o en destino
  • quita los archivos, ya sea en origen o en destino

Como Kem Mason menciona en su respuesta, usted puede también evitar cualquier contenedor mediante la --extcmd opción:

--extcmd=<command>

Especificar un comando personalizado para la visualización de los diffs. git-difftool ignora la configuración de los valores predeterminados y corre $command $LOCAL $REMOTE cuando se especifica esta opción.

Por ejemplo, esta es la forma en gitk es capaz de ejecutar/uso cualquier diff herramienta.

115voto

Charles Merriam Puntos 4498

En el espíritu de responder a las preguntas que son algo diferentes de lo que pidió. Pruebe esta solución:

$ meld my_project_using_git

Meld entiende git y proporciona la navegación alrededor de los cambios recientes.

42voto

Seba Illingworth Puntos 1536

Con git nuevo difftool, así de simple como agregar esto a su .gitconfig archivo:

[diff]
    tool = any-name
[difftool "any-name"]
    cmd = "\"C:/path/to/my/ext/diff.exe\" \"$LOCAL\" \"$REMOTE\""

También echa un vistazo a diffall, un sencillo script que escribí para extender el molesto (OMI) predeterminado diff comportamiento de la apertura de cada uno en la serie.

40voto

Jakub Narębski Puntos 87537

Desde git versión 1.6.3 hay "git difftool", que se puede configurar para que use su favorito gráfica de la herramienta de comparación. Actualmente soportados-de-la-caja kdiff3, kompare, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, difusa y opendiff; si la herramienta que desea utilizar no aparece en esta lista, usted puede utilizar siempre 'difftool.<tool>.cmd' opción de configuración.

"git difftool" acepta las mismas opciones como "git diff".

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X