Obtenha a hora e a data das tags git


88

Eu tenho um projeto que está usando git e marquei todos os lançamentos com uma tag.

$ git tag
v1.0.0
v1.0.1
v1.0.2
v1.0.3
v1.1.0

Meu objetivo é listar os lançamentos e as datas de lançamento em uma interface web (tag / data de confirmação = data de lançamento). Atualmente listamos todos os lançamentos usando git tag.

Como posso obter a hora e a data de quando a tag foi feita (ou para onde ela aponta)?


2
É bom precisar aqui que é a data de confirmação da tag que você está procurando. Como uma tag não tem data.
jobwat 01 de


Respostas:


71

Use o --formatargumento para git log:

git log -1 --format=%ai MY_TAG_NAME

3
DICA - Substitua "TAG" pelo nome da tag. Por exemplo git log -1 --format=%ai v0.2.3,.
Tobias

5
Se você quiser ISO8601, faça --format=%aI("I" maiúsculo)
Chaim Eliyah

git log -1 --format=%ai MY_TAG_NAME | catdesativar visualização de página
elinx

O que "-1" está fazendo?
Blademaster

@Blademaster Diz git logpara mostrar apenas um commit, aquele pertencente à tag. O comportamento padrão é mostrar todos os commits do especificado de volta ao primeiro commit no repositório.
user4815162342

83

Isso sempre funcionou para mim:

git log --tags --simplify-by-decoration --pretty="format:%ci %d"

Consulte a seção "FORMATOS BONITOS" da página de manual do git-log para obter detalhes sobre a string de formato, se desejar uma formatação de data diferente.


13
Para ser avisado, porém, isso irá listar a data / hora para o commit, mas não a data / hora para a tag anotada.
WiSaGaN

5
Basta colocar taglog = log --tags --simplify-by-decoration --pretty='format:%ci %d'(observe as aspas simples, NÃO aspas) na seção [alias] de seu arquivo .gitconfig, e agora você tem um comando git taglog :)
Lambart

40

Mais uma opção:

git for-each-ref --format="%(refname:short) | %(creatordate)" "refs/tags/*"

Consulte https://git-scm.com/docs/git-for-each-ref#_field_names para opções de formato

%(creatordate) dá a data do commit apontado, para ver a data em que a tag foi criada em uso %(taggerdate)

Você pode incorporar o shell diretamente:

$> git for-each-ref --shell --format="ref=%(refname:short) dt=%(taggerdate:format:%s)" "refs/tags/*"

ref='v1.10' dt='1483807817'
ref='v1.11' dt='1483905854'
ref='v1.12.0' dt='1483974797'
ref='v1.12.1' dt='1484015966'
ref='v1.13' dt='1484766542'
ref='v1.2' dt='1483414377'
ref='v1.3' dt='1483415058'
ref='v1.3-release' dt='' <-- not an annotated tag, just a pointer to a commit so no 'taggerdate', it would have a 'creator date'.
ref='v1.3.1' dt='1483487085'
ref='v1.4' dt='1483730146'
ref='v1.9' dt='1483802985'

3
Esta é a melhor resposta para obter a data da tag.
Joseph K. Strauss

Como alternativa, você pode obter o carimbo de data / hora Unix com git for-each-ref --format="%(taggerdate:unix)" refs/tagsou como substring emgit for-each-ref --format="%(taggerdate:raw)" refs/tags
RD

1
Obrigado! Todas as outras respostas fornecem apenas a data de confirmação e não a data da tag.
Sam

Sim, a melhor resposta, pois mostra apenas as tags reais, nem todos os commits, uma pena que o SO tem outras respostas com classificação superior.
samthebest

2
mesmo resultado com menos digitação:git tag --format "%(refname:short) %(creatordate:short)"
Andrew Spencer

27

Observe que ambas as soluções acima fornecem a data de confirmação, que pode ser totalmente diferente de quando o commit foi marcado para lançamento. Para obter a data da própria tag, você precisa encontrar a própria tag com rev-parse, lê-la e cat-file, em seguida, analisá-la. Um pequeno pipeline:

git rev-parse v1.0.0 | xargs git cat-file -p | egrep '^tagger' | cut -f2 -d '>'


Bom, o único problema é que o resultado não está formatado (1419372909 -0300)
Jose_GD

Depois de obter o id de commit de rev-parse, acredito que você pode fazer: git rev-parse v1.0.0 | xargs git show -s --pretty =% aI
Keith

@Keith Agora você voltou a mostrar a data do autor do commit em vez da data marcada, pelo menos para tags anotadas
Ben

3

Não existe uma opção simples no comando git tag para fazer isso. Eu achei mais conveniente executar

git log --decorate=full

para listar todos os commits incluindo tags, se houver. Para listar apenas os commits que são marcados, use

git log --decorate=full --simplify-by-decoration

Para detalhes, use

git help log

2

pode-se usar gawk(não awk) para converter a data na linha "tagger" em algo legível por humanos:

git rev-parse v4.4-rc1 | xargs git cat-file -p | gawk '/^tagger/ { print strftime(PROCINFO["strftime"], $(NF-1)) }'

se não gostar gawk, datepode ser usado para converter o tempo unix:

git rev-parse v2.76 | xargs git cat-file -p | awk '/^tagger/ { print "@" $(NF-1) }' | xargs date -d

e exemplo ( dnsmasqgit repo):

$ git rev-parse v2.76 | xargs git cat-file -p | awk '/^tagger/ { print "@" $(NF-1) }' | xargs date -d
Wed May 18 16:52:12 CEST 2016

você tenta fazer isso do seu lado ??
Vishal Patel

certamente. funciona, dnsmasqgit repo, por exemplo: $ git rev-parse v2.76 | xargs git cat-file -p | awk '/^tagger/ { print strftime(PROCINFO["strftime"], $(NF-1)) }' Wed May 18 16:52:12 CEST 2016
vladis
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.