如何按创建日期列出Git存储库中的所有标签?

213

我需要一种方法按创建日期列出系统中的所有标签,但不确定是否可以通过git-log获取该数据。有什么想法吗?


2
你的意思是要按照创建日期顺序获取所有标签的列表吗? - lithuak
5
FYI (1.) 这个问题 是为了按日期列出已注释的标签。**(2.)** 如果要按日期列出轻量级标签,请转到此处。**(3.)** 如果想了解Git轻量级标签与注释标签之间的区别,请转到此处 - Trevor Boyd Smith
@TrevorBoydSmith:那不是完全正确的。区别在于(2)按_tagged commit_的_commit date_列出所有标签,而这个页面提供了按_日期标记_排序的解决方案(只适用于注释标签,因为Git不会存储轻量级标签的日期标记)。 - David P
10个回答

271

按标签创建日期排序适用于带注释和轻量级标签:

git for-each-ref --sort=creatordate --format '%(refname) %(creatordate)' refs/tags

13
太棒了。git for-each-ref --format="%(taggerdate): %(refname)" --sort=-taggerdate --count=10 refs/tags 正好满足我的需求。谢谢! - Jon Ursenbach
23
以下是@DrorCohen提供的适用于轻量级标签的解决方案的翻译:https://dev59.com/7Ww05IYBdhLWcg3w_WxN。为了方便参考,将其粘贴在此处:git log --tags --simplify-by-decoration --pretty="format:%ai %d" - Gilead
6
如果需要,可以使用%(contents)添加注释,例如:git for-each-ref --sort='*authordate' --format='%(taggerdate:short) | %(tag) | %(contents)' refs/tags。请注意,此处仅返回翻译后的文本内容,不进行任何解释。 - Tim Diggins
9
甚至可以更简介一些:git for-each-ref --sort=taggerdate --format '%(tag)',该命令用于按照标签的创建时间排序并显示标签名。 - Baris Wanschers
5
--sort=creatordate 适用于带注释和不带注释的标签,但是 --sort=taggerdate 只能与带注释的标签一起使用。测试使用的版本是 git version 2.16.3 - austinheiman
显示剩余10条评论

96

Git 2.8 (2016年3月)文档中又添加了一个选项追溯到git 1.4.4(2006年10月)
请参见提交e914ef0(2016年1月5日)由Eric Wong (ele828)提交。
(由Junio C Hamano -- gitster --提交108cb77中合并,2016年1月20日)

查看新的Documentation/git-for-each-ref.txt

对于提交和标签对象,特殊字段creatordatecreator将对应于适当的日期或名称-电子邮件-日期元组,具体取决于对象类型中的committertagger字段。
这些旨在处理注释和轻量级标签的混合使用。

因此,使用creatordate可以与标签一起使用:

git for-each-ref --format='%(*creatordate:raw)%(creatordate:raw) %(refname) %(*objectname) %(objectname)' refs/tags | \
sort -n | awk '{ print $4, $3; }' 

或者:

git tag --sort=-creatordate 

如我在 "如何按照 rc-X.Y.Z.W 形式的版本字符串顺序对 git 标签进行排序?" 中详细说明的那样,自 2014 年 6 月 Git 2.0 版本以来,你可以给 git tag 添加一个排序方式。

该排序方式包括了 字段名称(在 git for-each-ref 中列出) taggerdate。这允许使用 git tag --sort=taggerdate(由 DarVar 在下面 提到)进行排序。
例如,在 git/git 存储库 中,它将最后列出 v2.10.0 标签:

v2.9.1
v2.9.2
v2.9.3
v2.10.0-rc0
v2.10.0-rc1
v2.10.0-rc2
v2.10.0

默认顺序不会(git tag):

v2.1.2
v2.1.3
v2.1.4
v2.10.0
v2.10.0-rc0
v2.10.0-rc1
v2.10.0-rc2
v2.2.0

非常感谢。我一直在想为什么有些日期是空的。我已经怀疑是轻量级标签的问题了。我很高兴不需要重新创建标签,多亏了creatordate - exhuma

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

同时,没有日期字段的情况下,也可以得到很好的输出:

git log --tags --decorate --simplify-by-decoration --oneline

要查看具有依赖关系和带有条纹的线性提交的完整历史记录(仅包括关键事件,如标记和分支/合并),请执行以下操作:

git log --graph --decorate --simplify-by-decoration --oneline --all

