Получить время и дату тегов git

88

У меня есть проект, в котором используется git, и все выпуски помечены тегом.

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

Моя цель - перечислить выпуски и даты выпуска в веб-интерфейсе (тег / дата фиксации = дата выпуска). В настоящее время мы перечисляем все выпуски с использованием git tag.

Как я могу узнать время и дату создания тега (или фиксации, на которую он указывает)?

HNygard
источник
2
Здесь хорошо уточнить, что это дата фиксации тега, который вам нужен. Как тег не имеет даты.
jobwat 01

Ответы:

71

Используйте --formatаргумент, чтобы git log:

git log -1 --format=%ai MY_TAG_NAME
пользователь4815162342
источник
3
СОВЕТ - Замените "TAG" названием тега. Например, git log -1 --format=%ai v0.2.3.
Тобиас
5
Если вы хотите ISO8601, сделайте --format=%aI(заглавная «I»)
Хаим Элия
git log -1 --format=%ai MY_TAG_NAME | catотключить просмотр страницы
elinx
Что делает «-1»?
Blademaster
@Blademaster Указывает, что git logнужно показать только одну фиксацию, относящуюся к тегу. Поведение по умолчанию - показать все коммиты от указанного до первого коммита в репозитории.
user4815162342
83

У меня это всегда срабатывало:

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

Если вам нужно другое форматирование даты, обратитесь к разделу "PRETTY FORMATS" на странице git-log man для получения подробной информации о строке формата.

Никос К.
источник
13
Однако следует предупредить, что здесь будет указана дата / время фиксации, но не дата / время для аннотированного тега.
WiSaGaN
5
Просто поместите taglog = log --tags --simplify-by-decoration --pretty='format:%ci %d'(обратите внимание на одинарные, а НЕ двойные кавычки) в разделе [alias] вашего файла .gitconfig, и теперь у вас есть команда git taglog :)
Lambart
40

Еще один вариант:

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

См. Https://git-scm.com/docs/git-for-each-ref#_field_names для параметров формата

%(creatordate) дает дату фиксации, на которую указывает, чтобы увидеть дату создания тега при использовании %(taggerdate)

Вы можете напрямую подключить оболочку:

$> 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
Это лучший ответ для получения даты тега.
Джозеф К. Штраус,
В качестве альтернативы вы можете получить временную метку unix с помощью git for-each-ref --format="%(taggerdate:unix)" refs/tagsили в виде подстроки вgit for-each-ref --format="%(taggerdate:raw)" refs/tags
RD
1
Спасибо! Все остальные ответы просто указывают дату фиксации, а не дату тега.
Сэм
Да, defo лучший ответ, поскольку он показывает только фактические теги, а не все коммиты, позор, дерьмо, поэтому другие ответы оцениваются выше.
samthebest
2
тот же результат с меньшим набором текста:git tag --format "%(refname:short) %(creatordate:short)"
Эндрю Спенсер
27

Обратите внимание, что оба приведенных выше решения дают вам дату фиксации, которая может сильно отличаться от того, когда эта фиксация была помечена для выпуска. Чтобы получить дату самого тега, вам нужно найти сам тег с rev-parse, прочитать его cat-file, а затем проанализировать его. Небольшой конвейер:

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

Роб Ширер
источник
Хорошо, только проблема в том, что результат не отформатирован (1419372909 -0300)
Jose_GD
Если у вас есть идентификатор фиксации из rev-parse, я думаю, вы можете это сделать: git rev-parse v1.0.0 | xargs git show -s --pretty =% aI
Кит
@Keith Теперь вы вернулись к отображению даты создания коммита вместо даты с тегами, по крайней мере, для аннотированных тегов
Бен
3

Для этого в команде git tag нет простой опции. Я нашел наиболее удобным для бега

git log --decorate=full

чтобы перечислить все коммиты, включая теги, если они есть. Для перечисления только помеченных коммитов используйте

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

Для получения подробной информации используйте

git help log
ВойтаК
источник
2

можно использовать gawk(не awk), чтобы преобразовать дату в строке "tagger" в нечто удобочитаемое:

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

если что-то не нравится, gawkто dateможно использовать для преобразования времени unix:

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

и пример ( 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
владис
источник
вы пробуете это со своей стороны ??
Вишал Патель,
конечно. это работает, dnsmasqgit repo, например: $ 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
владис