`git tag`按提交日期的时间顺序排序

soe*_*ace 38 git sorting

输出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
Run Code Online (Sandbox Code Playgroud)

所需的输出是:

A-first
C-second
B-third
Run Code Online (Sandbox Code Playgroud)

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

B-third
C-second
A-first
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

订单很好,但现在我正在格式化......

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)
Run Code Online (Sandbox Code Playgroud)

rra*_*val 45

刚用git 2.8.0测试:

git tag --sort=committerdate
Run Code Online (Sandbox Code Playgroud)

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

对于提交和标记对象,特殊字段creatordatecreator字段将对应于提交者或标记器字段中的相应日期或名称 - 电子邮件日期元组,具体取决于对象类型.这些用于处理带注释和轻量级标签的混合.

有名字的电子邮件最新的元组作为其值的字段(author,committer,和tagger)可以与后缀name,email以及date提取命名组件.

  • 这是最好的方式,IMO.如果你想获得标签的时间顺序,你需要指定`taggerdate`而不是`commiterdate`. (13认同)
  • 这仅适用于轻量级标签。不幸的是,它不适用于带注释的标签。 (3认同)
  • taggerdate对我不起作用 - git 2.7.4 (2认同)
  • 如果您想按降序排序:_前缀 - 按值的降序排序_(来自答案中的链接)。所以即 `git tag --sort=-committerdate` (2认同)

ops*_*dao 24

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

git tag --sort version:refname
Run Code Online (Sandbox Code Playgroud)

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

  • 这不**列出按日期排序.在我的回购中,标签`testBranch-4`在`master-10`之后被列出,即使testbranch已经老了 (8认同)
  • 实际上对我来说唯一有用的是`git tag --sort = taggerdate`,按照[这个答案](/sf/answers/2788742491/) (3认同)
  • 这在git版本2.10.1中对我不起作用 (2认同)
  • 当然这只适用于因为计时顺序恰好与你的alpha排序相匹配?不是taggerdate想要什么? (2认同)
  • 这**不**按日期列出,而是按注释列出:https://git-scm.com/docs/git-for-each-ref#Documentation/git-for-each-ref.txt-refname (2认同)

soe*_*ace 19

git tag | xargs -I@ git log --format=format:"%ai @%n" -1 @ | sort | awk '{print $4}'
Run Code Online (Sandbox Code Playgroud)

  • 令人印象深刻的,虽然很难记住随意打字.什么会很好:`git tag --sort = date`或类似的东西. (5认同)
  • 如果您可以解释神奇的命令管道的功能,那么您的答案将比原来好10倍,这真棒。 (2认同)

rfr*_*ebe 13

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

git tag --sort=-taggerdate
Run Code Online (Sandbox Code Playgroud)


sea*_*der 7

git log --date-order --tags --simplify-by-decoration --pretty=format:"%ci %d"
Run Code Online (Sandbox Code Playgroud)


mwa*_*ner 7

正如亚历山大指出的那样应该是

git tag --sort=taggerdate
Run Code Online (Sandbox Code Playgroud)

为了正确的时间顺序。

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


den*_*arg 5

其他方式:

git log --no-walk --tags --decorate --oneline
Run Code Online (Sandbox Code Playgroud)

例子

$ 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
Run Code Online (Sandbox Code Playgroud)

参考:


归档时间:

查看次数:

17917 次

最近记录:

6 年,4 月 前