git: use diferença visual (combinação) somente quando estiver na GUI

git: use diferença visual (combinação) somente quando estiver na GUI

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 diferencial visual não consegue abrir a tela (obviamente)

Como posso dizer ao git para usar apenas a diferença visual quando estiver logado na GUI/X?

Responder1

Existem várias maneiras simplistas de fazer isso... para fazer isso "fora" do git, você pode definir seu programa difftool (você provavelmente deseja difftool em vez de diff para iniciar uma comparação visual) para um script wrapper que descobre se você está em ambiente gráfico ou não e lança o programa apropriado; ou "dentro" do git, você pode fazer alguma inclusão condicional específica do ambiente (includeIf).

Responder2

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

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

MOSTRAR

Esta é a única variável de ambiente obrigatória. Deve apontar para um servidor X. Consulte a seção "Nomes de exibição" acima.

No entanto, pode não ser uma boa ideia porque alguém poderia simplesmente definir DISPLAYum valor falso, mesmo fora de X. Uma maneira melhor é sugerida emesta resposta:

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

Você deve ter um programa chamado xhostjá instalado em sua máquina, certifique-se de tê-lo:

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

Agora, poderíamos apenas definir diff.externalpara apontar para um wrapper que chamaria um diff externo se estivéssemos dentro Xe executaria o git diffmecanismo padrão se não estivéssemos dentro X. Infelizmente, não consigo encontrar uma maneira simples de executar um padrão git diff, diff.externalentão vamos criar um alias para gitisso seria definido diff.externaltemporariamente usando -c. Conforme descrito em man git:

-c <nome>=< valor>

Passe um parâmetro de configuração para o comando. O valor fornecido substituirá os valores dos arquivos de configuração. O é esperado no mesmo formato listado por git config (subchaves separadas por pontos).

Observe que omitir = em git -c foo.bar ... é permitido e define foo.bar como o valor booleano verdadeiro (assim como [foo]bar faria em um arquivo de configuração). Incluir os iguais, mas com um valor vazio (como git -c foo.bar= ...) define foo.bar como a string vazia.

Seria algo como:

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

Resumindo:

  • Crie um script chamado ~/git-wrapper.she substitua <YOUR_DIFF_WRAPPER>pelo que desejar:

    #!/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 arquivo de inicialização do shell, por exemplo, ~/.bashrce recarregue o shell:

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

     $ git diff
    

    Ele será usado <YOUR_DIFF_WRAPPER>se você estiver dentro Xe usará o padrão git-difffora de X.

informação relacionada