8

考虑这个版本号列表:

0.3.0
0.3.1
...
0.3.8
0.3.9
0.3.10
0.3.11

git tag将按以下顺序打印它们:

0.3.0
0.3.1
0.3.10
0.3.11
0.3.2
...

我有什么方法可以git tag按“数字”顺序而不是字母顺序打印它们?或者一种解决方法——也许是一个我可以通过管道输出的程序来按我想要的方式对它们进行排序?

4

3 回答 3

15
serv ~: echo -e "1.1.1\n1.3.2\n1.1.10\n1.1.2" | sort -n -t. -k1,1 -k2,2 -k3,3
1.1.1
1.1.2
1.1.10
1.3.2

sort此处使用的选项的细分:

  • -n- 使用数字字符串顺序排序(因此10排在后面1
  • -t.- 使用句点作为字段分隔符
  • -k1,1在第一个字段(并且只有第一个字段)上定义一个排序键
  • -k2,2在第二个字段(并且只有第二个字段)上定义一个排序键
  • -k3,3在第三个字段(并且只有第三个字段)上定义一个排序键
于 2011-05-22T22:54:03.793 回答
4

您将很快(使用 Git 1.9.x/2.0,2014 年第二季度)能够使用 git 来获得正确的排序输出:

请参阅提交 b6de0c6,来自提交 9ef176b,由Nguyễn Thái Ngọc Duy ( pclouds)撰写:

 --sort=<type>

按特定顺序排序
支持的类型是:

  • " refname" (字典顺序),
  • version:refname”或“ v:refname”(标签名称被视为版本)。

前置“ -”以反转排序顺序。


在你的情况下:

 git tag -l --sort=version:refname 

几个测试用例:

git tag foo1.3 &&
git tag foo1.6 &&
git tag foo1.10

这是你会得到的:

# lexical sort
git tag -l --sort=refname "foo*"
foo1.10
foo1.3
foo1.6

# version sort
git tag -l --sort=version:refname "foo*" >actual &&
foo1.3
foo1.6
foo1.10

# reverse version sort
git tag -l --sort=-version:refname "foo*" >actual &&
foo1.10
foo1.6
foo1.3

# reverse lexical sort
git tag -l --sort=-refname "foo*" >actual &&
foo1.6
foo1.3
foo1.10
于 2014-03-25T12:53:53.813 回答
4

更简单的解决方案:

serv ~: echo -e "1.1.1\n1.3.2\n1.1.10\n1.1.2" | sort -V
1.1.1
1.1.2
1.1.10
1.3.2

sort此处使用的选项的细分:

  • -V 按版本排序
于 2011-05-23T00:11:22.710 回答