Comment puis-je répertorier toutes les balises de mon référentiel Git par date de création?


128

J'ai besoin d'un moyen de répertorier toutes les balises de mon système par date de création, mais je ne suis pas sûr de pouvoir obtenir ces données via git-log. Des idées?


2
Voulez-vous dire que vous souhaitez obtenir la liste de toutes les balises par ordre de dates de création?
lithuak

3
FYI (1.) Cette question concerne la liste des tags ANNOTÉS par date. (2.) Pour répertorier les balises LIGHTWEIGHT par date, cliquez ici . (3.) Pour un rappel utile sur la différence entre les balises légères et annotées de Git, allez ici .
Trevor Boyd Smith

@TrevorBoydSmith: Ce n'est pas tout à fait correct. La différence est que (2) répertorie toutes les balises par date de validation du commit balisé , alors que cette page donne des solutions qui trient par date balisée (mais uniquement pour les balises annotées, puisque git ne stocke pas la date balisée pour les balises légères).
David P

Réponses:


174

Le tri par date de création des balises fonctionne avec des balises annotées et légères:

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

12
Impressionnant. git for-each-ref --format="%(taggerdate): %(refname)" --sort=-taggerdate --count=10 refs/tagsfait exactement ce dont j'avais besoin. Merci!
Jon Ursenbach

21
Une solution de @DrorCohen qui fonctionne pour les balises légères: stackoverflow.com/questions/6900328/… . Coller ici pour une référence facile: git log --tags --simplify-by-decoration --pretty = "format:% ai% d"
Gilead

5
Peut utiliser %(contents)pour ajouter une annotation si nécessaire, par exemplegit for-each-ref --sort='*authordate' --format='%(taggerdate:short) | %(tag) | %(contents)' refs/tags
Tim Diggins

7
Ou même un peu plus propre:git for-each-ref --sort=taggerdate --format '%(tag)'
Baris Wanschers

4
--sort=creatordatefonctionne à la fois pour les balises annotées et non annotées, mais --sort=taggerdatene semble fonctionner qu'avec les balises annotées. testé avecgit version 2.16.3
austinheiman

56

Git 2.8 (mars 2016) documente une autre option datant de git 1.4.4 (octobre 2006) .
Voir commit e914ef0 (05 janvier 2016) par Eric Wong ( ele828) .
(Fusionné par Junio ​​C Hamano - gitster- en commit 108cb77 , 20 janvier 2016)

Voir le nouveau Documentation/git-for-each-ref.txt

Pour les objets de validation et de balise, les champs spéciaux creatordateet creatorcorrespondront à la date appropriée ou au tuple nom-email-date des champs committerou en taggerfonction du type d'objet.
Ceux-ci sont destinés à travailler sur un mélange de balises annotées et légères .

Donc, l'utilisation creatordatefonctionne avec des balises:

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 

Comme je le détaille dans " Comment trier les balises git par ordre de chaîne de version du formulaire rc-XYZW? ", Vous pouvez ajouter un ordre de tri à git tag(depuis Git 2.0 juin 2014).

Cet ordre de tri inclut comme nom de champ (répertorié dans git for-each-ref) taggerdate . Cela permet git tag --sort=taggerdate(mentionné par DarVar ci-dessous )
À titre d'exemple, dans le git/gitrepo, il listera lesv2.10.0 étiquette dernière:

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'ordre par défaut ne serait pas ( 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

Merci beaucoup. Je me demandais pourquoi certaines dates étaient vides. Je soupçonnais déjà des balises légères. Je suis content de ne pas avoir besoin de recréer les tags grâce à creatordate!
exhuma

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

Aussi belle sortie de (sans champ de date):

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

Pour voir l'historique complet avec les dépendances et les commits linéaires par bandes (uniquement les événements essentiels, comme le balisage et le branchement / fusion):

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

Pour les paresseux: git log --tags --simplify-by-decoration --pretty="format:%ci %d" | grep "tag:"et cela fonctionne mieux pour moi.
Mateusz

1
Notez que cela est ordonné par la date de validation et non par la date de création des balises. La réponse (actuellement) la mieux notée de Josh Lee est classée par date de création du tag.
Nathanial Woolls le

13
git tag --sort=-taggerdate

Selon la page de manuel, «Préfixe - pour trier par ordre décroissant de la valeur».

git tagutilise les mêmes clés de tri que git-for-each-ref, qui est l'endroit où les clés sont documentées.


1
C'est probablement la question la plus correcte. Voici le lien vers la documentation décrivant les champs de tri possibles: git-scm.com/docs/git-for-each-ref
prasanthv

Cette réponse ne prend pas en compte les balises légères car elles ont une "date du tag" vide. D'autres réponses avec "creatordate" sont plus précises.
morhook le

13

Ce one-liner affiche les dates et les étiquettes sans aucun problème.

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

Production:

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

Si vous n'aimez pas la façon dont les balises sont triées par défaut, vous pouvez trier par date avec l'option --sort=creatordate, par exemple. Voir la réponse de VonC pour plus de détails.


Cette méthode sympa est-elle liée pour les trier par date? Ascendant? descendant?
Motti Shneor

11

Pour avoir les balises annotées et les balises légères triées ensemble, en fonction de la date de validation, j'utilise:

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

Cette commande listera chaque balise et l'identifiant de l'objet de validation associé, dans l'ordre chronologique.


Un peu obscurci. ... Dans les balises annotées, 'committerdate' est vide alors que dans les balises légères 'taggerdate' est vide. Donc, comme solution de contournement, '* committerdate' indique à Git de rétrocéder les dates de l'objet de validation d'origine lorsqu'il est léger. ...
ingyhere

Utiliser «creatordate» à la place devrait effectivement faire la même chose.
ingyhere

7

Avec Git version 2.10.0.windows.1

git tag --sort=taggerdate


5

Ce qui suit repose sur le commit, donc peu importe s'il contient des informations de date avec le commit:

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

La réponse ci-dessus par Josh Lee, repose sur une date de balise pour obtenir la commande correcte.


Je ne sais pas quelle est la commande de fin tac- peut la changer en more. Quoi qu'il en soit, votre commande a très bien fonctionné - merci!
David H


3

En me basant sur les méthodes mentionnées précédemment, je voulais également voir la date réelle de la balise sur la liste, donc ma version en cours d'utilisation est:

git for-each-ref --format='%(*creatordate:raw)%(creatordate:raw) %(creatordate:short) %(refname) %(*objectname) %(objectname)' refs/tags | sort -n | awk '{ print $3, $5, $4 }'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.