Sé que puedo especificar el comando diff externo que se utilizará para git diff
:
[diff]
external =
Pero luego, cuando inicio sesión en la consola (sin X), esto falla porque mi diferencia visual no puede abrir la pantalla (obviamente)
¿Cómo puedo decirle a git que solo use visual diff cuando esté conectado a GUI/X?
Respuesta1
Hay varias formas sencillas de lograr esto... para hacerlo "fuera" de git, puede configurar su programa difftool (probablemente desee difftool en lugar de diff para iniciar un visual diff) en un script contenedor que determine si está en un entorno gráfico o no y lanza el programa apropiado; o "dentro" de git, puede realizar alguna inclusión condicional específica del entorno (includeIf).
Respuesta2
Usted lo solicitó, an answer drawing from credible and/or official sources
así que voy a citar alguna documentación oficial en esta respuesta.
Primero, necesitamos encontrar una manera de determinar si estamos ejecutando X
una sesión interna. Podríamos hacerlo, por ejemplo, comprobando si $DISPLAY
la variable está configurada. Como se describe en man X
:
MOSTRAR
Esta es la única variable de entorno obligatoria. Debe apuntar a un servidor X. Consulte la sección "Nombres para mostrar" más arriba.
Sin embargo, puede que no sea una buena idea porque alguien podría simplemente establecer
DISPLAY
un valor falso incluso fuera deX
. Se sugiere una mejor manera enesta respuesta:
if xhost >& /dev/null ; then echo "Display exists"
else echo "Display invalid" ; fi
Debería tener un programa con nombre xhost
ya instalado en su máquina, asegúrese de tenerlo:
$ type -a xhost
xhost is /usr/bin/xhost
Ahora, podríamos simplemente configurarlo diff.external
para que apunte a un contenedor que llamaría a una diferencia externa si estamos dentro X
y ejecutaría el
git diff
mecanismo predeterminado si no estamos dentro X
. Desafortunadamente, no puedo encontrar una forma sencilla de ejecutar un valor predeterminado git diff
,
diff.external
así que, en su lugar, creemos un alias para git
configurarlo diff.external
temporalmente usando -c
. Como se describe en man git
:
-c <nombre>=<valor>
Pase un parámetro de configuración al comando. El valor proporcionado anulará los valores de los archivos de configuración. Se espera que esté en el mismo formato que aparece en git config (subclaves separadas por puntos).
Tenga en cuenta que se permite omitir = en git -c foo.bar ... y establece foo.bar en el valor booleano verdadero (tal como lo haría [foo]bar en un archivo de configuración). Incluir iguales pero con un valor vacío (como git -c foo.bar= ...) establece foo.bar en la cadena vacía.
Sería algo como:
$ git -c diff.external=diff-wrapper.sh ...
Para resumir:
Crea un script llamado
~/git-wrapper.sh
y reemplázalo<YOUR_DIFF_WRAPPER>
con lo que desees:#!/usr/bin/env sh if xhost >/dev/null 2>&1 then git -c diff.external=<YOUR_DIFF_WRAPPER> "$@" else git "$@" fi
Establecer un bit ejecutable:
$ chmod +x ~/git-wrapper.sh
Establezca un alias en su archivo de inicio de shell, por ejemplo,
~/.bashrc
y vuelva a cargar el shell:alias git=~/git-wrapper.sh
Usar
git
normalmente:$ git diff
Se usará
<YOUR_DIFF_WRAPPER>
si estás dentroX
y usará el valor predeterminadogit-diff
fuera deX
.