Cor no git-log

106

Quando você executa, git log --decorate --pretty=onelinea saída terá entradas como (HEAD, refs/published/master, master)com a coloração.

Eu também tenho o seguinte em meu gitconfig:

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

Como você replica essas cores ao fazer um formato personalizado como o seguinte?

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

Respostas:

91

A partir do git 1.8.3 (24 de maio de 2013), você pode usar %C(auto)para decorar %da string de formato de git log.

Das notas de lançamento :

 * "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
fonte
60

O git log --decoratecolocará por padrão:

  • o HEAD em ciano
  • os ramos remotos em vermelho
  • a etiqueta em verde

e pode ser alterado por meio de color.decorateconfiguração.

Mas a git log --formatnão oferecem uma maneira de exibir especificamente a HEAD ou controles remotos ou ramo: os três são exibidos por meio %d, com uma cor possível.


Atualização de maio de 2013, conforme mencionado abaixo por Elad Shahar (voto positivo), git 1.8.3 oferece mais uma opção:

git log –formatagora exibe um %C(auto)token que diz ao Git para usar cores ao resolver %d(decoração), %h(nome curto do objeto de commit), etc. para a saída do terminal.

Esta postagem do blog da Atlassian comenta que esse recurso é parte de vários outros focados em formato ( git rebase, git count-objects) e cores ( git branch -vv)

Isso vem em adição ao anterior auto,resetde 1.8.2 , que desativa automaticamente as cores quando a saída não é usada para um terminal1

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

Nota: git 2.4+ (Q2 2015) fará um trabalho melhor de redefinir a cor em torno dos nomes dos ramos.
Veja o commit 5ee8758 de Junio ​​C Hamano ( gitster) :

log --decorate: não vaze a cor "confirmar" no próximo item

Em " git log --decorate", você veria o cabeçalho de commit como este:

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

onde " commit ... (" é pintado color.diff.commit, " HEAD" in color.decorate.head, " ," in color.diff.commit, o nome do branch em color.decorate.branche, em seguida, fecha " )" em color.diff.commit.

Se você quiser pintar o HEAD e o nome do branch local com a mesma cor do texto do corpo (talvez porque ciano e verde são muito claros em um terminal preto-sobre-branco para serem legíveis), você não precisaria dizer

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

porque você não seria capaz de reutilizar a mesma configuração em um terminal branco sobre preto. Você esperaria ingenuamente

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

funcionar, mas infelizmente não funciona.
Ele pinta a string " HEAD" e o nome do ramo na mesma cor do parêntese de abertura ou vírgula entre os elementos de decoração.
Isso ocorre porque o código se esquece de redefinir a cor após imprimir o "prefixo" em sua própria cor.


Observe que o git 2.5 (2º trimestre de 2015) corrige um bug:

Veja o commit 429ad20 de Junio ​​C Hamano ( gitster) , 13 de maio de 2015.
(Fundido por Junio ​​C Hamano - gitster- no commit fd70780 , 22 de maio de 2015)

log: não encurte nomes de decoração muito cedo

O log --decorateaprimoramento " " no Git 2.4 que mostra o commit na ponta do branch atual, por exemplo, " HEAD -> master", não funcionou com --decorate = full.


Git 2.9.x + (Q3 2016) corrigirá outro bug e honra color=autopara%C(auto)


Git 2.10.2 (outubro de 2016) corrige outros bugs com commit 82b83da (29 set 2016) e commit c99ad27 (17 set 2016) por René Scharfe (``) .
(Incorporado por Junio ​​C Hamano - gitster- no commit 76796d4 , 28 de outubro de 2016)

pretty: evite adicionar reset para %C(auto)se a saída estiver vazia

Emitimos uma sequência de escape para redefinir a cor e o atributo para %C(auto)garantir que a coloração automática seja exibida conforme pretendido.
Pare de fazer isso se o strbuf de saída estiver vazio , ou seja, quando %C(auto)aparecer no início da string de formato, porque então não há necessidade de um reset e salvamos alguns bytes na saída.

pretty: vamos %C(auto)redefinir todos os atributos

Cores de reset e atributos em cima %C(auto)para permitir controlo automático total sobre eles; caso contrário, atributos como negrito ou reverso ainda podem estar em vigor nos %Cmarcadores anteriores .

VonC
fonte
3
não há como usar --decorate e --pretty = "... coisas"?
NorthIsUp
8
@NorthlsUp: --decorateparece ter sua própria implementação e configuração, enquanto --prettyoferece as mesmas informações por meio de %dum bloco, o que significa que você não pode ter o mesmo nível refinado de configuração de cores com o --prettyque tem --decorate.
VonC
A única diferença que vejo quando adiciono "--decorate" após "git log" é que os repositórios começam com "refs / heads / ..." ou "refs / remotes ...". As cores aparecem de qualquer maneira. Alguma idéia do que poderia causar isso? A razão de eu perguntar é que meu .gitconfig não mostra nenhuma propriedade de cor. Estou me perguntando onde posso encontrar minha propriedade "color.decorate". Não o vejo no meu arquivo .gitconfig.
J Woodchuck
@JWoodchuck Experimente git config --show-origin -l: você verá todas as suas configurações. Você pode então usar grep por "color".
VonC de
Sim, nada aparece quando procuro por cores, o que torna as configurações de exibição tão misteriosas.
J Woodchuck de
9

Coloque-os entre parênteses:

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

Então %C(yellow reverse)funcionaria.

Josh Lee
fonte
1
não é bem assim, %dsão todos branches para que pareça (HEAD, master), neste caso o head deve ser azul e o master deve ser verde (acredito que essas são as cores padrão). onde %C(yellow)%d%Cresetfaria tudo da mesma cor.
NorthIsUp
2
Oh, colorindo as decorações individuais. Eu acho que é impossível. O código para renderizar entradas de log é essencialmente implementado duas vezes.
Josh Lee
1
Pena que isso não é possível ... Eu adoraria fazergit log --decorate --oneline --date=...
mgalgs
8

A opção de configuração log.decoratepode habilitar / desabilitar decorações padrão em logs.

git config --global log.decorate full

Depois de fazer isso, você pode usar color.decorate.*para brincar com as cores

Henrik Gustafsson
fonte
3
log.decorate=fullfaz com que os nomes das ref sejam impressos com seus prefixos ( refs/heads/, etc.); Acho log.decorate=shortmais útil.
musiphil
1
Ambiente muito útil, embora eu também prefira em shortvez defull
Thomas Levesque
4

Alguns podem querer usar isto: %C(colorname) Isso não precisa alterar a configuração de cores.

Exemplo: colorir o nome do autor em amarelo

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

As cores ANSI regulares devem funcionar https://en.wikipedia.org/wiki/ANSI_escape_code

  • Preto
  • vermelho
  • verde
  • amarelo
  • azul
  • magenta
  • ciano
  • branco
NullPointerWizard
fonte