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


How can I list all tags in my Git repository by the date they were created?

我需要某种方式在创建它们的日期之前列出系统中的所有标记,但是不确定是否可以通过git-log获得该数据。想法?


如果是带注释的标签,则可以使用标签日期:

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

但是,如果它是轻量级标签,则没有有关何时创建的信息(它所做的只是命名一个对象)。


Git 2.8(2016年3月)记录了另一个可追溯到git 1.4.4(Oct2006)的选项。
请参见Eric Wong(ele828)的commit e914ef0(2016年1月5日)。
(由Junio C Hamano合并-gitster-在commit 108cb77中,2016年1月20日)

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

For commit and tag objects, the special creatordate and creator
fields will correspond to the appropriate date or name-email-date tuple
from the committer or tagger fields depending on the object type.
These are intended for working on a mix of annotated and lightweight tags.

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

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

要么:

1
git tag --sort=-creatordate

正如我在"如何按rc-X.Y.Z.W形式的版本字符串顺序对git标签进行排序"中所详述的那样,您可以向git tag添加排序顺序(自Git 2.0 2014年6月开始)。

该排序顺序包括作为字段名称(在git for-each-ref中列出)的taggerdate。这允许git tag --sort=taggerdate(以下由DarVar提及)
例如,在git/git存储库中,它将在最后列出v2.10.0标签:

1
2
3
4
5
6
7
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):

1
2
3
4
5
6
7
8
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


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

也很好的输出(没有日期字段):

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

要查看具有依赖项和条带化线性提交的完整历史记录(仅重要事件,如标记和分支/合并):

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


这种单线显示日期和标签,没有大惊小怪。

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

输出:

1
2
3
4
2015-04-01  storaged-2.0.0
2015-06-11  storaged-2.1.0
2015-08-06  storaged-2.1.1
...

如果您不喜欢默认标签的排序方式,则可以使用选项--sort=creatordate按日期排序。有关更多详细信息,请参见VonC答案。


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

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

该命令将按时间顺序列出每个标签和关联的提交对象ID。


1
git tag --sort=-taggerdate

根据手册页,"前缀-以值的降序排序。"

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


使用Git version 2.10.0.windows.1

<5233>


以下内容取决于提交,因此,提交是否包含日期信息并不重要:

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

乔什·李(Josh Lee)的上述答案取决于标签日期,以使订单正确无误。


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

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