获取 git 标记的时间和日期

我有一个使用 git 的项目,并用标签标记了所有的发布。

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

我的目标是在 Web 界面中列出发布和发布日期(标记/提交日期 = 发布日期)。目前,我们使用 git tag列出所有版本。

我怎样才能得到标签生成的时间和日期(或者它指向的提交时间) ?

65386 次浏览

这招对我一直很管用:

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

如果需要不同的日期格式,请参考 git-log 手册中的“ PRETTY FORMATS”部分,了解格式字符串的详细信息。

git log使用 --format参数:

git log -1 --format=%ai MY_TAG_NAME

请注意,上述两种解决方案都为您提供了提交日期,这与标记为发布的提交日期有很大的不同。要获取标记本身的日期,您必须使用 rev-parse查找标记本身,使用 cat-file读取它,然后解析它。一条小管道:

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

可以使用 gawk(而不是 awk)将“标签”行中的日期转换为人类可读的内容:

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

例子(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

There is no simple option in git tag command to do this. I found most convenient to run

git log --decorate=full

to list all commits including tags if there are some. For listing only commits that are tagged use

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

For details use

git help log

还有一个选择:

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

有关格式选项,请参见 https://git-scm.com/docs/git-for-each-ref#_field_names

%(creatordate) gives the date of the commit pointed to, to see the date the tag was created on use %(taggerdate)

您可以直接合并 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'

这里的所有答案都很棒,而且是正确的 git 风格。但我需要一个标签,它的日期和消息,只有最后10个标签。所以我只是用一种非常普通的方式。但是将它保存为 shell 函数或脚本,它就变成了一行程序。

for ver in `git tag | tail -10`; do
DATE=`git log -1 --format=%ai $ver | awk '{print $1}'`
MESSAGE=`git tag -n $ver | cat | awk '{a=match($0, $2); print substr($0,a)}'`
echo "$ver \t| $DATE | $MESSAGE"
done