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


128

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


2
您是说要按创建日期的顺序获取所有标签的列表吗?
lithuak 2011年

3
仅供参考(1.) 此问题用于按日期列出ANNOTATED标签。(2.)要按日期列出LIGHTWEIGHT标签,请转到此处(3.)有关Git的轻量级标签与带注释的标签之间的区别的有用提示,请转到此处
Trevor Boyd Smith,

@TrevorBoydSmith:不太正确。区别在于(2)列出了所有带标签的commit的提交日期标签,而此页面提供了按带标签日期排序的解决方案(尽管仅适用于带注释的标签,因为git不会存储带轻量级标签的日期)。
David P

Answers:


174

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

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

12
太棒了 git for-each-ref --format="%(taggerdate): %(refname)" --sort=-taggerdate --count=10 refs/tags正是我所需要的。谢谢!
乔恩·乌尔森巴赫2011年

21
@DrorCohen的一种解决方案,适用于轻量级标签:stackoverflow.com/questions/6900328/…。粘贴此处以方便参考:git log --tags --simplify-by-decoration --pretty =“ format:%ai%d”
Gilead

5
%(contents)如有必要,可以使用添加注释,例如git for-each-ref --sort='*authordate' --format='%(taggerdate:short) | %(tag) | %(contents)' refs/tags
Tim Diggins

7
甚至更清洁:git for-each-ref --sort=taggerdate --format '%(tag)'
Baris Wanschers 2014年

4
--sort=creatordate适用于--sort=taggerdate带注释的标签和未带注释的标签,但似乎仅适用于带注释的标签。使用git version 2.16.3
austinheiman

56

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

看到新的 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-XYZW形式的版本字符串顺序对git标签进行排序? ”中详细介绍的那样,您可以将排序顺序添加到git tag(自2014年6月Git 2.0起)。

该排序顺序包括taggerdate作为字段名称(在中列出git for-each-ref 。这允许(由提到DarVar 以下) 作为一个例子,在回购将列出最后的标签:git tag --sort=taggerdate
git/gitv2.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

35
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 2015年

1
请注意,这是根据提交日期而不是标签创建的日期排序的。Josh Lee(当前)评分最高的答案会在创建标签的日期之前进行排序。
纳撒尼尔·伍尔斯'09


13

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

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

输出:

2015-04-01  storaged-2.0.0
2015-06-11  storaged-2.1.0
2015-08-06  storaged-2.1.1
...

如果您不喜欢默认情况下如何对标签进行排序,则可以使用选项--sort=creatordate(例如)按日期进行排序。有关更多详细信息,请参见VonC答案


这种好方法是否必须按日期对它们进行排序?上升?下降?
Motti Shneor,

11

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

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


5

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

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


3

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

git for-each-ref --format='%(*creatordate:raw)%(creatordate:raw) %(creatordate:short) %(refname) %(*objectname) %(objectname)' refs/tags | sort -n | awk '{ print $3, $5, $4 }'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.