¿Cómo puedo enumerar todas las etiquetas en mi repositorio de Git para la fecha en que se crearon?

128

Necesito alguna forma de enumerar todas las etiquetas en mi sistema para la fecha en que se crearon, pero no estoy seguro de si puedo obtener esos datos a través de git-log. Ideas?

Jon Ursenbach
fuente
2
¿Quiere decir que desea obtener la lista de todas las etiquetas en orden de fechas de creación?
lithuak
3
FYI (1.) Esta pregunta es para enumerar etiquetas ANOTADAS por fecha. (2.) Para enumerar etiquetas LIGERAS por fecha, vaya aquí . (3.) Para un recordatorio útil sobre cuál es la diferencia entre las etiquetas livianas y anotadas de Git, vaya aquí .
Trevor Boyd Smith
@TrevorBoydSmith: Eso no es del todo correcto. La diferencia es que (2) enumera todas las etiquetas por fecha de confirmación de la confirmación etiquetada , mientras que esta página ofrece soluciones que ordenan por fecha etiquetada (aunque solo para etiquetas anotadas, ya que git no almacena la fecha etiquetada para etiquetas ligeras).
David P

Respuestas:

174

La clasificación por fecha de creación de etiquetas funciona con etiquetas anotadas y ligeras:

git for-each-ref --sort=creatordate --format '%(refname) %(creatordate)' refs/tags
Josh Lee
fuente
12
Increíble. git for-each-ref --format="%(taggerdate): %(refname)" --sort=-taggerdate --count=10 refs/tagsHice exactamente lo que necesitaba. ¡Gracias!
Jon Ursenbach
21
Una solución de @DrorCohen que funciona para etiquetas livianas: stackoverflow.com/questions/6900328/… . Pegar aquí para una referencia fácil: git log --tags --simplify-by-decoration --pretty = "format:% ai% d"
Gilead
55
Se puede usar %(contents)para agregar anotaciones si es necesario, por ejemplogit for-each-ref --sort='*authordate' --format='%(taggerdate:short) | %(tag) | %(contents)' refs/tags
Tim Diggins
77
O incluso un poco más limpio:git for-each-ref --sort=taggerdate --format '%(tag)'
Baris Wanschers
44
--sort=creatordatefunciona para etiquetas anotadas y no anotadas, pero --sort=taggerdatesolo parece funcionar con etiquetas anotadas. probado usandogit version 2.16.3
austinheiman
56

Git 2.8 (marzo de 2016) documenta otra opción que se remonta a git 1.4.4 (octubre de 2006) .
Ver commit e914ef0 (05 de enero de 2016) por Eric Wong ( ele828) .
(Fusionada por Junio ​​C Hamano -gitster - en commit 108cb77 , 20 ene 2016)

Mira lo nuevo Documentation/git-for-each-ref.txt

Para los objetos de confirmación y etiquetado, los campos especiales creatordatey creatorcorresponderán a la fecha o tupla de nombre-correo-fecha apropiada de los campos committero taggersegún el tipo de objeto.
Estos están destinados a trabajar en una combinación de etiquetas anotadas y ligeras .

Entonces usando creatordate obras con etiquetas:

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 

Como detallo en " ¿Cómo ordenar las etiquetas git por orden de cadena de versión del formulario rc-XYZW? ", Puede agregar un orden de clasificación agit tag (desde Git 2.0 de junio de 2014).

Ese orden de clasificación incluye como nombre de campo (enumerado en git for-each-ref) taggerdate . Eso permite git tag --sort=taggerdate(mencionado por DarVar a continuación )
Como ejemplo, en el git/gitrepositorio mostrará la v2.10.0última etiqueta:

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

El orden predeterminado no ( 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
fuente
Muchas gracias. Me preguntaba por qué algunas fechas estaban vacías. Ya sospechaba de etiquetas livianas. ¡Me alegro de no tener que volver a crear las etiquetas gracias a creatordate!
exhuma
35
git log --tags --simplify-by-decoration --pretty="format:%ci %d"

También buena salida de (sin campo de fecha):

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

Para ver el historial completo con dependencias y confirmaciones lineales rayadas (solo eventos esenciales, como etiquetado y ramificación / fusión):

git log --graph --decorate --simplify-by-decoration --oneline --all
gavenkoa
fuente
Para gente perezosa: git log --tags --simplify-by-decoration --pretty="format:%ci %d" | grep "tag:"y funciona mejor para mí.
Mateusz
1
Tenga en cuenta que esto está ordenado por la fecha de confirmación, no la fecha en que se crearon las etiquetas. La respuesta (actualmente) mejor valorada de Josh Lee ordena por la fecha en que se creó la etiqueta.
Nathanial Woolls
13
git tag --sort=-taggerdate

De acuerdo con la página del manual, "Prefijo - para ordenar en orden descendente del valor".

git tagutiliza las mismas claves de clasificación que git-for-each-ref, que es donde se documentan las claves.

Zamicol
fuente
1
Este es probablemente el más correcto basado en la pregunta. Aquí está el enlace a los documentos que describen los posibles campos de clasificación: git-scm.com/docs/git-for-each-ref
prasanthv
Esta respuesta no tiene en cuenta las etiquetas livianas, ya que tienen "taggerdate" vacía. Otras respuestas con "creatordate" son más precisas.
Morhook
13

Este one-liner muestra fechas y etiquetas sin ningún problema.

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

Salida:

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

Si no le gusta cómo se ordenan las etiquetas de forma predeterminada, puede ordenar por fecha con la opción --sort=creatordate, por ejemplo. Vea la respuesta de VonC para más detalles.

elboulangero
fuente
¿Es este buen método obligado a ordenarlos por fecha? ascendente? descendiendo?
Motti Shneor
11

Para tener etiquetas anotadas y etiquetas livianas ordenadas por completo, según la fecha de confirmación, estoy usando:

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

Este comando enumerará todas las etiquetas y el ID del objeto de confirmación asociado, en orden cronológico.

Yann Droneaud
fuente
Ofuscado un poco. ... En las etiquetas anotadas, 'committerdate' está vacío, mientras que en las etiquetas livianas 'taggerdate' está vacío. Entonces, como solución alternativa, '* committerdate' le dice a Git que retroceda las fechas del objeto de confirmación original cuando es liviano. ...
ingyhere
Usar 'creatordate' en su lugar debería hacer efectivamente lo mismo.
ingyhere
7

Con git version 2.10.0.windows.1

git tag --sort=taggerdate

DarVar
fuente
5

Lo siguiente se basa en el compromiso, por lo que no importa si tiene información de fecha con el compromiso:

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

La respuesta anterior de Josh Lee se basa en una fecha de etiqueta para obtener el orden correcto.

Andrew McGlashan
fuente
No estoy seguro de cuál es el comando final tac, podría cambiarlo a more. De todos modos su comando funcionó muy bien, ¡gracias!
David H
3

Sobre la base de los métodos mencionados anteriormente, también quería ver la fecha de etiqueta real en la lista, por lo que mi versión en uso es:

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