Dlaczego podczas używania zegarka nie pojawiają się kolory git?

10

Podczas pracy git status -sbwidzę:

wprowadź opis zdjęcia tutaj

Chcę watch(od procps-ng 3.3.3) repozytorium. Ta --coloropcja ma zachować kolory.


Co ciekawe, współpracuje z ls:

$ watch --color "ls --color"

Seans:

wyjście z ls


Jednak gitkolory znikają:

$ watch --color "git status -sb"

wprowadź opis zdjęcia tutaj


Dlaczego więc watchpokazuje kolory z, lsale nie z gitwydruku?

Drew Noakes
źródło
@Jobin, dzięki, naprawdę skomentowałem ten link przed opublikowaniem tego pytania :)
Drew Noakes

Odpowiedzi:

5

Następujące stwierdzenia są prawdziwe:

  • watchuruchamia komendę w nowej powłoce, sh.
  • .bashrcaliasy lsjak ls --color=autowłączyć kolorów.
  • shnie dziedziczy ani nie używa bashaliasów.

Więc kiedy watchdziała ls, nie prosi o kolory, po prostu uruchamia zwykłą starą wersję. Możesz to obejść, ale - jak wskazuje aditya - musisz także włączyć kolory watch, aby je poprawnie przetworzyć.

Działającym przykładem lsjest:

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

Jeśli nie przejdziesz --colordo oglądania, zobaczysz w środku kilka brzydkich kodów kolorów.


ls --colorjest interpretowany jako ls --color=always.

ls --color=auto nie drukuje kolorów w zegarku. Sugeruje to, że wnioskuje o obsługę kolorów z samego terminala.

Aby dowiedzieć się więcej o tym, dlaczego, możemy sprawdzić, czy powłoka zegarka uważa, że ​​to prawdziwy terminal :

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

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

Podejrzewam, że niektóre aplikacje patrzą na to (lub podobnie), aby stwierdzić, czy powinny włączyć kolory, czy nie.

Oli
źródło
3
Ale OP chce wiedzieć, dlaczego to nie działa git status -sb, nawet jeśli działa ls --color.
jobin
To ma sens. Jednak nie ma aliasu dla git. Kolor jest ustawiany bezpośrednio w konfiguracji gita . Więc to nie wydaje się być problemem aliasingu.
Drew Noakes
Bingo Ustawiłbym moje kolory, w autoktórych, jak słusznie przypuszczałeś, git unikał kolorów. Używanie alwayszamiast tego rozwiązało ten problem. Wielkie dzięki!
Drew Noakes
9

git używa wartości konfiguracji do ustalenia, czy wyświetlać kolorowe wydruki, czy nie.

Na przykład:

git config --global color.ui auto

To ustawia autoglobalne ustawienie kolorów . W autotrybie git określi, czy jest to prawdziwy terminal przed wysłaniem kodów kolorów, jak zasugerował Oli.

Możesz wymusić tę globalną wartość always, jednak lepszym pomysłem może być zastosowanie jej do określonego polecenia:

git -c color.status=always status -sb

Kładąc wszystko razem:

watch --color git -c color.status=always status -sb
Drew Noakes
źródło
0

Działa, jeśli git( --color) i watch( -c) zostaną poproszone o użycie kolorów:

watch -cd "git branch -va --color"
sjas
źródło