请考虑以下版本号列表:
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
按"数字"顺序而不是字母顺序打印它们?或者一种解决方法 - 也许我可以通过管道传输输出以按照我想要的方式对它们进行排序?
serv ~: echo -e "1.1.1n1.3.2n1.1.10n1.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
第三个字段(并且仅第三个字段)上定义排序键
更简单的解决方案:
serv ~: echo -e "1.1.1n1.3.2n1.1.10n1.1.2" | sort -V
1.1.1
1.1.2
1.1.10
1.3.2
此处使用sort
选项的细分:
- -V 按版本排序
您很快(使用 Git 1.9.x/2.0,2014 年第 2 季度)将能够仅使用 git 来获取正确的排序输出:
参见 commit b6de0c6,来自 commit 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