Como alterar os formatos de data do log do Git

150

Estou tentando exibir o último commit no Git, mas preciso da data em um formato especial.

Eu sei que o formato bonito do log %adrespeita o --dateformato, mas o único --dateformato que posso encontrar é "curto". Quero conhecer os outros e se posso criar um personalizado, como:

git -n 1 --date=**YYMMDDHHmm** --pretty=format:"Last committed item in this release was by %%an, %%aD, message: %%s(%%h)[%%d]"
ar3
fonte
1
Eu sempre considero a documentação oficial do Linux Kernel Git um excelente recurso para esse tipo de pergunta.
2
Nota: você agora (novembro de 2014, Git 2.2) possui --date=iso-strict: veja minha resposta abaixo
VonC:
4
Com o git 2.7 (quarto trimestre de 2015), você pode solicitar o uso do fuso horário local para qualquer formato de data! Veja minha resposta abaixo . Isso significa que, além de --date=(relative|local|default|iso|iso-strict|rfc|short|raw), você também terá:--date=(relative-local|default-local|iso-local|iso-strict-local|rfc-local|short-local|raw-local)
VonC

Respostas:

167

Os outros são (de git help log):

--date=(relative|local|default|iso|rfc|short|raw)
  Only takes effect for dates shown in human-readable format,
  such as when using "--pretty".  log.date config variable
  sets a default value for log command’s --date option.

--date=relative shows dates relative to the current time, e.g. "2 hours ago".

--date=local shows timestamps in user’s local timezone.

--date=iso (or --date=iso8601) shows timestamps in ISO 8601 format.

--date=rfc (or --date=rfc2822) shows timestamps in RFC 2822 format,
  often found in E-mail messages.

--date=short shows only date but not time, in YYYY-MM-DD format.

--date=raw shows the date in the internal raw git format %s %z format.

--date=default shows timestamps in the original timezone
  (either committer’s or author’s).

Não há nenhuma maneira interna que eu conheça para criar um formato personalizado, mas você pode fazer alguma mágica de shell.

timestamp=`git log -n1 --format="%at"`
my_date=`perl -e "print scalar localtime ($timestamp)"`
git log -n1 --pretty=format:"Blah-blah $my_date"

O primeiro passo aqui fornece um timestamp de milissegundos. Você pode alterar a segunda linha para formatar esse carimbo de data e hora como desejar. Este exemplo fornece algo semelhante a --date=local, com um dia preenchido.


E se você quiser efeito permanente sem digitar isso sempre, tente

git config log.date iso 

Ou, para ter efeito em todo o seu uso de git com esta conta

git config --global log.date iso
dmedvinsky
fonte
15
E se você quiser efeito permanente sem digitar isso toda vez, tentar algo como git config log.date isoou, para efeito sobre todo o uso seu git com essa contagit config --global log.date iso
Stéphane Gourichon
12
Você pode usar seus próprios formatos. veja a resposta de Ben Allred . --format:<args>passará <args>para strftime.
Capitão Man
190

Além disso --date=(relative|local|default|iso|iso-strict|rfc|short|raw), como já mencionado, você também pode usar um formato de data de log personalizado com

--date=format:'%Y-%m-%d %H:%M:%S'

Isso gera algo como 2016-01-13 11:32:13.

NOTA: Se você der uma olhada no commit vinculado abaixo, acredito que precisará pelo menos Git v2.6.0-rc0para que isso funcione.

Em um comando completo, seria algo como:

git config --global alias.lg "log --graph --decorate 
-30 --all --date-order --date=format:'%Y-%m-%d %H:%M:%S' 
--pretty=format:'%C(cyan)%h%Creset %C(black bold)%ad%Creset%C(auto)%d %s'" 

Não consegui encontrar isso na documentação em nenhum lugar (se alguém souber onde encontrá-lo, comente), então encontrei os marcadores por tentativa e erro.

Na minha pesquisa por documentação, encontrei um commit no Git que indica que o formato é alimentado diretamente strftime. Olhando para cima strftime( aqui ou aqui ), os marcadores que encontrei correspondem aos marcadores listados.

Os espaços reservados incluem:

%a      Abbreviated weekday name
%A      Full weekday name
%b      Abbreviated month name
%B      Full month name
%c      Date and time representation appropriate for locale
%d      Day of month as decimal number (01 – 31)
%H      Hour in 24-hour format (00 – 23)
%I      Hour in 12-hour format (01 – 12)
%j      Day of year as decimal number (001 – 366)
%m      Month as decimal number (01 – 12)
%M      Minute as decimal number (00 – 59)
%p      Current locale's A.M./P.M. indicator for 12-hour clock
%S      Second as decimal number (00 – 59)
%U      Week of year as decimal number, with Sunday as first day of week (00 – 53)
%w      Weekday as decimal number (0 – 6; Sunday is 0)
%W      Week of year as decimal number, with Monday as first day of week (00 – 53)
%x      Date representation for current locale
%X      Time representation for current locale
%y      Year without century, as decimal number (00 – 99)
%Y      Year with century, as decimal number
%z, %Z  Either the time-zone name or time zone abbreviation, depending on registry settings
%%      Percent sign

