Kolor w git-log

106

Po uruchomieniu git log --decorate --pretty=onelinedane wyjściowe będą miały wpisy takie jak (HEAD, refs/published/master, master)z kolorami.

W moim gitconfig mam też:

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

Jak odtworzyć te kolory podczas tworzenia niestandardowego formatu, takiego jak poniższy?

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

Odpowiedzi:

91

Począwszy od git 1.8.3 (24 maja 2013 r.), Możesz używać %C(auto)do dekorowania %dw ciągu formatu git log.

Z informacji o wydaniu :

 * "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
źródło
60

git log --decoratePołoży domyślnie:

  • GŁOWA w kolorze cyjan
  • odległe gałęzie na czerwono
  • tag w kolorze zielonym

i można je zmienić za pomocą color.decorateconfig.

Ale git log --formatnie oferują sposób wyświetlania konkretnie HEAD czy piloty lub oddział: wszystkie trzy są wyświetlane przez %dz jednego koloru możliwe.


Aktualizacja maj 2013, jak wspomniano poniżej przez Elad Shahar (upvoted), git 1.8.3 oferty sprzedaży jeszcze jedną opcję:

git log –formatzawiera teraz %C(auto)token, który mówi Gitowi, aby używał koloru podczas rozstrzygania %d(dekoracji), %h(krótka nazwa obiektu zatwierdzenia), itp. na wyjściu terminala.

Ten wpis na blogu Atlassian komentuje, że ta funkcja jest częścią kilku innych, koncentrujących się na formacie ( git rebase, git count-objects) i kolorach ( git branch -vv)

Jest to dodatek do poprzedniej wersji auto,reset1.8.2 , która automatycznie wyłącza kolory, gdy wyjście nie jest używane przez terminal1

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

Uwaga: git 2.4+ (Q2 2015) będzie lepiej resetować kolory wokół nazw gałęzi.
Zobacz commit 5ee8758 autorstwa Junio ​​C Hamano ( gitster) :

log --decorate: nie przeciekaj koloru "zatwierdzenia" do następnego elementu

W „ git log --decorate” zobaczyłbyś następujący nagłówek zatwierdzenia:

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

gdzie „ commit ... (” jest namalowane color.diff.commit, „ HEAD” w color.decorate.head”, ,„ w ” color.diff.commit, nazwa gałęzi w, color.decorate.brancha następnie zamykająca„ )color.diff.commit.

Jeśli chcesz pomalować HEAD i nazwę lokalnego oddziału w tym samym kolorze co tekst podstawowy (być może dlatego, że cyjan i zielony są zbyt blade na czarno-białym terminalu, aby były czytelne), nie chciałbyś mówić

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

ponieważ nie byłbyś w stanie ponownie użyć tej samej konfiguracji na terminalu biało-czarnym. Naiwnie byś się tego spodziewał

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

do pracy, ale niestety tak nie jest.
Maluje ciąg „ HEAD” i nazwę gałęzi w tym samym kolorze, co nawias otwierający lub przecinek między elementami dekoracji.
Dzieje się tak, ponieważ kod zapomina o zresetowaniu koloru po wydrukowaniu „prefiksu” w swoim własnym kolorze.


Zauważ, że git 2.5 (Q2 2015) naprawia błąd:

Zob. Zatwierdzenie 429ad20 autorstwa Junio ​​C Hamano ( gitster) , 13 maja 2015 r.
(Połączone przez Junio ​​C Hamano - gitster- w zatwierdzeniu fd70780 , 22 maja 2015 r.)

log: nie skracaj nazw dekoracji zbyt wcześnie

log --decorateUlepszenie " " w Git 2.4, które pokazuje zatwierdzenie na końcu bieżącej gałęzi, np. " HEAD -> master", Nie działało z --decorate = full.


Git 2.9.x + (III kwartał 2016 r.) Naprawi kolejny błąd i zaszczyt color=autodla%C(auto)


Git 2.10.2 (październik 2016) naprawia inne błędy z zatwierdzeniem 82b83da (29 września 2016) i zatwierdzeniem c99ad27 (17 września 2016) przez René Scharfe (``) .
(Scalone przez Junio ​​C Hamano - gitster- w zatwierdzeniu 76796d4 , 28 października 2016 r.)

