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 sources
entã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
DISPLAY
um 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 xhost
já instalado em sua máquina, certifique-se de tê-lo:
$ type -a xhost
xhost is /usr/bin/xhost
Agora, poderíamos apenas definir diff.external
para apontar para um wrapper que chamaria um diff externo se estivéssemos dentro X
e executaria o
git diff
mecanismo 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.external
então vamos criar um alias para git
isso seria definido diff.external
temporariamente 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.sh
e 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,
~/.bashrc
e recarregue o shell:alias git=~/git-wrapper.sh
Utilize
git
normalmente:$ git diff
Ele será usado
<YOUR_DIFF_WRAPPER>
se você estiver dentroX
e usará o padrãogit-diff
fora deX
.