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

我需要一些方法来列出我的系统中所有标签的日期,他们被创建,但不确定我是否可以通过 git-log 获得这些数据。有什么想法吗?

82038 次浏览

按照标记创建日期排序适用于带注释的轻量级标记:

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

要根据提交日期对带注释的标记和轻量级标记进行排序,我使用:

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

这个命令将按照时间顺序列出每个标记和相关的提交对象 id。

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 2.8(2016年3月)记录了另一个选项 可以追溯到 git 1.4.4(2006年10月)
提交 e-914ef0(2016年1月5日) by 黄志光(ele828)
(由 朱尼奥 · C · 哈马诺 gitster于2016年1月20日在 提交108cb77合并)

看看新的 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 标记进行排序?”中详述的那样,您可以向 git tag添加排序顺序(从 Git 2.0 June 2014开始)。

这种排序顺序包括 字段名(在 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

用 Git version 2.10.0.windows.1

git tag --sort=taggerdate

git tag --sort=-taggerdate

根据手册页,“ Prefix-按值的降序排序。”

git tag 使用与 git-for-each-ref相同的排序键,git-for-each-ref记录了这些键。

这个一行程序显示日期和标签:

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

有关详细信息,请参阅 回答

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

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

以下内容依赖于提交,所以它是否包含提交的日期信息并不重要:

git log --tags --decorate --simplify-by-decoration|grep ^commit|grep tag|sed -e 's/^.*: //' -e 's/)$//' -e 's/,.*$//'|tac

上面 Josh Lee 给出的答案依赖于标签日期来获得正确的顺序。

注意: 我的 git --versiongit version 2.25.1

对于所有标记的列表 -l,每个标记(-n99)的消息字段中最多有99行,按照时间顺序和最新的标记 最后,执行以下操作:

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*'