Por que as cores do git não aparecem ao usar o relógio?

7

Ao executar git status -sb , vejo:

Eu quero que watch (do procps-ng 3.3.3) seja um repositório. A opção --color deve manter as cores.

Curiosamente, funciona com ls :

$ watch --color "ls --color"

Mostrando:

No entanto, para git , as cores desaparecem:

$ watch --color "git status -sb"

Então, por que watch mostra cores de ls , mas não de git output?

    
por Drew Noakes 20.02.2014 / 15:24

2 respostas

4

As seguintes afirmações são verdadeiras:

  • watch executa o comando em um novo shell, sh .
  • .bashrc aliases ls as ls --color=auto para ativar as cores
  • sh não herda ou usa bash aliases.

Então, quando watch executa ls , não está pedindo cores, apenas está executando a versão antiga simples. Você pode contornar isso, mas - como aditya aponta - você também precisa ativar as cores em watch para processá-las corretamente.

Um exemplo de trabalho para ls é:

watch --colour -- ls --color=always

Se você não passar --color para assistir, verá inúmeros códigos de cores feios em linha.

ls --color é interpretado como ls --colour=always .

ls --colour=auto não imprime a cor no relógio. Isso sugere que está inferindo suporte de cores do próprio terminal.

Para saber mais sobre o motivo, podemos testar se o watch shell acha que é um terminal real :

$ bash -c '[[ -t 1 ]] && echo "real terminal"'
real terminal

$ watch -- "bash -c '[[ -t 1 ]] && echo "real terminal"'"
# ... nothing.

Eu suspeito que alguns aplicativos estão olhando para isso (ou similar) para dizer se eles devem ativar as cores ou não.

    
por Oli 20.02.2014 / 15:59
5

git usa um valor de configuração para determinar se deve mostrar a saída colorida ou não.

Por exemplo:

git config --global color.ui auto

Isso define a configuração de cor para auto globalmente. No modo auto , o git irá determinar se é um terminal real antes de enviar os códigos de cores, conforme sugerido por Oli.

Você pode forçar esse valor global a always , mas uma ideia melhor pode ser aplicá-lo a um comando específico:

git -c color.status=always status -sb

Colocando tudo junto:

watch --color git -c color.status=always status -sb
    
por Drew Noakes 20.02.2014 / 16:17