Como posso listar todas as tags no meu repositório Git pela data em que foram criadas?

128

Eu preciso de alguma maneira de listar todas as tags no meu sistema na data em que foram criadas, mas não tenho certeza se posso obter esses dados via git-log. Ideias?

Jon Ursenbach
fonte
2
Quer dizer que deseja obter a lista de todas as tags na ordem das datas de criação?
Lithuak
3
FYI (1.) Esta pergunta é para listar tags ANOTADOS por data. (2.) Para listar as tags LIGHTWEIGHT por data, clique aqui . (3.) Para um lembrete útil sobre qual é a diferença entre as tags leves e anotadas do Git, acesse aqui .
Trevor Boyd Smith
@TrevorBoydSmith: Isso não está correto. A diferença é que (2) lista todas as tags por data de confirmação do commit marcado , enquanto esta página fornece soluções que classificam por data marcada (embora apenas para tags anotadas, pois o git não armazena a data marcada para tags leves).
David P

Respostas:

174

A classificação por data de criação das tags funciona com tags leves e anotadas:

git for-each-ref --sort=creatordate --format '%(refname) %(creatordate)' refs/tags
Josh Lee
fonte
12
Impressionante. git for-each-ref --format="%(taggerdate): %(refname)" --sort=-taggerdate --count=10 refs/tagsfiz exatamente o que eu precisava. Obrigado!
Jon Ursenbach
21
Uma solução da @DrorCohen que funciona para tags leves: stackoverflow.com/questions/6900328/… . Colar aqui para fácil referência: git log --tags --simplify-by-decoration --pretty = "format:% ai% d"
Gilead
5
Pode usar %(contents)para adicionar na anotação, se necessário, por exemplogit for-each-ref --sort='*authordate' --format='%(taggerdate:short) | %(tag) | %(contents)' refs/tags
Tim Diggins
7
Ou até um pouco mais limpo:git for-each-ref --sort=taggerdate --format '%(tag)'
Baris Wanschers 08/08
4
--sort=creatordatefunciona para tags anotadas e não anotadas, mas --sort=taggerdateparece funcionar apenas com tags anotadas. testado usandogit version 2.16.3
austinheiman
56

O Git 2.8 (março de 2016) documenta outra opção que remonta ao git 1.4.4 (outubro de 2006) .
Consulte commit e914ef0 (05 de janeiro de 2016) por Eric Wong ( ele828) .
(Mesclado por Junio ​​C Hamano - gitster- no commit 108cb77 , 20 de janeiro de 2016)

Veja o novo Documentation/git-for-each-ref.txt

Para objetos de confirmação e marcação, os campos especiais creatordatee creatorcorresponderão à tupla de data ou nome-email-data apropriada dos campos committerou tagger, dependendo do tipo de objeto.
Eles destinam-se a trabalhar em uma mistura de tags anotadas e leves .

Então, usando creatordatefunciona com tags:

git for-each-ref --format='%(*creatordate:raw)%(creatordate:raw) %(refname) %(*objectname) %(objectname)' refs/tags | \
sort -n | awk '{ print $4, $3; }' 

Ou:

git tag --sort=-creatordate 

Como detalho em " Como classificar as tags git por ordem de sequência de versões do formulário rc-XYZW? ", Você pode adicionar uma ordem de classificação git tag(desde Git 2.0, junho de 2014).

Essa ordem de classificação inclui como nome do campo (listado em git for-each-ref) taggerdate . Isso permite git tag --sort=taggerdate(mencionado por DarVar abaixo )
Como exemplo, no git/gitrepo ele irá listar o v2.10.0tag última:

v2.9.1
v2.9.2
v2.9.3
v2.10.0-rc0
v2.10.0-rc1
v2.10.0-rc2
v2.10.0

O pedido padrão não ( git tag):

