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

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

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 sourcesasí 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 DISPLAYun 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 xhostya instalado en su máquina, asegúrese de tenerlo:

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

Ahora, podríamos simplemente configurarlo diff.externalpara que apunte a un contenedor que llamaría a una diferencia externa si estamos dentro Xy ejecutaría el git diffmecanismo predeterminado si no estamos dentro X. Desafortunadamente, no puedo encontrar una forma sencilla de ejecutar un valor predeterminado git diff, diff.externalasí que, en su lugar, creemos un alias para gitconfigurarlo diff.externaltemporalmente 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.shy 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, ~/.bashrcy vuelva a cargar el shell:

     alias git=~/git-wrapper.sh
    
  • Usar gitnormalmente:

     $ git diff
    

    Se usará <YOUR_DIFF_WRAPPER>si estás dentro Xy usará el valor predeterminado git-difffuera de X.

información relacionada