git: use visual diff (meld) solo cuando esté en GUI

Sé que puedo especificar el command diff externo para ser utilizado para git diff :

 [diff] external = 

Pero cuando estoy conectado en la console (sin X), esto falla porque mi visual diff no puede abrir la pantalla (obviamente)

¿Cómo puedo decirle a git que solo use la diferencia visual solo cuando haya ingresado GUI / X?

Usted solicitó an answer drawing from cnetworkingible and/or official sources por lo que citaré alguna documentation oficial en esta respuesta.

Primero, necesitamos encontrar una manera de determinar si estamos ejecutando dentro de la session X Podríamos hacer eso, por ejemplo, verificando si está configurada la variable $DISPLAY . Como se describe en el man X :

MONITOR

Esta es la única variable de entorno obligatoria. Debe apuntar a un server X. Ver la sección "Mostrar nombres" arriba.

Sin embargo, puede que no sea una buena idea porque alguien podría simplemente configurar DISPLAY a un valor falso incluso fuera de X Se sugiere una mejor manera en esta respuesta :

 if xhost >& /dev/null ; then echo "Display exists" else echo "Display invalid" ; fi 

Debería tener un progtwig llamado xhost ya instalado en su máquina, asegúrese de tenerlo:

 $ type -a xhost xhost is /usr/bin/xhost 

Ahora, podríamos simplemente establecer diff.external para apuntar a un contenedor que llamaría a un diff externo si estamos dentro de X y ejecutamos el mecanismo pnetworkingeterminado de git diff si no estamos dentro de X Lamentablemente, no puedo encontrar una manera simple de ejecutar un git diff pnetworkingeterminado en diff.external así que diff.external un alias para git que establezca diff.external temporalmente con -c . Como se describe en man git :

-c <nombre> = <valor>

Pase un parámetro de configuration al command. El valor proporcionado anulará los valores de los files de configuration. Se espera en el mismo formatting que el listdo por git config (subkeys separadas por puntos).

Tenga en count que se permite omitir el = en git -c foo.bar … y establece foo.bar en el valor verdadero boolean (al igual que lo haría la barra [foo] en un file de configuration). Incluyendo los iguales pero con un valor vacío (como git -c foo.bar = …) establece foo.bar en la cadena vacía.

Sería algo así como:

 $ git -c diff.external=diff-wrapper.sh ... 

Para resumir:

  • Cree un script llamado ~/git-wrapper.sh y reemplace <YOUR_DIFF_WRAPPER> con lo que desee:

     #!/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 file de inicio de shell, por ejemplo ~/.bashrc y vuelva a cargar el shell:

      alias git=~/git-wrapper.sh 
  • Use git normalmente:

      $ git diff 

    Utilizará <YOUR_DIFF_WRAPPER> si está dentro de X y usará git-diff pnetworkingeterminado fuera de X

Hay varias forms simples de lograr esto … para hacerlo "fuera" de git, puedes configurar tu progtwig de difftool (probablemente prefieras difftool en lugar de diff para lanzar un diff visual) a un script de envoltura que se da count si eres en un entorno gráfico o no y lanza el progtwig apropiado; o "dentro" de git, puede hacer alguna inclusión condicional específica del entorno (includeIf).