ti-enxame.com

Formatação tabular do log Git

Eu tenho um alias simples para exibir alguns últimos commits:

log --pretty=format:'%h %an %s' -10

Como posso fazer com que os resultados sejam exibidos em colunas, como esta:

898e8789 Author1             Commit message here
803e8759 Other Author name   Commit message here
40
takeshin

No Git 1.8.3 e posterior, há suporte nativo para isso no formato bonito , usando a sintaxe %<(N) para formatar o próximo espaço reservado como [~ # ~] n [~ # ~] colunas de largura:

$ git log --pretty=format:'%h %<(20)%an %s' -10

Para versões anteriores a 1.8.3, a versão anterior desta resposta, mantida abaixo, deve funcionar.

Aqui está uma solução no Bash usando read para analisar as linhas de registro novamente separadas, e printf para imprimi-las, com um campo de largura fixa para o nome do autor para que as colunas permaneçam alinhadas. Ele assume que | nunca aparecerá no nome do autor; você pode escolher outro delimitador se achar que isso pode ser um problema.

git log --pretty=format:'%h|%an|%s' -10 | 
  while IFS='|' read hash author message
  do 
    printf '%s %-20s %s\n' "$hash" "$author" "$message"
  done

Você pode criar isso como um alias usando:

[alias]
    mylog = "!git log --pretty=format:'%h|%an|%s' -10 | while IFS='|' read hash author message; do printf '%s %-20s %s\n' \"$hash\" \"$author\" \"$message\"; done"

Tenho certeza que você poderia fazer isso com menos caracteres usando awk mas como o ditado vai,

Sempre que se deparam com um problema, algumas pessoas dizem “Vamos usar AWK”. Agora eles tem dois problemas.

Claro, tendo dito isso, eu tive que descobrir como fazer isso em awk que é um pouco mais curto:

git ... | awk -F '|' '{ printf "%s %-20s %s\n", $1, $2, $3 }'
56
Brian Campbell

Você também pode fazer:

git log --pretty=format:'%h %<(20)%an %s' -10

Não há necessidade de magia Shell ou pós-processamento com awk, column etc.

36
Jesse

O seguinte comando irá imprimir o log em uma forma tabular

git log --pretty=format:'%h|%an|%s' -10 | column -t -s '|'

o comando coluna "colunata" a saída, usando o "|" como separador de campo, ele descobrirá a largura ideal da coluna dada a entrada, por isso funcionaria bem mesmo se você tiver mais campos.

No Linux funcionará bem contanto que você não use cores, a implementação do Linux não lida bem com o códigos de escape ANSI .

Mas no Mac OS X, ele lidará com as cores e você pode usar qualquer caractere Unicode como delimitador de campo. Eu uso ∑ pois tenho certeza de que não ocorrerá por acaso no texto do commit. | é uma má escolha porque pode aparecer na descrição do commit e também se você usar --graph --decorate --all aparecerá como parte dos símbolos usados ​​para desenhar o gráfico

17
ecerulm

Para obter um formato verdadeiramente tabular, você também precisa truncar nomes de usuário maiores que, por exemplo, 20 caracteres:

git log --pretty=format:'%h %<(20,trunc)%an %s' -10

Além disso, se você estiver enviando para o terminal, pode querer evitar estouros de linha truncando o campo de mensagem de confirmação:

git log --pretty=format:'%h %<(20,trunc)%an %<(39,trunc)%s' -10

ou quebrar as linhas e recuar todas as linhas que transbordam para alinhar:

git log --pretty=format:'%w(79, 0, 29)%h %<(20,trunc)%an %s' -10

EDITAR: O exemplo acima codifica a largura do terminal para ter 79 caracteres. Em sistemas POSIX, você pode usar tput cols para retornar a largura:

git log --pretty=format:'%w(`tput cols`, 0, 29)%h %<(20,trunc)%an %s' -10

ou

git log --pretty=format:'%w($((`tput cols`-1)), 0, 29)%h %<(20,trunc)%an %s' -10

Infelizmente, estes dois últimos quebram git alias portanto, será necessário um apelido de terminal (a menos que você realmente ame digitar).

10
insysion

O problema com o formato tabular é o fato de que você pode ficar sem espaço ...

O seguinte é o meu melhor compromisso pessoal entre as coisas essenciais para exibir:

  • who
  • fez o que
  • e quando
  • para ser capaz de cavar mais pelo hash de commit para how

tão:

  git log --pretty --format='%h %aI %<(15)%an ::: %s'

ou

 git log --pretty --format='%h %cI %<(15)%an ::: %s'

se você deseja obter o tempo do commiter e não o tempo do autor

0
Yordan Georgiev

Como adicionar uma guia?

O que você está procurando é:

%x09

Aqui está um exemplo

git log --pretty=format:"%C(Magenta)%h %C(cyan)%C(bold)%ad%Creset %C(cyan)%cr%Creset%x09 | %s %C(green)%Creset" --date=short

Eu queria que a data relativa fosse tabulada porque não era um comprimento fixo, desta forma todas as colunas se alinham (para qualquer coisa menos de um ano atrás). Queria alinhá-lo o tempo todo, mas isso foi o mais longe que consegui antes de ficar sem tempo (ironicamente).

Espero que isto ajude!

Se você tiver sugestões para melhorar esta resposta para o caso do ano relativo (não apenas para saudar o ano), feliz em ouvi-las também, fique à vontade para editar esta resposta para adicioná-las se você souber como fazê-lo.

0
jasonleonhard