Em um comando completo, seria algo como

git config --global alias.lg "log --graph --decorate -30 --all --date-order --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%C(cyan)%h%Creset %C(black bold)%ad%Creset%C(auto)%d %s'" 
Ben Allred
fonte
4
@Shiva: Eu me deparei com um caso recentemente em que não funcionou e pode ser a mesma coisa com a qual você está se deparando. Eu estava usando uma máquina de emparelhamento com uma versão mais antiga do Git. Quando atualizei o Git, o formato da data personalizada começou a funcionar. Se você der uma olhada no commit vinculado acima, acredito que precisará de pelo menos a v2.6.0-rc0. O exemplo dado é exatamente o que eu uso. Em um comando completo seria algo comogit config --global alias.lg "log --graph --decorate -30 --all --date-order --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%C(cyan)%h%Creset %C(black bold)%ad%Creset%C(auto)%d %s'"
Ben Allred
1
Obrigado Ben! Colei seu comando como está e executei o git lge ainda recebo o seguinte erro. fatal: unknown date format format:%Y-%m-%d %H:%M:%S. Estou executando o git no Windows. Aqui está a minha versão do git. git version 1.9.5.msysgit.1. Então, eu tenho que atualizar para a versão mais recente?
Shiva
Oi Ben, eu estava na versão mais antiga. Eu atualizei para o mais recente e isso funciona. Então editei sua resposta para torná-la mais clara (movi seu comentário para o topo) e também adicionei +1 a você! Obrigado!!
Shiva
Isso funciona um prazer! Usando um script bash simples para exportar um CSV, agora eu posso ter colunas por ano, mês, semana, etc.
Jamie Taylor
1
@ EdRandall: Se você está se referindo %X, ~~ eu apenas tentei na minha máquina e definitivamente obtendo horários no meu fuso horário. ~~ Hmm, agora não tenho certeza. Clonei um repositório de alguém que não estava no meu fuso horário e tentei novamente. Acho que estou apenas começando a hora formatada usando as configurações atuais de localidade, mas com o fuso horário cortado.
Ben Allred
36

Depois de muito tempo procurando uma maneira de obter git loga data no formato YYYY-MM-DDde uma maneira que funcionasse less, criei o seguinte formato:

%ad%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08

junto com o interruptor --date=iso.

Isso imprimirá a data no formato ISO (longo) e, em seguida, imprimirá 14 vezes o caractere de backspace (0x08), que, no meu terminal, remove efetivamente tudo após a parte AAAA-MM-DD. Por exemplo:

git log --date=iso --pretty=format:'%ad%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%aN %s'

Isso dá algo como:

2013-05-24 bruno This is the message of the latest commit.
2013-05-22 bruno This is an older commit.
...

O que fiz foi criar um alias nomeado lcom alguns ajustes no formato acima. Ele mostra o gráfico de confirmação à esquerda e, em seguida, o hash da confirmação, seguido da data, dos nomes abreviados, dos refnames e do assunto. O alias é o seguinte (em ~ / .gitconfig):

[alias]
        l = log --date-order --date=iso --graph --full-history --all --pretty=format:'%x08%x09%C(red)%h %C(cyan)%ad%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08 %C(bold blue)%aN%C(reset)%C(bold yellow)%d %C(reset)%s'
Bruno Reis
fonte
2
Isso funciona muito bem para mim. Usar 6 de% x08 remove exatamente o fuso horário à minha frente.
Penghe Geng
7
Que tal--date=short shows only date but not time, in YYYY-MM-DD format.
Paaske
3
No zsh e no bash, isso mostra a saída no terminal, mas se você o inserir em qualquer coisa, os dados "backspaced" ainda estarão lá. Isso significa que coisas como | sort | uniqnão funcionam.
chmac
5
Isso é ridículo e incrível ao mesmo tempo. Estou usando %C(bold cyan)%ai%x08%x08%x08%x08%x08%x08%x08%x08%x08%C(reset) %C(bold green)(%ar%x08%x08%x08%x08)%C(reset)para obter o formato 2015-01-19 11:27 (11 days). +1
naught101
2
agora esta resposta stackoverflow.com/a/34778736/907576 é mais apropriada (uma vez que GIT v2.6.0-RC0)
radistao
25

Você pode usar a opção de truncamento de campo para evitar muitos %x08caracteres. Por exemplo:

