112

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

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

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

如何获取标签的制作时间和日期(或它指向的提交)?

4

7 回答 7

104

这一直对我有用:

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

如果您想要不同的日期格式,请参阅 git-log 手册页的“漂亮格式”部分以获取格式字符串的详细信息。

于 2012-11-03T11:42:53.077 回答
86

使用--format参数git log

git log -1 --format=%ai MY_TAG_NAME
于 2012-11-03T11:43:40.083 回答
57

另一种选择:

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'
于 2017-02-12T18:39:49.740 回答
28

请注意,上述两种解决方案都会为您提供提交日期,这可能与该提交被标记为发布时大不相同。要获取标签本身的日期,您必须使用 找到标签本身rev-parse,使用 读取它cat-file,然后解析它。一个小管道:

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

于 2014-12-12T14:43:53.027 回答
3

git tag 命令中没有简单的选项来执行此操作。我发现最方便运行

git log --decorate=full

列出所有提交,包括标签(如果有的话)。仅列出标记使用的提交

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

详情请使用

git help log
于 2016-05-09T09:36:58.167 回答
2

可以使用gawk(not 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

和示例(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
于 2015-12-03T12:56:24.197 回答
0

这里的所有答案都很棒,而且是正确的 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
于 2020-12-15T00:37:14.150 回答