Farbe im Git-Log

106

Wenn Sie ausführen, hat git log --decorate --pretty=onelinedie Ausgabe Einträge wie (HEAD, refs/published/master, master)mit Färbung.

Ich habe auch Folgendes in meiner gitconfig:

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

Wie replizieren Sie diese Farben, wenn Sie ein benutzerdefiniertes Format wie das folgende ausführen?

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

Antworten:

91

Ab git 1.8.3 (24. Mai 2013), können Sie %C(auto)dekorieren %dim Formatstring von git log.

Aus den Versionshinweisen :

 * "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.)
Elad Shahar
quelle
60

Das git log --decoratewird standardmäßig gesetzt:

  • der KOPF in Cyan
  • die entfernten Zweige in rot
  • das tag in grün

und kann über color.decorateconfig geändert werden .

Die git log --formatbieten jedoch keine Möglichkeit, die HEAD oder Fernbedienungen oder Zweige spezifisch anzuzeigen : Alle drei werden durch angezeigt %d, wobei eine Farbe möglich ist.


Update Mai 2013, wie unten von Elad Shahar erwähnt (positiv bewertet), bietet Git 1.8.3 eine weitere Option:

git log –formatJetzt wird ein %C(auto)Token angezeigt, das Git anweist, beim Auflösen %d(Dekoration), %h(kurzer Commit-Objektname) usw. Farbe für die Terminalausgabe zu verwenden.

In diesem Atlassian-Blogbeitrag wird kommentiert, dass diese Funktion Teil mehrerer anderer Funktionen ist, die sich auf Format ( git rebase, git count-objects) und Farben ( git branch -vv) konzentrieren.

Dies kommt zu dem vorherigen auto,resetvon 1.8.2 hinzu , der Farben automatisch deaktiviert, wenn der Ausgang nicht für ein Terminal1 verwendet wird

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

Hinweis: Mit Git 2.4+ (2. Quartal 2015) können Sie die Farbe um Zweigstellennamen besser zurücksetzen.
Siehe Commit 5ee8758 von Junio ​​C Hamano ( gitster) :

log --decorate: Geben Sie keine "Commit" -Farbe in das nächste Element ein

In " git log --decorate" sehen Sie den Commit-Header wie folgt:

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

Dabei wird " commit ... (" eingezeichnet color.diff.commit, " HEAD" in color.decorate.head" ," in " color.diff.commit, der Filialname in color.decorate.branchund dann" )"in color.diff.commit.

Wenn Sie den Namen des KOPFES und des lokalen Zweigs in derselben Farbe wie der Text des Körpers malen möchten (möglicherweise, weil Cyan und Grün auf einem Schwarz-Weiß-Terminal zu schwach sind, um lesbar zu sein), möchten Sie dies nicht sagen müssen

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

weil Sie nicht in der Lage wären, dieselbe Konfiguration auf einem Weiß-auf-Schwarz-Terminal wiederzuverwenden. Sie würden naiv erwarten

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

zu arbeiten, aber leider nicht.
Es malt die Zeichenfolge " HEAD" und den Zweignamen in derselben Farbe wie die öffnende Klammer oder das Komma zwischen den Dekorationselementen.
Dies liegt daran, dass der Code vergisst, die Farbe zurückzusetzen, nachdem das "Präfix" in seiner eigenen Farbe gedruckt wurde.


Beachten Sie, dass Git 2.5 (Q2 2015) einen Fehler behebt:

Siehe Commit 429ad20 von Junio ​​C Hamano ( gitster) , 13. Mai 2015.
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit fd70780 , 22. Mai 2015)

log: Dekorationsnamen nicht zu früh kürzen

Die " log --decorate" Erweiterung in Git 2.4, die das Commit an der Spitze des aktuellen Zweigs HEAD -> masteranzeigt, z. B. " ", funktionierte nicht mit --decorate = full.


Git 2.9.x + (Q3 2016) wird einen weiteren Fehler und eine weitere Ehre für behebencolor=auto%C(auto)


Git 2.10.2 (Okt. 2016) behebt andere Fehler mit Commit 82b83da (29. September 2016) und Commit c99ad27 (17. September 2016) von René Scharfe (``) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 76796d4 , 28. Oktober 2016)

