J'ai un projet qui utilise git et j'ai marqué toutes les versions avec une balise.
$ git tag
v1.0.0
v1.0.1
v1.0.2
v1.0.3
v1.1.0
Mon objectif est de lister les versions et les dates de sortie dans une interface web (tag/commit date = date de sortie). Actuellement, nous répertorions toutes les versions en utilisant git tag
.
Comment puis-je obtenir l'heure et la date de création de la balise (ou la validation vers laquelle elle pointe)?
Utilisez le --format
argument à git log
:
git log -1 --format=%ai MY_TAG_NAME
Cela a toujours fonctionné pour moi:
git log --tags --simplify-by-decoration --pretty="format:%ci %d"
Consultez la section "PRETTY FORMATS" de la page de manuel git-log pour plus de détails sur la chaîne de format si vous souhaitez un formatage de date différent.
Notez que les deux solutions ci-dessus vous obtiennent la date de validation, qui peut être très différente de celle lorsque ce commit a été balisé pour publication. Pour obtenir la date de la balise elle-même, vous devez trouver la balise elle-même avec rev-parse
, lisez-le avec cat-file
, puis l'analyser. Un petit pipeline:
git rev-parse v1.0.0 | xargs git cat-file -p | egrep '^tagger' | cut -f2 -d '>'
Encore une option:
git for-each-ref --format="%(refname:short) | %(creatordate)" refs/tags/*
Voir https://git-scm.com/docs/git-for-each-ref#_field_names pour les options de format
%(creatordate)
donne la date du commit pointé, pour voir la date de création de la balise lors de l'utilisation %(taggerdate)
Vous pouvez intégrer directement le Shell:
$> 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'
Il n'y a pas d'option simple dans la commande git tag pour ce faire. J'ai trouvé le plus pratique à exécuter
git log --decorate=full
pour répertorier toutes les validations, y compris les balises, s'il y en a. Pour répertorier uniquement les validations marquées, utilisez
git log --decorate=full --simplify-by-decoration
Pour plus de détails, utilisez
git help log
on peut utiliser gawk
(pas awk
) pour convertir la date dans la ligne "tagger" en quelque chose de lisible par l'homme:
git rev-parse v4.4-rc1 | xargs git cat-file -p | gawk '/^tagger/ { print strftime(PROCINFO["strftime"], $(NF-1)) }'
si on n'aime pas gawk
alors date
peut être utilisé pour convertir le temps unix:
git rev-parse v2.76 | xargs git cat-file -p | awk '/^tagger/ { print "@" $(NF-1) }' | xargs date -d
et exemple (dnsmasq
git 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