git log --pretty='format:%h %s%n\t%<(12,trunc)%ci%x08%x08, %an <%ae>'

é equivalente a:

git log --pretty='format:%h %s%n\t%ci%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08, %an <%ae>'

E um pouco mais fácil para os olhos.

Melhor ainda, para este exemplo particular, usando %cdhonrará o --date=<format>, então se você quiser YYYY-MM-DD, você pode fazer isso e evitar %<e %x08inteiramente:

git log --date=short --pretty='format:%h %s%n\t%cd, %an <%ae>'

Acabei de perceber que isso era um pouco circular em relação ao post original, mas deixarei no caso de outros chegarem aqui com os mesmos parâmetros de pesquisa que eu.

dvhart
fonte
23

Eu precisava da mesma coisa e achei o seguinte funcionando para mim:

git log -n1 --pretty='format:%cd' --date=format:'%Y-%m-%d %H:%M:%S'

O --date=formatformata a saída de data onde o --prettydiz o que imprimir.

lac_dev
fonte
2
Isso não funciona para mim. Eu recebo "formato de data desconhecida"
Ray
qual versão do git você tem?
113316 Dech
Atualizado usando medium.com/@katopz/how-to-upgrade-git-ff00ea12be18
amateur barista
git log --pretty=format:"%h%x09%cd%x09%s" --date=format:'%Y-%m-%d %H:%M:%S %p'
amateur barista
@amateurbarista que não mostra a última confirmação, leia a solicitação. O ar3 está tentando mostrar o último commit, não os últimos poucos commit.
lac_dev
16

Esteja ciente do date=isoformato " ": não é exatamente o ISO 8601 .
Consulte commit " 466fb67 " de Beat Bolli ( bbolli) , para Git 2.2.0 (novembro de 2014)

pretty: forneça um formato estrito de data ISO 8601

O formato de data "ISO" do Git realmente não está em conformidade com o padrão ISO 8601 devido a pequenas diferenças e não pode ser analisado apenas pelos analisadores ISO 8601, por exemplo, os das cadeias de ferramentas XML.

A saída de " --date=iso" diverge da ISO 8601 das seguintes maneiras:

  • um espaço em vez do Tdelimitador de data / hora
  • um espaço entre a hora e o fuso horário
  • dois pontos entre horas e minutos do fuso horário

Adicione um formato de data ISO 8601 estrito para exibir datas de autor e autor.
Use os especificadores de formato ' %aI' e ' %cI' e adicione nomes de formato de data ' --date=iso-strict' ou ' --date=iso8601-strict'.

Veja este tópico para discussão.

VonC
fonte
11
date -d @$(git log -n1 --format="%at") +%Y%m%d%H%M

Observe que isso será convertido para o fuso horário local, caso isso seja importante para o seu caso de uso.

guepardo
fonte
Obrigado. Eu ajustei-o com% ct
cagney
5

O Git 2.7 (quarto trimestre de 2015) será apresentado -localcomo uma instrução.
Isso significa que, além de:

--date=(relative|local|default|iso|iso-strict|rfc|short|raw)

você também terá:

--date=(default-local|iso-local|iso-strict-local|rfc-local|short-local)

O -localsufixo não pode ser usado com rawou relative. Referência .

Agora você pode solicitar qualquer formato de data usando o fuso horário local . Vejo

Consulte commit add00ba , commit 547ed71 (03 de setembro de 2015) por Jeff King ( peff) .
(Mesclado por Junio ​​C Hamano - gitster- na confirmação 7b09c45 , 05 de outubro de 2015)

Em particular, o último acima (commit add00ba) menciona:

date: make " local" ortogonal ao formato da data:

A maioria dos nossos --datemodos " " refere-se ao formato da data: quais itens mostramos e em que ordem.
Mas " --date=local" é um pouco estranho. Significa "mostrar a data no formato normal, mas usando o fuso horário local".
O fuso horário que usamos é ortogonal ao formato real e não há motivo para não termos "iso8601 localizado" etc.

Este patch adiciona um localcampo " " booleano a " struct date_mode" e elimina o DATE_LOCALelemento da date_mode_typeenumeração (agora é apenas DATE_NORMALmais local=1).
O novo recurso é acessível aos usuários adicionando " -local" a qualquer modo de data (por exemplo, " iso-local")) e mantemos " local" como um alias para " default-local" para compatibilidade com versões anteriores.

VonC
fonte
2
Devo notar que os format-localtrabalhos também! Portanto, é muito perfeito mesclar a potência entre o formato favorito e o local.
acgtyrant
5

A opção de formato %aiera o que eu queria:

%ai: data do autor, formato semelhante ao ISO 8601

--format="%ai"
ThorSummoner
fonte
5

Eu preciso da data em um formato especial.

