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

10

Ao executar git status -sb, vejo:

insira a descrição da imagem aqui

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


Curiosamente, ele trabalha com ls:

$ watch --color "ls --color"

Mostrando:

saída de ls


No entanto, para gitas cores desaparecem:

$ watch --color "git status -sb"

insira a descrição da imagem aqui


Então, por que watchmostra cores lsda gitsaída, mas não da saída?

Drew Noakes
fonte
@Jobin, obrigado, eu realmente comentou naquele link antes de postar esta pergunta :)
de Drew Noakes

Respostas:

5

As seguintes afirmações são verdadeiras:

  • watchexecuta o comando em um novo shell sh,.
  • .bashrcaliases lscomo ls --color=autopara permitir cores.
  • shnão herda ou usa bashaliases.

Então, quando watché executado ls, não está pedindo cores, está apenas executando a versão antiga simples. Você pode contornar isso, mas, como aditya ressalta, também precisa ativar as cores watchpara processá-las adequadamente.

Um exemplo de trabalho para lsé:

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

Se você não passar --colorpara assistir, verá vários códigos de cores feios em linha.


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

ls --color=auto não imprime cores no relógio. Isso sugere que ele está deduzindo o suporte de cores do próprio terminal.

Para saber mais sobre o motivo, podemos testar se o relógio acha que é um terminal real :

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

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

Suspeito que alguns aplicativos estejam analisando isso (ou similar) para saber se devem ativar as cores ou não.

Oli
fonte
3
Mas o OP quer saber por que isso não funciona git status -sb, mesmo que funcione ls --color.
Jobin
Isso faz sentido. No entanto, não há apelido para git. A coloração é definida diretamente na configuração do git . Portanto, isso não parece ser um problema de alias.
Desenhou Noakes
Bingo. Eu definiria minhas cores para as autoquais, como você supôs corretamente, estava causando o git para evitar a saída de cores. O uso alwaysresolveu esse problema. Muito Obrigado!
Desenhou Noakes
9

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

Por exemplo:

git config --global color.ui auto

Isso define a configuração de cores para autoglobalmente. No automodo, o git determinará se é um terminal real antes de enviar códigos de cores, como sugeriu Oli.

Você pode forçar esse valor global always, no entanto, uma idéia melhor pode ser aplicá-lo a um comando específico:

git -c color.status=always status -sb

Juntando tudo:

watch --color git -c color.status=always status -sb
Drew Noakes
fonte
0

Funciona se git( --color) e watch( -c) são instruídos a usar cores:

watch -cd "git branch -va --color"
sjas
fonte