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


88

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

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

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

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


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


Ответы:


71

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

git log -1 --format=%ai MY_TAG_NAME

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
владис
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.