117 votes

Couleur dans le git-log

Lorsque vous exécutez git log --decorate --pretty=oneline la sortie aura des entrées comme (HEAD, refs/published/master, master) avec la coloration.

J'ai également ce qui suit dans mon gitconfig :

[color "branch"]
    current = yellow reverse
    local = yellow
    remote = green

Comment reproduire ces couleurs lorsque vous réalisez un format personnalisé comme le suivant ?

git log --decorate --stat --graph --pretty=format:"%d %Cgreen%h%Creset (%ar - %Cred%an%Creset), %s%n"

102voto

Elad Shahar Points 356

À partir de git 1.8.3 (24 mai 2013), vous pouvez utiliser %C(auto) pour décorer %d dans la chaîne de format de git log .

De la notes de mise à jour :

 * "git log --format" specifier learned %C(auto) token that tells Git
   to use color when interpolating %d (decoration), %h (short commit
   object name), etc. for terminal output.)

64voto

VonC Points 414372

El git log --decorate sera mis par défaut :

  • le HEAD en cyan
  • les branches distantes en rouge
  • le tag en vert

et peut être modifié par color.decorate config.

Mais le git log --format n'offrent pas de moyen d'afficher spécifiquement les HEAD o télécommandes o branche : les trois sont affichés par %d avec une seule couleur possible.


Mise à jour de mai 2013, comme mentionnés ci-dessous par Elad Shahar (upvoted), git 1.8.3 offre une option supplémentaire :

git log –format arbore désormais un %C(auto) qui dit à Git d'utiliser la couleur lors de la résolution de %d (décoration), %h (nom court de l'objet commit), etc. pour la sortie du terminal.

Este Article du blog d'Atlassian précise que cette fonctionnalité fait partie de plusieurs autres axées sur le format ( git rebase , git count-objects ) et les couleurs ( git branch -vv )

Cette mesure s'ajoute à la précédente auto,reset de 1.8.2 qui désactive automatiquement les couleurs lorsque la sortie n'est pas utilisée pour un terminal1

%C(auto,blue)Hello%C(auto,reset)

Note : git 2.4+ (Q2 2015) fera un meilleur travail pour réinitialiser la couleur autour des noms de branches.
Voir commettre 5ee8758 par Junio C Hamano ( gitster ) :

log --decorate : ne pas faire fuir la couleur de "l'engagement" dans l'élément suivant

En " git log --decorate ", vous verrez l'en-tête de commit comme ceci :

commit ... (HEAD, jc/decorate-leaky-separator-color)

où " commit ... ( " est peint en color.diff.commit , " HEAD " dans color.decorate.head , " , " dans color.diff.commit le nom de la branche dans color.decorate.branch et ensuite fermer " ) " dans color.diff.commit .

Si vous vouliez peindre le HEAD et le nom de la branche locale dans la même couleur que le corps du texte (peut-être parce que le cyan et le vert sont trop pâles sur un terminal noir sur blanc pour être lisibles), vous ne voudriez pas avoir à dire

[color "decorate"]
    head = black
    branch = black

parce que vous ne pourriez pas réutiliser la même configuration sur un terminal blanc sur noir. On s'attendrait naïvement à ce que

[color "decorate"]
    head = normal
branch = normal

pour fonctionner, mais malheureusement ce n'est pas le cas.
Il peint la chaîne " HEAD " et le nom de la branche dans la même couleur que la parenthèse ouvrante ou la virgule entre les éléments de décoration.
Cela est dû au fait que le code oublie de réinitialiser la couleur après avoir imprimé le "préfixe" dans sa propre couleur.


Notez que git 2.5 (Q2 2015) corrige un bug :

Voir commettre 429ad20 par Junio C Hamano ( gitster ) , 13 mai 2015.
(fusionné par Junio C Hamano -- gitster -- en commit fd70780 , 22 mai 2015)

log : ne pas raccourcir trop tôt les noms de décoration

