web-dev-qa-db-fra.com

Forcer "git status" à afficher la couleur sur le terminal (à l'intérieur d'un script)

ÉDITER:

Je voudrais recommander que l'analyse des couleurs soit une idée généralement mal conçue.

Une partie de la raison pour laquelle je le voulais était pour que je puisse à la fois l'analyser et le transmettre dans ma propre sortie de script. C'est ... d'accord, mais il serait probablement plus sain d'utiliser de la porcelaine ou quelque chose comme ça et de reconstruire les parties colorées moi-même!

La question d'origine suit.


J'aime voir la couleur parce que mes scripts sont assez robustes (jusqu'à présent) pour gérer les codes de couleur. Il semble que je vais à contre-courant ici, mais honnêtement, je ne vois pas le gros problème d'avoir à analyser des choses comme les codes d'échappement dans les scripts. Si les couleurs aident à une utilisation interactive, pourquoi ne pourraient-elles pas aider à l'utilisation de scripts où je pourrais regrouper des données et croquer encore plus de données que je ne le ferais manuellement? Les couleurs ne seraient-elles pas encore plus importantes?

Quoi qu'il en soit, j'ai un petit script Shell soigné que j'ai écrit que munges git status sortie, et je cherche juste à faire en sorte que ce script garde les couleurs intactes. Ma configuration globale de git est définie de sorte que les listes de fichiers modifiés et non suivis apparaissent en couleur dans l'état git. Malheureusement contrairement à git diff il n'y a pas d'option pour forcer la couleur pour git status que je peux trouver.

Pour être parfaitement clair, voici le problème:

$ git status

produit une sortie parfaite, mais (un extrait de mon script suit)

git status | sed "s/^#/\x1b[34m#[0m/"

ne produit pas de couleur git status sortie, et vous pouvez même voir ici que je convertis explicitement les premiers caractères de hachage en bleu car cela aide à mettre en évidence les différentes régions de sortie de mon script.

Est-ce que quelqu'un sait comment l'obtenir pour éteindre les couleurs? Y a-t-il peut-être un programme standard que je peux utiliser qui peut être utilisé comme un tuyau STDIN/STDOUT "faux terminal"? En fait, je travaille également sur un outil pseudo-terminal pty afin que je puisse certainement l'utiliser à cette fin, mais c'est une solution plutôt lourde (et pas encore prête à l'emploi car je n'ai pas fini de le construire).

63
Steven Lu

Pour éviter de modifier votre configuration git, vous pouvez le faire uniquement pour la commande actuelle en passant la variable config avec -c:

    git -c color.status=always status | less -REX

Cette variable concerne uniquement la commande status. Pour diff, show et log la variable est color.ui:

    git -c color.ui=always diff | less -REX

Notez que -c doit devenir avant l'argument status ou diff, et non après.

83
joeytwiddle

ÉDITER:

Je voudrais recommander fortement que l'analyse des couleurs est une idée généralement mal conçue.

Une partie de la raison pour laquelle je le voulais était pour que je puisse à la fois l'analyser et le transmettre dans ma propre sortie de script. C'est ... d'accord, mais il serait probablement plus sain d'utiliser de la porcelaine ou quelque chose comme ça et de reconstruire les parties colorées moi-même!

La réponse originale suit.


Je continue de trouver des réponses très rapidement après avoir posé des questions. Quelque chose à voir avec la réflexion sur un problème suffisamment longtemps pour l'écrire et formuler de meilleures approches pour le résoudre. Quoi qu'il en soit, la solution à cela est juste

git config color.status always

J'imagine qu'une solution à usage général implique expect ou quelque chose pty lié à forcer tous les programmes qui en ont besoin à penser qu'ils sont sur un terminal.

20
Steven Lu

J'ai eu ce même problème lors de l'utilisation d'un alias git qui exécute une commande Shell. Apparemment, le git Shell n'hérite pas de l'environnement actuel, donc il ne sait rien de mes paramètres de coloration.

En plus d'ajouter le paramètre global de l'interface utilisateur de git color, j'ai corrigé cela en faisant ressembler mon alias ci-dessous, sa commande secondaire qui nécessite d'être invité à utiliser les couleurs, car git le sera par défaut à partir de la version 1.8.x que les gens ont mentionnée.

[alias]
  ignored = !git ls-files -v|grep --color '^h'

Cela produit une sortie colorisée équivalente maintenant lorsqu'elle est exécutée comme alias, comme si je venais d'exécuter la commande.

Pour sed, cette autre réponse semble fonctionner de manière plus fiable, utilisez tput. https://unix.stackexchange.com/a/45954

2
dragon788