如何通过版本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.prereleaseconfigurationvariables来指定v1.0-pre1v1.0之前

见Junio C gitstergitster )的 提交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 gitstergitster -在提交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组件转换为foorefs/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 ”中使用的版本比较的prereleaseSuffixfunction在相同版本的两个或多个预发行版本不存在的情况下不正确(例如, 2.0-beta12.0-beta2存在且代码需要比较2.0-beta12.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