web-dev-qa-db-fra.com

`watch git log` avec les couleurs correctes

Je veux watch la sortie de git log --oneline --graph avec toutes les couleurs et j'ai essayé d'adapter la solution à partir de Pourquoi les couleurs git n'apparaissent-elles pas lors de l'utilisation de la montre? , mais cela rend simplement (presque) la totalité de la sortie en orange:

Sortie en utilisant watch -c

$ watch -c git -c color.diff=always log --graph --oneline

enter image description here

Notez que dès le premier hachage de validation, tout est imprimé en orange. C'est la sortie de watch from procps-ng 3.3.10 sur Ubuntu 16.04.

Sortie normale = objectif

$ git log --graph --oneline

enter image description here

La sortie avec un -c color.diff=always supplémentaire est identique, cat -A montre les séquences de couleurs ANSI utilisées:

$ git -c color.diff=always log --graph --oneline | cat -A
* ^[[33m8ccd905^[[m L
* ^[[33me4ad4f6^[[m E
* ^[[33mf427d2a^[[m U
* ^[[33me8351c8^[[m Z
* ^[[33mf06747c^[[m I

Question

Comment obtenir que watch git log affiche les couleurs comme git log?

1
dessert

C'était un bug dans procps-ng (nom du paquet Ubuntu procps), corrigé dans la version 3.3.11.

La dernière version d'Ubuntu LTS (16.04 Xenial) contient toujours le bogue, tandis que les versions actuelles (17.04 Zesty et 17.10 Artful) fournissent déjà la version corrigée.

3
egmont

Le commentaire de egmont indique que watch ne reconnaît pas la norme ANSI 39 (réinitialise uniquement la couleur de premier plan). C'est ^[[39m comme indiqué par WJAndrea . D'autres ont répondu qu'il s'agissait d'un bogue dans procps-ng.

Dans d'autres commandes git, comme diff, il est évident que les couleurs en gras fonctionnent, mais tout texte non coloré qui suit conserve la couleur précédente jusqu'à ce qu'une nouvelle couleur en gras apparaisse. La raison en est que les couleurs vives spécifient '^ [[1; _ ## m'.

Nous avons donc su où nous concentrer.

J'ai d'abord fait une regex rapide avec sed pour remplacer toutes les couleurs en gras, et ça fonctionnait très bien. Cela nécessitait simplement une couleur grasse, car certaines sorties de commandes git ne commencent pas en couleur et il y avait un texte normal de départ jusqu'au premier code couleur.

J'ai testé pendant cet après-midi, et ce texte gras et massif retenait mon attention.

J'utilise i3wm , je garde donc certains terminaux ouverts côte à côte. Et un terminal vif et coloré qui surveillait mon journal git commençait à être agaçant. Avant aujourd'hui, je vivais avec un journal non coloré: c

Un autre problème est que j'ai codé en dur une couleur gris clair audacieuse pour remplacer le texte non coloré: les personnes utilisant d'autres combinaisons de couleurs pourraient crier après moi.

Pour résoudre tout, j'ai changé mon idée initiale en quelque chose de plus simple. Au lieu de mettre le texte en gras, il me suffit d’ajouter un 0 pour rendre le code de couleur valide en watch. Changé quelques caractères et voilà! Les couleurs apparaissent comme prévu, les textes en gras conservent leur signification et la fenêtre qui traîne se sent mieux.

J'ai testé les performances avec un historique de validations considérable (> 90 000 validations) et il y a un retard notable de quelques millisecondes, si vous utilisez les drapeaux --graph ou --date-order, et peut-être d'autres, mais --oneline semble en sécurité. Même en demandant de ne consigner que quelques commits, cela entraîne un délai, Git doit traiter l’historique complet pour générer le graphique.

Mais ce cas était extrême. Et vous n'avez pas besoin d'une mise à jour 0.1s. 3 ou 4s semble bon. watch -n #

Mon code actuel est le suivant:

#!/bin/bash
git -c color.ui=always "$@" | sed -r $'s/\033\[([[:digit:]][[:digit:]])m/\033\[0;\\1m/g; s/\033\[m/\033\[0m/g'

J'ai enregistré dans ~/bin/git-colored avec l'autorisation + x et il peut être utilisé avec git colored <git command>

Résolution du poste principal: watch -c 'git colored log --oneline --graph'

J'ai créé un Gist avec ce fichier, où vous pouvez voir l'historique du code.

TL; DR

Il y a un bogue dans un paquet Ubuntu. Le code à une ligne ci-dessus est une solution de contournement pour ceux qui ne peuvent/ne veulent pas mettre à niveau le système, faisant essentiellement ce qui est en ici .

1
Aryel Góis

Une solution rapide que j'ai faite si vous n'avez pas procps-ng 3.3.11: dirigez votre sortie git par sed "s/\x1b\[m/\x1b\[00m/", par exemple. pour git status:

watch -c 'git -c color.ui=always status | sed "s/\x1b\[m/\x1b\[00m/"'

Ceci remplace les échappements ANSI vides ([m, non reconnus par watch) par des zéro ([00m, entièrement reconnus par watch).

1