Pourquoi les couleurs git n'apparaissent-elles pas lors de l'utilisation de la montre?

10

En courant git status -sbje vois:

entrez la description de l'image ici

Je veux watch(à partir de procps-ng 3.3.3) un référentiel. L' --coloroption est censée conserver les couleurs.


Fait intéressant, cela fonctionne avec ls:

$ watch --color "ls --color"

Montrant:

sortie de ls


Cependant pour gitles couleurs disparaissent:

$ watch --color "git status -sb"

entrez la description de l'image ici


Alors, pourquoi watchmontre- t -on les couleurs lsde la gitsortie mais pas de la sortie?

Drew Noakes
la source
@Jobin, merci, j'ai en fait commenté ce lien avant de poster cette question :)
Drew Noakes

Réponses:

5

Les affirmations suivantes sont vraies:

  • watchexécute la commande dans un nouveau shell, sh.
  • .bashrcalias lsquant ls --color=autoà activer les couleurs.
  • shn'hérite ni n'utilise d' bashalias.

Ainsi, lors de l' watchexécution ls, il ne demande pas de couleurs, il exécute simplement l'ancienne version standard. Vous pouvez contourner cela, mais, comme le souligne Aditya, vous devez également activer les couleurs watchpour qu'il les traite correctement.

Un exemple de travail pour lsest:

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

Si vous ne passez pas --colorà regarder, vous verrez un tas de codes de couleur laid en ligne.


ls --colorest interprété comme ls --color=always.

ls --color=auto n'imprime pas la couleur dans la montre. Cela suggère qu'il déduit la prise en charge des couleurs depuis le terminal lui-même.

Pour en savoir plus sur la raison, nous pouvons tester si le boîtier de la montre pense que c'est un vrai terminal :

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

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

Je soupçonne que certaines applications regardent cela (ou similaire) pour dire si elles doivent activer les couleurs ou non.

Oli
la source
3
Mais le PO veut savoir pourquoi cela ne fonctionne pas git status -sb, même s'il fonctionne avec ls --color.
jobin
C'est logique. Cependant, il n'y a pas d'alias pour git. La coloration est directement définie dans la configuration de git . Donc, cela ne semble pas être un problème d'alias.
Drew Noakes
Bingo. Je définirais mes couleurs autoauxquelles, comme vous l'avez correctement supposé, git évitait la sortie des couleurs. Utiliser à la alwaysplace a résolu ce problème. Merci beaucoup!
Drew Noakes
9

git utilise une valeur de configuration pour déterminer s'il faut afficher la sortie colorée ou non.

Par exemple:

git config --global color.ui auto

Cela définit le paramètre de couleur sur autoglobalement. En automode, git déterminera s'il s'agit d'un vrai terminal avant d'envoyer des codes couleur, comme l'a suggéré Oli.

Vous pouvez forcer cette valeur globale à always, cependant une meilleure idée peut être de l'appliquer à une commande particulière:

git -c color.status=always status -sb

Mettre tous ensemble:

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

Cela fonctionne si git( --color) et watch( -c) sont invités à utiliser des couleurs:

watch -cd "git branch -va --color"
sjas
la source