如何通过版本string的formssorting的git标签forms为rc-XYZW?
当我input命令时:
git tag -l
我得到这样的结果:
rc-0.9.0.0 rc-0.9.0.1 rc-0.9.0.10 rc-0.9.0.11 rc-0.9.0.12 rc-0.9.0.2 rc-0.9.0.3 rc-0.9.0.4 rc-0.9.0.5 rc-0.9.0.6 rc-0.9.0.7 rc-0.9.0.8 rc-0.9.0.9
而不是我想要的:
rc-0.9.0.0 rc-0.9.0.1 rc-0.9.0.2 rc-0.9.0.3 rc-0.9.0.4 rc-0.9.0.5 rc-0.9.0.6 rc-0.9.0.7 rc-0.9.0.8 rc-0.9.0.9 rc-0.9.0.10 rc-0.9.0.11 rc-0.9.0.12
如何sorting当前列表来获得这样的结果?
使用版本sorting
git tag -l | sort -V
或者git版本> = 2.0
git tag -l --sort=v:refname git tag -l --sort=-v:refname # reverse
使用Git 2.0(2014年6月),您将能够指定sorting顺序!
参见NguyễnTháiNgọcDuy( pclouds
)撰写的commit 9ef176b中的 commit b6de0c6 :
--sort=<type>
按特定顺序sorting 。
支持的types是:
- “
refname
”(词典顺序),- “
version:refname
”或“v:refname
”(标签名称被视为版本)。用“
-
”来sortingsorting。
所以,如果你有:
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*" foo1.3 foo1.6 foo1.10 # reverse version sort git tag -l --sort=-version:refname "foo*" foo1.10 foo1.6 foo1.3 # reverse lexical sort git tag -l --sort=-refname "foo*" foo1.6 foo1.3 foo1.10
自从提交b150794 (由Jacob Keller,git 2.1.0,2014年8月)以来,您可以指定默认顺序:
tag.sort
这个variables控制
git-tag
显示标签时的sorting顺序。
如果没有提供“--sort=<value>
”选项,这个variables的值将被用作默认值。
最牛的 评论 :
版本sorting顺序现在可以(Git 2.1+)configuration为默认值:
git config --global tag.sort version:refname
使用Git 2.4(Q2 2015) , 可以使用versionsort.prerelease
configurationvariables来指定v1.0-pre1
在v1.0
之前 。
见Junio C gitster
( gitster
)的 提交f57610a 。
注意(见下文) versionsort.prereleaseSuffix
现在是(2017)一个不推荐使用的别名。
git 2.7.1(2016年2月)将改善git tag
本身的输出。
请参阅提交0571979 (2016年1月26日),并提交 Jeff King( peff
) 提供的1d094db (2016年1月24日) 。
(合并由Junio C gitster
– gitster
-在提交8bad3de ,2016年2月1日)
tag
:不要将不明确的标签名称显示为“tags/foo
”由于b7cc53e (
tag.c
:使用'ref-filter
tag.c
,2015-07-11),git tag
已经开始显示带有不明确名称的标签(即,当“heads/foo
”和“tags/foo
”同时存在) “tags/foo
”而不是“foo
”。
这是两个:
- 无意义; “
git tag
”的输出只包含refs/tags
,所以我们知道“foo
”是指“refs/tags
”中的那个。- 暧昧 在原始输出中,我们知道行“
foo
”意味着“refs/tags/foo
”存在。 在新的输出中,我们不清楚“refs/tags/foo
”还是“refs/tags/tags/foo
”。发生这种情况的原因是提交b7cc53e切换
git tag
使用ref-filter的“%(refname:short)
”输出格式,这是从for-each-ref
改编的。 这个更通用的代码并不知道我们只关心标签,并使用shorten_unambiguous_ref
来获取short-name
。
我们需要告诉它,我们只关心“refs/tags/
”,它应该缩短这个价值。让我们添加一个新的修饰符到格式化语言“
strip
”,以删除一组特定的前缀组件。
这修正了“git tag
”,并允许用户从自己的自定义格式(“tag
”或“for-each-ref
”)调用相同的行为,同时在所有地方留下“:short
”具有相同的一致含义。如果添加
strip=<N>
,则从refname的前面(例如,%(refname:strip=2)
将<N>
斜杠分隔的path组件转换为foo
将refs/tags/foo
foo
。
<N>
必须是一个正整数。
如果显示的ref比<N>
具有更less的组件,则该命令将中止并出错。
对于git tag
,当未指定时,默认为%(refname:strip=2)
。
更新Git 2.12(2017年第1季度)
请参阅SZEDERGábor ( szeder) 提交c026557 , 提交b178464 , 提交51acfa9 , 提交b823166 , 提交109064a , 提交0c1b487 , 提交9ffda48 , 提交eba286e (2016年12月8日) 。
(由Junio C gitster
合并- gitster
– in commit 1ac244d ,2017年1月23日)
versionsort.prereleaseSuffix
是versionort.suffix的不推荐使用的别名。
在“
git tag -l
”中使用的版本比较的prereleaseSuffix
function在相同版本的两个或多个预发行版本不存在的情况下不正确(例如,2.0-beta1
和2.0-beta2
存在且代码需要比较2.0-beta1
和2.0-beta2
)。
根据这个答案 ,在不支持像Windows和OSX那样sort -V
平台上,你可以使用
git tag -l | sort -n -t. -k1,1 -k2,2 -k3,3 -k4,4
调整这个perl脚本 ,将看起来像client_release/7.2/7.2.25
标签client_release/7.2/7.2.25
到特定的标签scheme。
我写了一个简单的shell脚本来简化这个任务。
#!/usr/bin/env bash TAGS=$(git tag) CODE=$? if [ $CODE = 0 ]; then echo "$TAGS" | sort -V fi exit $CODE
我将其保存为$PATH
git-tags
,并在需要列出标签时运行git tags
标签。
要使用sort -V
方法进行反向sorting:
git tag -l | sort -V --reverse