pretty: Vermeiden Sie das Hinzufügen von Reset, %C(auto)wenn die Ausgabe leer ist

Wir geben eine Escape-Sequenz zum Zurücksetzen von Farbe und Attribut aus %C(auto), um sicherzustellen, dass die automatische Farbgebung wie beabsichtigt angezeigt wird.
Beenden Sie dies, wenn der Ausgabe-Strbuf leer ist , dh wenn er %C(auto)am Anfang der Format-Zeichenfolge angezeigt wird , da dann kein Zurücksetzen erforderlich ist und wir einige Bytes in der Ausgabe speichern.

pretty: %C(auto)Alle Attribute zurücksetzen lassen

Setzen Sie Farben und Attribute zurück , %C(auto)um eine vollautomatische Kontrolle über sie zu ermöglichen. Andernfalls könnten Attribute wie Fett oder Umgekehrt noch von früheren Attributen wirksam sein%C Platzhaltern verwendet werden .

VonC
quelle
3
Gibt es keine Möglichkeit, --decorate und --pretty = "... stuff" zu verwenden?
NorthIsUp
8
@NorthlsUp: --decoratescheint eine eigene Implementierung und Konfiguration zu haben, --prettybietet jedoch die gleichen Informationen %dwie ein Block, was bedeutet, dass Sie nicht die gleiche feinkörnige Farbkonfiguration mit --prettyhaben können wie mit --decorate.
VonC
Der einzige Unterschied, den ich sehe, wenn ich "--decorate" nach "git log" hinzufüge, ist, dass die Repos entweder mit "refs / Heads / ..." oder "Refs / Remotes ..." beginnen. Die Farben erscheinen so oder so. Irgendeine Idee, was das verursachen würde? Der Grund, den ich frage, ist, dass meine .gitconfig keine Farbeigenschaften anzeigt. Ich frage mich, wo ich meine Eigenschaft "color.decorate" finden kann. Ich sehe es nicht in meiner .gitconfig-Datei.
J Woodchuck
@JWoodchuck Versuchen Sie git config --show-origin -l: Sie werden alle Ihre Konfigurationen sehen. Sie können dann nach "Farbe" suchen.
VonC
Ja, nichts wird angezeigt, wenn ich nach Farbe greife, was die Einstellungen so mysteriös macht.
J Woodchuck
9

Klammern Sie sie in Klammern:

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

So %C(yellow reverse)funktionieren würde.

Josh Lee
quelle
1
Nicht ganz, %dsind alle Zweige so, dass es so aussehen könnte (HEAD, master), in diesem Fall sollte der Kopf blau und der Master grün sein (ich glaube, das sind die Standardfarben). wo %C(yellow)%d%Cresetwürde es alle die gleiche Farbe machen.
NorthIsUp
2
Oh, die einzelnen Dekorationen ausmalen. Ich denke es ist unmöglich. Der Code zum Rendern von Protokolleinträgen wird im Wesentlichen zweimal implementiert.
Josh Lee
1
Schade, dass dies nicht möglich ist ... Ich würde es gerne tungit log --decorate --oneline --date=...
mgalgs
8

Die Konfigurationsoption log.decoratekann Standarddekorationen in Protokollen aktivieren / deaktivieren.

git config --global log.decorate full

Sobald dies erledigt ist, können Sie color.decorate.*mit den Farben spielen

Henrik Gustafsson
quelle
3
log.decorate=fullbewirkt, dass die Referenznamen mit ihren Präfixen ( refs/heads/usw.) gedruckt werden ; Ich finde log.decorate=shortes nützlicher.
Musiphil
1
Sehr nützliche Einstellung, obwohl ich auch lieber shortalsfull
Thomas Levesque
4

Einige möchten dies möglicherweise verwenden: %C(colorname) Dies muss die Farbkonfiguration nicht ändern.

Beispiel: Den Autorennamen gelb färben

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

Normale ANSI-Farben sollten unter https://en.wikipedia.org/wiki/ANSI_escape_code funktionieren

  • schwarz
  • rot
  • Grün
  • Gelb
  • Blau
  • Magenta
  • Cyan
  • Weiß
NullPointerWizard
quelle