Saltar al contenido

¿Cómo veo la salida de ‘git diff’ con mi visor / herramienta de diferencias preferido?

Este team de expertos pasados ciertos días de trabajo y de recopilar de datos, hemos dado con la respuesta, esperamos que resulte de utilidad para tu trabajo.

Solución:

Desde Git1.6.3, puede usar el script de git difftool: vea mi respuesta a continuación.


Puede que este artículo te ayude. Aquí están las mejores partes:

Hay dos formas diferentes de especificar una herramienta de diferenciación externa.

El primero es el método que usó, estableciendo la variable GIT_EXTERNAL_DIFF. Sin embargo, se supone que la variable apunte a la ruta completa del ejecutable. Además, el 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 las herramientas de diferencias requerirán un orden diferente (y solo algunos) de los argumentos, lo más probable es que tenga que especificar un script de envoltura en su lugar, que a su vez llama a la herramienta de diferencias real.

El segundo método, que prefiero, es configurar la herramienta de diferenciación externa a través de “git config”. Aquí esta lo que hice:

1) Cree un script contenedor “git-diff-wrapper.sh” que contenga algo como

-->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

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

Como puede ver, solo el segundo ("archivo antiguo") y el quinto ("archivo nuevo") se pasarán a la herramienta de diferencias.

2) Tipo

$ git config --global diff.external 

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

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

Asegúrese de usar la sintaxis correcta para especificar las rutas al script de envoltura y a la herramienta de diferencias, es decir, use barras inclinadas hacia adelante en lugar de barras invertidas. En mi caso tengo

[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 script de envoltura. ¡Cuidado con el "gato" que se arrastra!

(Supongo que el '| cat'es necesario solo para algunos programas que pueden no devolver un estado de devolución adecuado o coherente. Es posible que desee probar sin el gato final si su herramienta de diferencias tiene un estado de retorno explícito)

(Diomidis Spinellis agrega en los comentarios:

los cat Se requiere comando, porque diff(1), por defecto sale con un código de error si los archivos difieren.
Git espera que el programa diff externo salga con un código de error solo si ocurre un error real, por ejemplo, si se queda sin memoria.
Al canalizar la salida de git para cat el código de error distinto de cero está enmascarado.
De manera más eficiente, el programa podría simplemente ejecutarse exit con un argumento de 0.)


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

  • ¿Cómo configuro DiffMerge con msysgit / gitk? que ilustra la configuración concreta de DiffMerge y WinMerge para MsysGit y gitk
  • ¿Cómo puedo configurar un editor para trabajar con Git en Windows? para la definición de Notepad ++ como editor externo.

Para completar mi anterior respuesta de configuración "diff.external" anterior:

Como lo mencionó Jakub, Git1.6.3 introdujo git difftool, propuesto originalmente en septiembre de 2008:

USO ='[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'

(Ver --extcmd en la última parte de esta respuesta)

$LOCAL contiene el contenido del archivo de la revisión inicial y $REMOTE contiene el contenido del archivo en la revisión final.
$BASE contiene el contenido del archivo en el trabajo

Es básicamente git-mergetool modificado para operar en el git index / worktree.

El caso de uso habitual de este script es cuando ha realizado cambios por etapas o no por etapas y le gustaría ver los cambios en un visor de diferencias en paralelo (p. Ej. xxdiff, tkdiff, etc.).

git difftool [*]

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

git difftool --start=HEAD^ --end=HEAD [-- *]

El último caso de uso es cuando le gustaría comparar su árbol de trabajo actual con algo que no sea HEAD (por ejemplo, una etiqueta)

git difftool --commit=v1.0.0 [-- *]

Nota: desde Git 2.5, git config diff.tool winmerge ¡es suficiente!

Ver "git mergetool winmerge"

Y desde Git 1.7.11, tienes la opción --dir-diff, para generar herramientas de diferencias externas que puedan comparar dos jerarquías de directorios a la vez después de completar dos directorios temporales, en lugar de ejecutar una instancia de la herramienta externa una vez por par de archivos.


Antes de Git 2.5:

Caso práctico de configuración difftool con su herramienta de diferenciación personalizada:

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 una parte del directorio de su RUTA:

#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"C:/Program Files/WinMerge/WinMergeU.exe" -u -e "$1" "$2" -dl "Local" -dr "Remote"

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

También tienes esta entrada de blog de Dave para agregar otros detalles.
(O esta pregunta para el winmergeu opciones)

El interés de esta configuración es el winmerge.shtexto: puedes personalizarlo para tener en cuenta casos especiales.

Vea, por ejemplo, la respuesta de David Marble a continuación para ver un ejemplo que trata de:

  • nuevo archivos en origen o destino
  • remoto archivos en origen o destino

Como Kem Mason menciona en su respuesta, también puede Evite cualquier envoltorio utilizando el --extcmd opción:

--extcmd=

Especifique un comando personalizado para ver las diferencias. git-difftool ignora los valores predeterminados configurados y ejecuta $command $LOCAL $REMOTE cuando se especifica esta opción.

Por ejemplo, así es como gitk es capaz de ejecutar / usar cualquier diff herramienta.

Con el ánimo de responder preguntas algo diferentes a las formuladas. Prueba esta solución:

$ meld my_project_using_git

Meld comprende git y proporciona una navegación por los cambios recientes.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 4)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *