Colore in git-log


106

Quando si esegue git log --decorate --pretty=onelinel'output avrà voci come la (HEAD, refs/published/master, master)colorazione.

Ho anche quanto segue nel mio gitconfig:

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

Come replichi quei colori quando esegui un formato personalizzato come il seguente?

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

Risposte:


91

A partire da git 1.8.3 (24 maggio 2013), puoi usare %C(auto)per decorare %dnella stringa di formato git log.

Dalle note di rilascio :

 * "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.)

60

Il git log --decoratemetterà per impostazione predefinita:

  • la TESTA in ciano
  • i rami remoti in rosso
  • l'etichetta in verde

e può essere modificato tramite color.decorateconfig.

Ma il git log --formatnon offrono un modo per visualizzare in particolare la HEAD o telecomandi o filiale: tutti e tre vengono visualizzati tramite %d, con un colore possibile.


L'aggiornamento di maggio 2013, come indicato di seguito da Elad Shahar (votato positivamente), git 1.8.3 offre un'altra opzione:

git log –formatora presenta un %C(auto)token che dice a Git di usare il colore durante la risoluzione %d(decorazione), %h(nome oggetto di commit breve), ecc. per l'output del terminale.

Questo post sul blog Atlassian commenta che questa funzione fa parte di molte altre incentrate su formato ( git rebase, git count-objects) e colori ( git branch -vv)

Questo si aggiunge al precedente auto,reset1.8.2 , che disabilita automaticamente i colori quando l'output non viene utilizzato per un terminale1

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

Nota: git 2.4+ (Q2 2015) farà un lavoro migliore nel ripristinare il colore attorno ai nomi dei rami.
Vedi commit 5ee8758 di Junio ​​C Hamano ( gitster) :

log --decorate: non trapelare il colore "commit" nell'elemento successivo

In " git log --decorate", vedresti l'intestazione del commit in questo modo:

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

dove " commit ... (" è disegnato dentro color.diff.commit, " HEAD" dentro color.decorate.head, " ," dentro color.diff.commit, il nome del ramo dentro color.decorate.branche poi chiude " )" dentro color.diff.commit.

Se volessi dipingere HEAD e il nome del ramo locale dello stesso colore del corpo del testo (forse perché il ciano e il verde sono troppo sbiaditi su un terminale nero su bianco per essere leggibili), non dovresti dire

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

perché non saresti in grado di riutilizzare la stessa configurazione su un terminale bianco su nero. Te lo aspetteresti ingenuamente

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

per funzionare, ma purtroppo non funziona.
Dipinge la stringa " HEAD" e il nome del ramo dello stesso colore della parentesi o virgola di apertura tra gli elementi decorativi.
Questo perché il codice dimentica di reimpostare il colore dopo aver stampato il "prefisso" con il proprio colore.


Nota che git 2.5 (Q2 2015) corregge un bug:

Vedere commit 429ad20 di Junio ​​C Hamano ( gitster) , 13 maggio 2015
(unito da Junio ​​C Hamano - gitster- in commit fd70780 , 22 maggio 2015)

log: non abbreviare troppo presto i nomi delle decorazioni

Il " log --decorate" miglioramento in Git 2.4 che mostra il commit alla fine del ramo corrente, ad esempio " HEAD -> master", non ha funzionato con --decorate = full.


Git 2.9.x + (Q3 2016) risolverà un altro bug e onore color=autoper%C(auto)


Git 2.10.2 (ottobre 2016) corregge altri bug con commit 82b83da (29 settembre 2016) e commit c99ad27 (17 settembre 2016) di René Scharfe (``) .
(Fuso da Junio ​​C Hamano - gitster- in commit 76796d4 , 28 ottobre 2016)

pretty: evitare di aggiungere reset %C(auto)se l'uscita è vuota

Emettiamo una sequenza di escape per ripristinare il colore e l'attributo per %C(auto)assicurarci che la colorazione automatica venga visualizzata come previsto.
Smetti di farlo se l'output strbuf è vuoto , cioè quando %C(auto)appare all'inizio della stringa di formato, perché allora non c'è bisogno di un reset e salviamo alcuni byte nell'output.

pretty: lascia %C(auto)resettare tutti gli attributi

I colori di reset e gli attributi al momento %C(auto)per consentire il pieno controllo automatico su di loro; altrimenti attributi come grassetto o inverso potrebbero essere ancora attivi dai %Csegnaposto precedenti .


3
non c'è modo di usare --decorate e --pretty = "... stuff"?
NorthIsUp

8
@NorthlsUp: --decoratesembra avere una propria implementazione e configurazione, mentre --prettyoffre le stesse informazioni attraverso %dun blocco, il che significa che non puoi avere lo stesso livello di configurazione del colore a grana fine con --prettyquello che hai con --decorate.
VonC

L'unica differenza che vedo quando aggiungo "--decorate" dopo "git log" è che i repository iniziano con "refs / heads / ..." o "refs / remotes ...". I colori vengono visualizzati in entrambi i casi. Qualche idea su cosa potrebbe causare questo? Il motivo per cui lo chiedo è che il mio .gitconfig non mostra alcuna proprietà di colore. Mi chiedo dove posso trovare la mia proprietà "color.decorate". Non lo vedo nel mio file .gitconfig.
J marmotta

@JWoodchuck Prova git config --show-origin -l: vedrai tutte le tue configurazioni. Puoi quindi grep per "color".
VonC

Sì, non viene visualizzato nulla quando cerco il colore, il che rende le impostazioni così misteriose.
J marmotta

9

Inseriscili tra parentesi:

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

Quindi %C(yellow reverse)funzionerebbe.


1
non proprio, %dè tutto rami così potrebbe sembrare (HEAD, master), in questo caso la testa dovrebbe essere blu e il master dovrebbe essere verde (credo che questi siano i colori predefiniti). dove %C(yellow)%d%Cresetrenderebbe tutto lo stesso colore.
NorthIsUp

2
Oh, colorare le singole decorazioni. Penso sia impossibile. Il codice per il rendering delle voci di registro è essenzialmente implementato due volte.
Josh Lee,

1
Peccato che non sia possibile ... Mi piacerebbe farlogit log --decorate --oneline --date=...
mgalgs

8

L'opzione di configurazione log.decoratepuò abilitare / disabilitare le decorazioni predefinite nei log.

git config --global log.decorate full

Una volta fatto, puoi usare color.decorate.*per giocare con i colori


3
log.decorate=fullfa sì che i nomi dei riferimenti vengano stampati con i loro prefissi ( refs/heads/, ecc.); Trovo log.decorate=shortpiù utile.
musiphil

1
Impostazione molto utile, anche se preferisco shortpiuttosto chefull
Thomas Levesque

4

Alcuni potrebbero voler usare questo: %C(colorname) Questo non ha bisogno di cambiare la configurazione del colore.

Esempio: colorare in giallo il nome dell'autore

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

I colori ANSI regolari dovrebbero funzionare https://en.wikipedia.org/wiki/ANSI_escape_code

  • nero
  • rosso
  • verde
  • giallo
  • blu
  • magenta
  • ciano
  • bianca
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.