v2.1.2
v2.1.3
v2.1.4
v2.10.0
v2.10.0-rc0
v2.10.0-rc1
v2.10.0-rc2
v2.2.0
VonC
fonte
Muito obrigado. Fiquei me perguntando por que algumas datas estavam vazias. Eu já suspeitava de etiquetas leves. Estou feliz por não precisar recriar as tags, graças a creatordate!
Exhuma
35
git log --tags --simplify-by-decoration --pretty="format:%ci %d"

Também uma boa saída de (sem campo de data):

git log --tags --decorate --simplify-by-decoration --oneline

Para ver o histórico completo com dependências e confirmações lineares distribuídas (apenas eventos essenciais, como marcação e ramificação / mesclagem):

git log --graph --decorate --simplify-by-decoration --oneline --all
gavenkoa
fonte
Para pessoas preguiçosas: git log --tags --simplify-by-decoration --pretty="format:%ci %d" | grep "tag:"e funciona melhor para mim.
Mateusz
1
Observe que isso é ordenado pela data de confirmação, não pela data em que as tags foram criadas. A resposta (atualmente) com a melhor classificação de Josh Lee faz o pedido até a data em que a tag foi criada.
Nathanial Woolls
13
git tag --sort=-taggerdate

De acordo com a página do manual, "Prefixo - para classificar em ordem decrescente do valor".

git tagusa as mesmas chaves de classificação git-for-each-refque é onde as chaves estão documentadas.

Zamicol
fonte
1
Este é provavelmente o mais correto com base na pergunta. Aqui está o link para a documentação descrevendo os possíveis campos de classificação: git-scm.com/docs/git-for-each-ref
prasanthv
Essa resposta não leva em consideração as tags leves, pois possuem "taggerdate" vazio. Outras respostas com "creatordate" são mais precisas.
morhook 03/06
13

Este one-liner exibe datas e tags sem qualquer problema.

git tag --format='%(creatordate:short)%09%(refname:strip=2)'

Resultado:

2015-04-01  storaged-2.0.0
2015-06-11  storaged-2.1.0
2015-08-06  storaged-2.1.1
...

Se você não gosta de como as tags são classificadas por padrão, pode classificar por data com a opção --sort=creatordate, por exemplo. Veja a resposta do VonC para mais detalhes.

elboulangero
fonte
Esse bom método deve classificá-los por data? ascendente? descendente?
Motti Shneor 31/10/19
11

Para que as tags anotadas e leves sejam classificadas por completo, com base na data de confirmação, estou usando:

git for-each-ref --format='%(*committerdate:raw)%(committerdate:raw) %(refname) %(*objectname) %(objectname)' refs/tags | \
  sort -n | awk '{ print $4, $3; }' 

Este comando listará todas as tags e o ID do objeto de confirmação associado, em ordem cronológica.

Yann Droneaud
fonte
Ofuscou um pouco. ... Nas tags anotadas, 'data do emissor' está vazia, enquanto nas tags leves 'taggerdate' está vazia. Portanto, como uma solução alternativa '* committerdate' está dizendo ao Git para voltar a referenciar datas do objeto de confirmação original quando ele é leve. ...
ingyhere
O uso de 'creatordate' deve efetivamente fazer a mesma coisa.
ingyhere
7

Com Git version 2.10.0.windows.1

git tag --sort=taggerdate

DarVar
fonte
5

O seguinte depende do commit, portanto, não importa se ele possui informações de data com o commit:

git log --tags --decorate --simplify-by-decoration|grep ^commit|grep tag|sed -e 's/^.*: //' -e 's/)$//' -e 's/,.*$//'|tac

A resposta acima, de Josh Lee, depende de uma data de tag para que o pedido seja correto.

Andrew McGlashan
fonte
Não tenho certeza qual é o comando à direita tac- pode alterá-lo para more. De qualquer forma, seu comando funcionou muito bem - obrigado!
David H
3

Com base nos métodos mencionados anteriormente, eu também queria ver a data real da tag na lista e, portanto, minha versão em uso é:

git for-each-ref --format='%(*creatordate:raw)%(creatordate:raw) %(creatordate:short) %(refname) %(*objectname) %(objectname)' refs/tags | sort -n | awk '{ print $3, $5, $4 }'
Ville
fonte