懒人专用:git log --tags --simplify-by-decoration --pretty="format:%ci %d" | grep "tag:",这对我来说是最好的。 - Mateusz
4
请注意,这是按提交日期排序的,而不是标签创建日期。目前最受欢迎的答案来自Josh Lee,它按标签创建日期排序。 - Nathanial Woolls

33

这个一行代码可以显示日期和标签:

git tag --format='%(creatordate:short)%09%(refname:strip=2)'

输出:

2015-09-27      v0.1.0
2019-10-22      v0.10.0
2020-07-08      v0.12.0
2015-11-18      v0.2.0
2020-12-08      v1.0.0

默认情况下,标签按字典顺序排序。如果您希望按日期排序:

git tag --format='%(creatordate:short)%09%(refname:strip=2)' --sort=creatordate

输出:

2015-09-27      v0.1.0
2015-11-18      v0.2.0
2019-10-22      v0.10.0
2020-07-08      v0.12.0
2020-12-08      v1.0.0

请查看VonC的回答以获取更多细节。


这个好的方法是否绑定按日期排序?升序?降序? - Motti Shneor

21
git tag --sort=-taggerdate

根据手册中的描述,“前缀-表示按值降序排序。” git tag 使用与 git-for-each-ref 相同的排序键,这些键在文档中有记录。

1
这可能是基于问题最正确的答案。以下是概述可能排序字段的文档链接:https://git-scm.com/docs/git-for-each-ref - prasanthv
此响应未考虑轻量级标签,因为它们具有空的“taggerdate”。其他带有“creatordate”的响应更准确。 - morhook
1
git --no-pager tag --sort=-creatordate 看起来更符合我的需求。 - Alex Nolasco

12

为了将注释标签和轻量级标签一起按照提交日期排序,我正在使用:

git for-each-ref --format='%(*committerdate:raw)%(committerdate:raw) %(refname) %(*objectname) %(objectname)' refs/tags | \
  sort -n | awk '{ print $4, $3; }' 

这个命令会按照时间顺序列出每个标签及其关联的提交对象 ID。


有点混淆了。在注释标签中,“committerdate”为空,而在轻量级标签中,“taggerdate”为空。因此,作为解决方法,“*committerdate”告诉Git在轻量级标签时从原始提交对象回溯日期。... - ingyhere
使用“creatordate”应该可以有效地实现相同的功能。 - ingyhere

8

使用Git 2.10.0.windows.1版本

git tag --sort=taggerdate


7
以下内容依赖于提交,因此提交中包含日期信息并不重要:
git log --tags --decorate --simplify-by-decoration|grep ^commit|grep tag|sed -e 's/^.*: //' -e 's/)$//' -e 's/,.*$//'|tac

上面Josh Lee的回答依赖于一个标签日期来正确排序。

不确定末尾命令“tac”是什么 - 可能会改为“more”。无论如何,你的命令很好用 - 谢谢! - David H
https://unix.stackexchange.com/questions/114041/how-can-i-get-the-tac-command-on-os-x - Andrew McGlashan
只要每个提交中最多只存在一个标签,它就能很好地工作。 - mwallner

6

注:我的git --versiongit version 2.25.1

要获取所有标签(-l),每个标签的消息字段最多显示99行(-n99),按照时间顺序以最新的标签在最后的方式执行以下操作:

git tag -l -n99 --sort=taggerdate

(我更喜欢的形式)将标签按时间倒序排列,并将最新的标签放在前面,在taggerdate前面添加减号(-),如下所示:
git tag -l -n99 --sort=-taggerdate

进一步说:

要在标签内进行搜索,并且仅显示名称中包含字符串my string的标签,请在末尾添加'*my string*'。请注意,星号 (*) 是搜索模式中的通配符:

git tag -l -n99 --sort=-taggerdate '*my string*'

为了仅展示标签名称,而不是它们标签消息的最多99行,请简单移除-n99部分:
git tag -l --sort=-taggerdate '*my string*'

相关内容

  1. 我在如何显示git log中的所有标签方面的回答。

3

在之前提到的方法的基础上,我还想在列表中看到实际的标签日期,因此我使用的版本是:

git for-each-ref --format='%(*creatordate:raw)%(creatordate:raw) %(creatordate:short) %(refname) %(*objectname) %(objectname)' refs/tags | sort -n | awk '{ print $3, $5, $4 }'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接