Ottieni l'ora e la data dei tag git


93

Ho un progetto che utilizza git e ho contrassegnato tutte le versioni con un tag.

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

Il mio obiettivo è elencare le versioni e le date di rilascio in un'interfaccia web (tag / data di commit = data di rilascio). Attualmente elenchiamo tutte le versioni utilizzando git tag.

Come posso ottenere l'ora e la data in cui è stato creato il tag (o il commit a cui punta)?


2
È bene precisare qui che è la data di commit del tag che stai cercando. Poiché un tag non ha data.
jobwat


Risposte:


70

Usa l' --formatargomento per git log:

git log -1 --format=%ai MY_TAG_NAME

3
SUGGERIMENTO - Sostituisci "TAG" con il nome del tag. Ad esempio git log -1 --format=%ai v0.2.3,.
Tobias

5
Se vuoi ISO8601, fallo --format=%aI("I" maiuscola)
Chaim Eliyah

git log -1 --format=%ai MY_TAG_NAME | catdisabilita la visualizzazione della pagina
elinx

Cosa sta facendo "-1"?
Spadaccino

@Blademaster Indica git logdi mostrare un solo commit, quello relativo al tag. Il comportamento predefinito è mostrare tutti i commit da quello specificato al primo commit nel reposotory.
user4815162342

85

Questo ha sempre funzionato per me:

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

Consultare la sezione "PRETTY FORMATS" della manpage git-log per i dettagli della stringa di formato se si desidera una diversa formattazione della data.


13
Per essere avvertito, tuttavia, questo elencherà la data / ora per il commit, ma non la data / ora per il tag annotato.
WiSaGaN

5
Basta mettere taglog = log --tags --simplify-by-decoration --pretty='format:%ci %d'(notare le, non doppi apici mono) nella sezione [alias] del file .gitconfig, e ora hai un comando taglog git :)
Lambart

45

Un'altra opzione:

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

Vedi https://git-scm.com/docs/git-for-each-ref#_field_names per le opzioni di formato

%(creatordate) fornisce la data del commit puntato, per vedere la data in cui il tag è stato creato in uso %(taggerdate)

Puoi incorporare la shell direttamente:

$> 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
Questa è la migliore risposta per ottenere la data del tag.
Joseph K. Strauss,

In alternativa, puoi ottenere il timestamp unix con git for-each-ref --format="%(taggerdate:unix)" refs/tagso come sottostringa ingit for-each-ref --format="%(taggerdate:raw)" refs/tags
RD

1
Grazie! Tutte le altre risposte danno solo la data di commit e non la data del tag.
Sam

Sì, sicuramente la migliore risposta in quanto mostra solo i tag effettivi, non tutti i commit, vergognoso SO ha altre risposte classificate più alte.
samthebest

2
stesso risultato con meno battitura:git tag --format "%(refname:short) %(creatordate:short)"
Andrew Spencer

27

Nota che entrambe le soluzioni di cui sopra ti danno la data di commit, che può essere molto diversa da quando quel commit è stato taggato per il rilascio. Per ottenere la data del tag stesso, devi trovare il tag stesso con rev-parse, leggerlo con cat-filee quindi analizzarlo. Una piccola pipeline:

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


Bene, l'unico problema è che il risultato non è formattato (1419372909-0300)
Jose_GD

Una volta ottenuto l'id commit da rev-parse, credo che tu possa fare: git rev-parse v1.0.0 | xargs git show -s --pretty =% aI
Keith

@Keith Ora sei tornato a mostrare la data dell'autore del commit invece della data contrassegnata, almeno per i tag annotati
Ben

3

Non esiste una semplice opzione nel comando git tag per farlo. Ho trovato più conveniente correre

git log --decorate=full

per elencare tutti i commit inclusi i tag se ce ne sono alcuni. Per elencare solo i commit contrassegnati da utilizzare

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

Per i dettagli utilizzare

git help log

2

si può usare gawk(not awk) per convertire la data nella riga "tagger" in qualcosa di leggibile dall'uomo:

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

se uno non lo fa, come gawkallora datepuò essere utilizzato per convertire il tempo unix:

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

ed esempio ( 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

lo provi dal tuo fianco ??
Vishal Patel

certamente. funziona, dnsmasqgit repo, ad esempio: $ 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

0

Tutte le risposte qui sono ottime e nel corretto stile git. Ma avevo bisogno di un tag, della sua data e del suo messaggio e solo degli ultimi 10 tag. Quindi l'ho fatto in un modo molto pedonale. Ma salvalo come una funzione di shell o uno script e diventa un one-liner.

for ver in `git tag | tail -10`; do
    DATE=`git log -1 --format=%ai $ver | awk '{print $1}'`
    MESSAGE=`git tag -n $ver | cat | awk '{a=match($0, $2); print substr($0,a)}'`
    echo "$ver \t| $DATE | $MESSAGE"
done
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.