Com o Git 2.21 (primeiro trimestre de 2019), foi introduzido um novo formato de data " --date=human" que transforma sua saída dependendo da distância da hora atual .

" --date=auto" pode ser usado para usar este novo formato quando a saída estiver indo para o pager ou para o terminal e, caso contrário, o formato padrão.

Consulte commit 110a6a1 , commit b841d4f (29 Jan 2019) e commit 038a878 , commit 2fd7c22 (21 Jan 2019) por Stephen P. Smith (``) .
Veja commit acdd377 (18 Jan 2019) por Linus Torvalds ( torvalds) .
(Mesclado por Junio ​​C Hamano - gitster- in commit ecbe1be , 07 de fevereiro de 2019)

Adicione documentação de formato de data 'humano'

Exiba informações de data e hora em um formato semelhante ao modo como as pessoas escrevem datas em outros contextos.
Se o ano não for especificado, o leitor deduzirá que a data é informada no ano atual .

Ao não exibir as informações redundantes, o leitor se concentra nas informações que são diferentes .
O patch relata datas relativas com base nas informações inferidas a partir da data na máquina que está executando o gitcomando no momento em que o comando é executado.

Embora o formato seja mais útil para os seres humanos ao eliminar informações inferidas, não há nada que o torne realmente humano.
Se o relativeformato de data ' ' já não estivesse implementado, o uso de ' relative' seria apropriado.

Adicione humantestes de formato de data.

Ao usar humanvários campos, são suprimidos, dependendo da diferença de horário entre a data de referência e a data do computador local.

  • Nos casos em que a diferença é menor que um ano, o campo do ano é suprimido.
  • Se o tempo for inferior a um dia; o mês e o ano são suprimidos.
check_date_format_human 18000       "5 hours ago"       #  5 hours ago
check_date_format_human 432000      "Tue Aug 25 19:20"  #  5 days ago
check_date_format_human 1728000     "Mon Aug 10 19:20"  #  3 weeks ago
check_date_format_human 13000000    "Thu Apr 2 08:13"   #  5 months ago
check_date_format_human 31449600    "Aug 31 2008"       # 12 months ago
check_date_format_human 37500000    "Jun 22 2008"       #  1 year, 2 months ago
check_date_format_human 55188000    "Dec 1 2007"        #  1 year, 9 months ago
check_date_format_human 630000000   "Sep 13 1989"       # 20 years ago

## Substitua o automodo ' ' proposto por ' auto:'

Além de adicionar o humanformato ' ', o patch adicionou a autopalavra - chave que poderia ser usada no arquivo de configuração como uma maneira alternativa de especificar o formato humano. Remover 'auto' limpa a humaninterface do formato ' '.

Adicionada a capacidade de especificar o modo ' foo' se o pager estiver sendo usado usando auto:foosintaxe.
Portanto, o auto:humanmodo ' ' data é o padrão humanse estivermos usando o pager.
Então você pode fazer:

git config --add log.date auto:human

e seus git logcomandos " " mostrarão o formato legível por humanos, a menos que você esteja criando scripts.


O Git 2.24 (quarto trimestre de 2019) simplificou o código.

Consulte commit 47b27c9 , commit 29f4332 (12 set 2019) por Stephen P. Smith (``) .
(Mesclado por Junio ​​C Hamano - gitster- in commit 36d2fca , 07 out 2019)

Pare de passar o código 'agora' para a data

A confirmação b841d4f (Adicionar humanformato à ferramenta de teste, 2019-01-28, Git v2.21.0-rc0) adicionou uma get_time()função que permite que $GIT_TEST_DATE_NOWo ambiente substitua a hora atual.
Portanto, não precisamos mais interpretar essa variável cmd__date().

Portanto, podemos parar de passar o " now" parâmetro através das funções de data, pois ninguém as utiliza.
Observe que precisamos garantir que todos os chamadores anteriores que usaram um nowparâmetro " " estejam usando corretamente get_time().

VonC
fonte
2
git log -n1 --format="Last committed item in this release was by %an, `git log -n1 --format=%at | awk '{print strftime("%y%m%d%H%M",$1)}'`, message: %s (%h) [%d]"
webb
fonte
Cuidado ao elaborar? Além disso, sua resposta já possui um campo e histórico de autor. não há necessidade de assinar.
Kissaki
2

Use o Bash e o comando date para converter de um formato semelhante ao ISO para o desejado. Eu queria um formato de data no modo organizacional (e item de lista), então fiz isso:

echo + [$(date -d "$(git log --pretty=format:%ai -1)" +"%Y-%m-%d %a %H:%M")] \
    $(git log --pretty=format:"%h %s" --abbrev=12 -1)

E o resultado é, por exemplo:

+ [2015-09-13 Sun 22:44] 2b0ad02e6cec Merge pull request #72 from 3b/bug-1474631
Liam
fonte