我有一个使用 git 的项目,并用标签标记了所有版本。
$ git tag
v1.0.0
v1.0.1
v1.0.2
v1.0.3
v1.1.0
我的目标是在 Web 界面中列出版本和发布日期(标记/提交日期 = 发布日期)。目前,我们使用 列出所有版本git tag
。
如何获取标签的制作时间和日期(或它指向的提交)?
这一直对我有用:
git log --tags --simplify-by-decoration --pretty="format:%ci %d"
如果您想要不同的日期格式,请参阅 git-log 手册页的“漂亮格式”部分以获取格式字符串的详细信息。
使用--format
参数git log
:
git log -1 --format=%ai MY_TAG_NAME
另一种选择:
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'
请注意,上述两种解决方案都会为您提供提交日期,这可能与该提交被标记为发布时大不相同。要获取标签本身的日期,您必须使用 找到标签本身rev-parse
,使用 读取它cat-file
,然后解析它。一个小管道:
git rev-parse v1.0.0 | xargs git cat-file -p | egrep '^tagger' | cut -f2 -d '>'
git tag 命令中没有简单的选项来执行此操作。我发现最方便运行
git log --decorate=full
列出所有提交,包括标签(如果有的话)。仅列出标记使用的提交
git log --decorate=full --simplify-by-decoration
详情请使用
git help log
可以使用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
和示例(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
这里的所有答案都很棒,而且是正确的 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