pretty: unikaj dodawania resetowania, %C(auto)jeśli wyjście jest puste

Emitujemy sekwencję ucieczki do resetowania koloru i atrybutu, %C(auto)aby upewnić się, że automatyczne kolorowanie jest wyświetlane zgodnie z przeznaczeniem.
Przestań to robić, jeśli wyjściowy strbuf jest pusty , tj. %C(auto)Pojawia się na początku łańcucha formatującego, ponieważ wtedy nie ma potrzeby resetowania i zapisujemy kilka bajtów w wyjściu.

pretty: niech %C(auto)zresetuje wszystkie atrybuty

Zresetuj kolory i atrybuty , %C(auto)aby umożliwić pełną automatyczną kontrolę nad nimi; w przeciwnym razie atrybuty, takie jak pogrubienie lub odwrócenie, mogą nadal obowiązywać z poprzednich %Csymboli zastępczych .

VonC
źródło
3
czy nie ma sposobu na użycie --decorate i --pretty = "... rzeczy"?
NorthIsUp
8
@NorthlsUp: --decoratewydaje się mieć swoją własną implementację i konfigurację, a jednocześnie --prettyoferuje te same informacje %dw jednym bloku, co oznacza, że ​​nie można mieć takiego samego szczegółowego poziomu konfiguracji kolorów, --prettyjak w przypadku --decorate.
VonC
Jedyną różnicą, jaką widzę, kiedy dodam „--decorate” po „git log”, jest to, że repozytoria zaczynają się od „refs / heads / ...” lub „refs / remotes ...”. Kolory są widoczne w obu przypadkach. Masz jakiś pomysł, co mogłoby to spowodować? Pytam o to, że mój plik .gitconfig nie pokazuje żadnych właściwości koloru. Zastanawiam się, gdzie mogę znaleźć moją właściwość „color.decorate”. Nie widzę tego w moim pliku .gitconfig.
J Woodchuck
@JWoodchuck Spróbuj git config --show-origin -l: zobaczysz wszystkie swoje konfiguracje. Następnie możesz grepować „kolor”.
VonC
Tak, nic się nie pojawia, gdy szukam koloru, co sprawia, że ​​ustawienia są tak tajemnicze.
J Woodchuck
9

Umieść je w nawiasach:

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

Tak %C(yellow reverse)by działało.

Josh Lee
źródło
1
nie do końca, %dto wszystkie gałęzie tak mogłoby wyglądać (HEAD, master), w tym przypadku głowa powinna być niebieska, a wzorzec zielony (myślę, że są to kolory domyślne). gdzie %C(yellow)%d%Cresetsprawi, że wszystko będzie tego samego koloru.
NorthIsUp
2
Och, kolorowanie poszczególnych dekoracji. Myślę, że to niemożliwe. Kod do renderowania wpisów dziennika jest zasadniczo implementowany dwukrotnie.
Josh Lee
1
Szkoda, że ​​to niemożliwe ... Bardzo bym chciałgit log --decorate --oneline --date=...
mgalgs
8

Opcja config log.decoratemoże włączyć / wyłączyć domyślne dekoracje w dziennikach.

git config --global log.decorate full

Gdy to zrobisz, możesz użyć color.decorate.*do zabawy kolorami

Henrik Gustafsson
źródło
3
log.decorate=fullpowoduje, że nazwy referencyjne są wypisywane wraz z ich prefiksami ( refs/heads/itp.); Uważam, że jest log.decorate=shortbardziej przydatny.
musiphil
1
Bardzo przydatne ustawienie, chociaż ja też wolę shortraczej niżfull
Thomas Levesque
4

Niektórzy mogą chcieć tego użyć: %C(colorname) To nie musi zmieniać konfiguracji kolorów.

Przykład: kolorowanie nazwiska autora na żółto

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

Zwykłe kolory ANSI powinny działać https://en.wikipedia.org/wiki/ANSI_escape_code

  • czarny
  • czerwony
  • Zielony
  • żółty
  • niebieski
  • magenta
  • cyjan
  • biały
NullPointerWizard
źródło