modificados - ¿Por qué `git diff` no invoca la herramienta de diferencias externa?
git status (3)
En mi repositorio, si escribo
$ git diff some-file
o
$ git difftool some-file
Me sale la pantalla de diferencia en el terminal. Creo que esto no debería suceder, porque he configurado una herramienta externa de diferencias, como se muestra en la salida de git config -l
:
$ git config -l
user.name=blah blah
user.email=blah blah
http.sslverify=true
diff.external=/home/daniel/bin/git-diff <--This is the important line
push.default=simple
core.filemode=false
core.editor=gedit
alias.tree=log --all --graph --decorate=short --color --format=format:''%C(bold blue)%h%C(reset) %C(auto)%d%C(reset)
%C(black)[%cr]%C(reset) %x09%C(black)%an: %s %C(reset)''
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
remote.origin.url=https://daniel@skynet/git/pyle.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.daniel.remote=origin
branch.daniel.merge=refs/heads/daniel
El archivo git-diff al que se hace referencia en la línea diff.external
tiene este aspecto
#!/bin/bash
meld $2 $5
¿Por qué git diff
invoca a meld?
Obtengo el mismo comportamiento si configuro las cosas para que git config -l
tenga la siguiente línea:
diff.tool = meld
o
diff.external = usr/bin/meld
Nota : Otros repositorios en mi máquina no tienen este problema.
Preguntas de SO relacionadas, pero no equivalentes:
Me sale la pantalla de diferencia en el terminal. Esto no debería ocurrir, porque he configurado una herramienta externa de diferencias.
Sí, debería: diff.external es para "visualización de diferencias en el terminal".
(de la página del manual de git config
)
diff.external
Si se configura esta variable de configuración, la generación de diferencias no se realiza utilizando la maquinaria interna de diferencias, sino utilizando el comando dado .
Se puede anular con la variable de entornoGIT_EXTERNAL_DIFF
.
El comando se llama con los parámetros descritos en "git Diffs" en git (1). Nota: si desea usar un programa de diferencias externo solo en un subconjunto de sus archivos, es posible que desee usar gitattributes(5) lugar.
La pregunta que vincula explica por qué meld
no podría desempeñar el papel de un "dif externo".
La visualización de un dif visual con otra herramienta se realiza con:
git difftool --dir-diff shaOfHisCheckIn^!
git difftool --tool=meld --dir-diff shaOfHisCheckIn^!
git difftool -t meld -d shaOfHisCheckIn^!
meld
se puede configurar en Windows como diftool: consulte " Git Diff y Meld en Windows ".
Si quisiera configurar meld para git diff, podría (en Ubuntu) usar el diff.external
, pero con un script de envoltorio :
cree un archivo llamado
git-diff.sh
, usando el siguiente contenido:
#!/bin/bash
meld "$2" "$5" > /dev/null 2>&1
Guárdelo en una ubicación como
/usr/local/bin
, otorgándole derechos de ejecución:
$ sudo mv git-diff.sh /usr/local/bin/
$ sudo chmod +x /usr/local/bin/git-diff.sh
El último paso es abrir el archivo
$HOME/.gitconfig
y agregar las siguientes líneas:
[diff]
external = /usr/local/bin/git-diff.sh
La próxima vez que escriba git diff en un proyecto de Git con cambios, Meld se iniciará y le mostrará un visor de diferencias de panel dividido.
Tenga en cuenta que debe cerrar la instancia abierta de meld antes de abrir el siguiente visor de diferencias.
Normalmente solo quiero comprobar si los cambios que estoy a punto de registrar son correctos. Así que seguí el procedimiento sugerido aquí (similar al observado por VonC). Sin embargo, la ejecución de git difftool
todavía no abre Meld. Entonces creé un alias:
alias git-diff=''git difftool $(git rev-parse HEAD)''
Guarde esto en su .bashrc o .zshrc o la configuración correspondiente para su shell. Esto esencialmente compara el estado de la rama con la confirmación anterior en la rama.
Haga un git-diff
para ver los cambios en un archivo por archivo o git-diff --dir
para ver todos los cambios en una vista de directorio.
Parece que git diff
(al menos, a partir de la versión 1.7.12.4
de git
) no ejecutará otra cosa que no sea la diferencia interna, solo para consola, en un archivo que se encuentre en el estado "ambos modificados". git mergetool
funciona en tales archivos.