git: use visual diff (meld) somente quando estiver na GUI

5

Eu sei que posso especificar o comando diff externo a ser usado para git diff :

[diff]
    external = 

Mas quando estou logado no console (sem X) isso falha porque meu diff visual não pode abrir a tela (obviamente)

Como posso dizer ao git para usar somente o diff visual somente quando logado na GUI / X?

    
por Martin Vegter 25.11.2017 / 11:05

2 respostas

2

Você pediu an answer drawing from credible and/or official sources , então vou citar alguma documentação oficial neste resposta.

Primeiramente, precisamos encontrar uma maneira de determinar se estamos executando dentro de X sessão. Poderíamos fazer isso, por exemplo, verificando se $DISPLAY variável está definida. Como está descrito em man X :

DISPLAY

This is the only mandatory environment variable. It must point to an X server. See section "Display Names" above.

No entanto, pode não ser uma boa ideia porque alguém pode definir DISPLAY para um valor falso, mesmo fora de X . Uma maneira melhor é sugerido em esta resposta :

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

Você deve ter um programa chamado xhost já instalado no seu máquina, verifique se você tem isso:

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

Agora, podemos definir diff.external para apontar para um wrapper chamaria um diff externo se estivermos dentro de X e executar o padrão git diff mechanism se não estivermos dentro de X . Infelizmente eu não sou capaz de criar uma maneira simples de executar um git diff padrão em diff.external , então vamos criar um alias para git que seria defina diff.external temporariamente usando -c . Conforme descrito em man git :

-c < name>=< value>

Pass a configuration parameter to the command. The value given will override values from configuration files. The is expected in the same format as listed by git config (subkeys separated by dots).

Note that omitting the = in git -c foo.bar ... is allowed and sets foo.bar to the boolean true value (just like [foo]bar would in a config file). Including the equals but with an empty value (like git -c foo.bar= ...) sets foo.bar to the empty string.

Seria algo como:

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

Para resumir:

  • Crie um script chamado ~/git-wrapper.sh e substitua <YOUR_DIFF_WRAPPER> com o que você quiser:

    #!/usr/bin/env sh
    
    if xhost >/dev/null 2>&1
    then
        git -c diff.external=<YOUR_DIFF_WRAPPER>  "$@"
    else
        git "$@"
    fi
    
  • Defina um bit executável:

     $ chmod +x ~/git-wrapper.sh
    
  • Defina o alias no seu arquivo de inicialização do shell, por exemplo ~/.bashrc e reload shell:

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

     $ git diff
    

    Ele usará <YOUR_DIFF_WRAPPER> se você estiver dentro de X e usará padrão git-diff fora de X .

por 30.11.2017 / 21:11
3

Existem várias maneiras simples de conseguir isso ... para fazer isso "outside" git, você pode configurar seu programa difftool (você provavelmente vai querer difftool ao invés de diff para lançar um diff visual) em um script wrapper que descubra se você está em um ambiente gráfico ou não e lança o programa apropriado; ou "inside" git, você pode fazer algumas inclusões condicionais específicas do ambiente (includeIf).

    
por 28.11.2017 / 15:48

Tags