65

的输出git tag按字母顺序排列。我希望它按时间顺序排列(它们被分配到的提交的日期,而不是它们的创建日期),否则输出应该保持不变。

我已经尝试了http://networkadmin20.blogspot.de/2010/08/howto-list-git-tags-by-date.html的建议,但顺序仍然相同。

为了确保我的存储库没有错误,我使用干净的存储库尝试了以下操作:

soeren@ubuntu ~/Projects/sandbox % mkdir chronogit
soeren@ubuntu ~/Projects/sandbox % cd chronogit 
soeren@ubuntu ~/Projects/sandbox/chronogit % git init
Initialized empty Git repository in /home/soeren/Projects/sandbox/chronogit/.git/
soeren@ubuntu ~/Projects/sandbox/chronogit (git)-[master] % touch a
soeren@ubuntu ~/Projects/sandbox/chronogit (git)-[master] % git add a
soeren@ubuntu ~/Projects/sandbox/chronogit (git)-[master] % git commit -m 'a'
[master (root-commit) f88e0e9] a
 0 files changed
 create mode 100644 a
soeren@ubuntu ~/Projects/sandbox/chronogit (git)-[master] % git tag 'A-first'
soeren@ubuntu ~/Projects/sandbox/chronogit (git)-[master] % git mv a b
soeren@ubuntu ~/Projects/sandbox/chronogit (git)-[master] % git commit -m 'c'
[master ecc0c08] c
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename a => b (100%)
soeren@ubuntu ~/Projects/sandbox/chronogit (git)-[master] % git tag 'C-second'
soeren@ubuntu ~/Projects/sandbox/chronogit (git)-[master] % git mv b c
soeren@ubuntu ~/Projects/sandbox/chronogit (git)-[master] % git commit -m 'b'
[master e72682d] b
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename b => c (100%)
soeren@ubuntu ~/Projects/sandbox/chronogit (git)-[master] % git tag 'B-third'
soeren@ubuntu ~/Projects/sandbox/chronogit (git)-[master] % git tag
A-first
B-third
C-second
soeren@ubuntu ~/Projects/sandbox/chronogit (git)-[master] % git for-each-ref refs/tags --sort=taggerdate --format="%(refname:short)"
A-first
B-third
C-second

所需的输出是:

A-first
C-second
B-third

或者,因为反转它不应该太难:

B-third
C-second
A-first

编辑:正如评论中指出的,这个问题非常相似,所以我尝试了以下方法:

soeren@ubuntu ~/Projects/sandbox/chronogit (git)-[master] % git log --tags --simplify-by-decoration --pretty="format:%ai %d"          
2013-09-06 16:08:43 +0200  (HEAD, B-third, master)
2013-09-06 16:08:21 +0200  (C-second)
2013-09-06 16:07:42 +0200  (A-first)

顺序很好,但现在我正在与格式作斗争......</p>

soeren@ubuntu ~/Projects/sandbox/chronogit (git)-[master] % git log --tags --simplify-by-decoration --pretty="format:%(refname:short)"
%(refname:short)
%(refname:short)
%(refname:short)
soeren@ubuntu ~/Projects/sandbox/chronogit (git)-[master] % git log --tags --simplify-by-decoration --format="%(refname:short)" 
%(refname:short)
%(refname:short)
%(refname:short)
4

9 回答 9

67

刚刚用 git 2.8.0 测试过:

git tag --sort=committerdate

有关您可以使用的字段名称的完整列表,请参阅https://git-scm.com/docs/git-for-each-ref#_field_names

对于 commit 和 tag 对象,特殊的creatordatecreator字段将对应于来自 committer 或 tagger 字段的适当日期或 name-email-date 元组,具体取决于对象类型。这些用于处理带注释和轻量级标签的混合。

将 name-email-date 元组作为其值( 、 和 )的字段author可以committer使用、和tagger后缀来提取命名组件。nameemaildate

于 2016-04-15T00:54:09.380 回答
30

在 git 2.3.3 中,我可以这样做让它们按日期排序:

git tag --sort version:refname

PS:为了记录,我也在重复的问题上回答了同样的事情

于 2015-04-13T08:44:25.410 回答
20
git tag | xargs -I@ git log --format=format:"%ai @%n" -1 @ | sort | awk '{print $4}'
于 2013-09-09T06:42:26.850 回答
14

有关信息,要以相反的顺序获取,请在其前面加上“-”

git tag --sort=-taggerdate
于 2019-09-20T09:16:14.280 回答
8
git log --date-order --tags --simplify-by-decoration --pretty=format:"%ci %d"
于 2015-05-01T14:01:37.513 回答
7

正如亚历山大指出的那样

git tag --sort=taggerdate

正确的时间顺序。

编辑:* 如果您对推送标签的日期感兴趣,如果您对提交的日期感兴趣,则应为“commiterdate”

于 2019-09-12T06:51:28.257 回答
3

尝试这个:

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

它对我来说非常完美而且非常快。

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

于 2016-12-20T10:21:46.653 回答
1

另一种方式:

git log --no-walk --tags --decorate --oneline

示例

$ git log --no-walk --tags --decorate --oneline | head -n5
e214a28f (tag: v4.20.0, origin/4-stable) Release 4.20.0
519512ae (tag: v4.19.0) Release 4.19.0
a201a5ca (tag: v4.18.0) Release 4.18.0
c5037e4a (tag: v4.17.0) Release 4.17.0
9f19351d (tag: v4.16.0) Release 4.16.0

参考:

于 2020-12-30T19:14:17.550 回答
1

我想使用taggerdate,但它并不总是有值:

git tag --sort=-taggerdate --format "%(refname:short)   %(taggerdate:short)" | head -5
v41     2018-11-05
v40     2018-11-05
v1      
v10     
v100    

要支持taggerdate未设置的场景,请回退creatordate并使用sort专门对生成的字段进行排序:

$ git tag --format '%(refname:short)    %(if)%(taggerdate)%(then)%(taggerdate:short)%(else)%(creatordate:short)%(end)' | sort -k2,2 -t$'\t' | head -5
v1  2018-05-15
v2  2018-05-15
v3  2018-05-15
v4  2018-05-24
v5  2018-06-12

这是别名:

[alias]
    tags = ! git tag --format '%(refname:short)\t%(if)%(taggerdate)%(then)%(taggerdate:short)%(else)%(creatordate:short)%(end)' | sort -k2,2 -t$'\t'

感谢@thomas-sibley 在这个线程中的解决方案。

于 2021-10-04T20:07:39.087 回答