Le " log --decorate "dans Git 2.4 qui montre le commit à l'extrémité de la branche courante, par exemple " HEAD -> master ", ne fonctionnait pas avec --decorate=full.


Git 2.9.x+ (Q3 2016) corrige un autre bogue et honneur color=auto para %C(auto)


Git 2.10.2 (oct. 2016) corrige d'autres bogues avec les éléments suivants commit 82b83da (29 septembre 2016), et commettre c99ad27 (17 septembre 2016) par René Scharfe (``) .
(fusionné par Junio C Hamano -- gitster -- en commettre 76796d4 , 28 oct. 2016)

pretty : éviter d'ajouter une réinitialisation pour %C(auto) si la sortie est vide

Nous émettons une séquence d'échappement pour réinitialiser la couleur et l'attribut pour %C(auto) pour s'assurer que la coloration automatique s'affiche comme prévu.
Arrêtez de faire cela si le strbuf de sortie est vide. c'est-à-dire lorsque %C(auto) apparaît au début de la chaîne de format, car alors il n'est pas nécessaire de faire une réinitialisation et nous économisons quelques octets dans la sortie.

pretty : laisser %C(auto) réinitialiser tous les attributs

Réinitialisation des couleurs et les attributs sur %C(auto) pour activer la fonction automatique automatique ; sinon des attributs comme le gras ou l'inverse pourraient être encore en vigueur à partir d'une %C placeholders .

3 votes

N'y a-t-il pas moyen d'utiliser --decorate et --pretty="...stuff" ?

8 votes

@NorthlsUp : --decorate semble avoir sa propre implémentation et configuration, alors que --pretty offre les mêmes informations à travers %d comme un seul bloc, ce qui signifie que vous ne pouvez pas avoir le même niveau de configuration fine de la couleur avec --pretty que vous l'avez fait avec --decorate .

0 votes

La seule différence que je vois lorsque j'ajoute "--decorate" après "git log" est que les dépôts commencent soit par "refs/heads/..." soit par "refs/remotes...". Les couleurs apparaissent dans les deux cas. Une idée de la cause de ce problème ? La raison de ma question est que mon .gitconfig ne montre aucune propriété de couleur. Je me demande où je peux trouver ma propriété "color.decorate". Je ne la vois pas dans mon fichier .gitconfig.

11voto

Josh Lee Points 53741

Mettez-les entre parenthèses :

%C(...): color specification, as described in color.branch.* config option

Alors %C(yellow reverse) fonctionnerait.

1 votes

Pas tout à fait, %d est toutes les branches donc cela pourrait ressembler à (HEAD, master) dans ce cas, la tête devrait être bleue et le maître devrait être vert (je crois que ce sont les couleurs par défaut). où %C(yellow)%d%Creset ferait en sorte que tout soit de la même couleur.

2 votes

Oh, colorier les décorations individuelles. Je pense que c'est impossible. Le code pour rendre les entrées du journal est essentiellement implémenté deux fois.

1 votes

Dommage que ce ne soit pas possible... J'adorerais faire git log --decorate --oneline --date=...

8voto

Henrik Gustafsson Points 11755

L'option de configuration log.decorate peut activer/désactiver les décorations par défaut dans les journaux.

git config --global log.decorate full

Une fois que c'est fait, vous pouvez utiliser color.decorate.* pour jouer avec les couleurs

3 votes

log.decorate=full fait en sorte que les noms des ref soient imprimés avec leurs préfixes ( refs/heads/ etc.) ; je trouve log.decorate=short plus utile.

1 votes

Paramètre très utile, bien que je préfère également short plutôt que full

5voto

Certains voudront peut-être utiliser ce : %C(colorname) Il n'est pas nécessaire de modifier la configuration de la couleur.

Exemple : Coloration du nom de l'auteur en jaune

--pretty=format:"%C(yellow)%an%Creset"

Les couleurs normales ANSI devraient fonctionner https://en.wikipedia.org/wiki/ANSI_escape_code

  • noir
  • rouge
  • vert
  • jaune
  • bleu
  • magenta
  • cyan
  • blanc

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X