Come posso elencare tutti i tag nel mio repository Git entro la data di creazione?


128

Ho bisogno di un modo per elencare tutti i tag nel mio sistema entro la data in cui sono stati creati, ma non sono sicuro di poter ottenere quei dati tramite git-log. Idee?


2
Vuoi dire che vuoi ottenere l'elenco di tutti i tag in ordine di date di creazione lì?
lithuak,

3
Cordiali saluti (1.) Questa domanda è per elencare i tag ANNOTATI per data. (2.) Per elencare i tag LIGHTWEIGHT per data, vai qui . (3.) Per un utile promemoria su quale sia la differenza tra i tag leggeri e annotati di Git, vai qui .
Trevor Boyd Smith,

@TrevorBoydSmith: Non è del tutto corretto. La differenza è che (2) elenca tutti i tag per data di commit del commit con tag , mentre questa pagina offre soluzioni che ordinano per data con tag (anche se solo per tag con annotazioni, dal momento che git non memorizza la data con tag per tag leggeri).
David P

Risposte:


174

L'ordinamento per data di creazione del tag funziona con tag annotati e leggeri:

git for-each-ref --sort=creatordate --format '%(refname) %(creatordate)' refs/tags

12
Eccezionale. git for-each-ref --format="%(taggerdate): %(refname)" --sort=-taggerdate --count=10 refs/tagsfatto esattamente quello di cui avevo bisogno. Grazie!
Jon Ursenbach,

21
Una soluzione di @DrorCohen che funziona con tag leggeri: stackoverflow.com/questions/6900328/… . Incollare qui per un facile riferimento: git log --tags --simplify-by-decoration --pretty = "format:% ai% d"
Gilead

5
Può essere utilizzato %(contents)per aggiungere annotazioni se necessario, ad esgit for-each-ref --sort='*authordate' --format='%(taggerdate:short) | %(tag) | %(contents)' refs/tags
Tim Diggins,

7
O anche un po 'più pulito:git for-each-ref --sort=taggerdate --format '%(tag)'
Baris Wanschers,

4
--sort=creatordatefunziona sia --sort=taggerdatecon tag con annotazioni che con tag non annotati , ma sembra funzionare solo con tag con annotazioni. testato usandogit version 2.16.3
austinheiman il

56

Git 2.8 (marzo 2016) documenta un'altra opzione risalente a git 1.4.4 (ottobre 2006) .
Vedi commit e914ef0 (05 gen 2016) di Eric Wong ( ele828) .
(Unita da Junio ​​C Hamano - gitster- in commit 108cb77 , 20 gen 2016)

Vedi il nuovo Documentation/git-for-each-ref.txt

Per gli oggetti commit e tag, i campi speciali creatordatee creatorcorrisponderanno alla data appropriata o alla tupla nome-e-mail-data dai campi committero in taggerbase al tipo di oggetto.
Sono pensati per lavorare su un mix di tag annotati e leggeri .

Quindi l'utilizzo creatordatefunziona con i tag:

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

O:

git tag --sort=-creatordate 

Come dettagliato in " Come ordinare i tag git in base all'ordine delle stringhe di versione del modulo rc-XYZW? ", È possibile aggiungere un ordinamento a git tag(da Git 2.0 giugno 2014).

Tale ordinamento include come nome campo (elencato in git for-each-ref) taggerdate . Ciò consente git tag --sort=taggerdate(menzionato da DarVar di seguito )
Ad esempio, nel git/gitrepository elencherà il v2.10.0tag per ultimo:

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

L'ordine predefinito non sarebbe ( 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

Molte grazie. Mi chiedevo perché alcune date fossero vuote. Stavo già sospettando etichette leggere. Sono contento di non aver bisogno di ricreare i tag grazie a creatordate!
exhuma,

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

Bello anche l'output da (senza campo data):

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

Per visualizzare la cronologia completa con dipendenze e commit lineari con striping (solo eventi essenziali, come tag e branching / fusione):

git log --graph --decorate --simplify-by-decoration --oneline --all

Per i più pigri: git log --tags --simplify-by-decoration --pretty="format:%ci %d" | grep "tag:"e funziona meglio per me.
Mateusz,

1
Si noti che questo è ordinato in base alla data di commit, non alla data di creazione dei tag. La risposta (attualmente) più votata da Josh Lee si ordina entro la data di creazione del tag.
Nathanial Woolls

13
git tag --sort=-taggerdate

Secondo la pagina man, "Prefisso - per ordinare in ordine decrescente del valore".

git tagusa le stesse chiavi di ordinamento di git-for-each-ref, che è dove sono documentate le chiavi.


1
Questo è probabilmente il più corretto in base alla domanda. Ecco il link ai documenti che delineano i possibili campi di ordinamento: git-scm.com/docs/git-for-each-ref
prasanthv

Questa risposta non tiene conto dei tag leggeri poiché hanno "taggerdate" vuoto. Altre risposte con "creatordate" sono più accurate.
Morhook

13

Questo one-liner mostra date e tag senza problemi.

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

Produzione:

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

Se non ti piace il modo in cui i tag sono ordinati per impostazione predefinita, puoi ordinare per data con l'opzione --sort=creatordate, ad esempio. Vedi la risposta VonC per maggiori dettagli.


Questo bel metodo è destinato a ordinarli per data? ascendente? discendente?
Motti Shneor,

11

Per avere tag annotati e tag leggeri ordinati del tutto, in base alla data di commit, sto usando:

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

Questo comando elencherà ogni tag e l'id dell'oggetto commit associato, in ordine cronologico.


Offuscato un po '. ... Nei tag annotati, "committerdate" è vuoto, mentre nei tag leggeri "taggerdate" è vuoto. Quindi, come una soluzione alternativa '* committerdate' sta dicendo a Git di tornare indietro le date dall'oggetto commit originale quando è leggero. ...
qui

L'uso di "creatordate" invece dovrebbe effettivamente fare la stessa cosa.
inghere

7

Con Git version 2.10.0.windows.1

git tag --sort=taggerdate


5

Quanto segue si basa sul commit, quindi non importa se ha informazioni sulla data con il commit:

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

La risposta sopra di Josh Lee si basa su una data tag per ottenere l'ordine corretto.


Non sono sicuro di quale sia il comando finale tac: potrebbe cambiarlo in more. Comunque il tuo comando ha funzionato benissimo - grazie!
David H


3

Basandomi sui metodi menzionati in precedenza, volevo vedere anche la data effettiva del tag nell'elenco, quindi la mia versione in uso è:

git for-each-ref --format='%(*creatordate:raw)%(creatordate:raw) %(creatordate:short) %(refname) %(*objectname) %(objectname)' refs/tags | sort -n | awk '{ print $3, $5, $4 }'
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.