如何按形式rc-XYZW的版本字符串顺序对git标签进行排序?

Via*_*iuk 96 tags git sorting

当我输入命令时:

git tag -l
Run Code Online (Sandbox Code Playgroud)

我得到了这样的结果:

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

而不是我想要的:

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

如何对当前列表进行排序以获得此类结果?

Rob*_*tke 128

使用版本排序

git tag -l | sort -V
Run Code Online (Sandbox Code Playgroud)

或者对于git版本> = 2.0

git tag -l --sort=v:refname
git tag -l --sort=-v:refname # reverse
Run Code Online (Sandbox Code Playgroud)

  • -X参数在OS X(10.8)提供的排序版本(5.93)上不可用.:( (5认同)
  • 我不得不使用`brew install coreutils`来获取`gsort`命令.`brew install gsort`失败了,说没有名为`gsort`的包. (4认同)
  • 当您需要不区分大小写时,“sort -Vf”非常方便。我知道一个大项目树,其标签中的“beta”和“RC”大写混乱。这会导致“RC”出现在“beta”之前。 (3认同)
  • 你可以使用自制软件或macports来安装gnu版本的sort.`brew install gsort`然后你可以将上面的行修改为`git tag -l | gsort -V`它应该适合你. (2认同)
  • @ssoto 是的,但它是关于版本号的自然排序 - 而不是反向排序。 (2认同)

Von*_*onC 74

使用Git 2.0(2014年6月),您将能够指定排序顺序!

请参阅提交b6de0c6,来自提交9ef176b,由NguyễnTháiNgọcDuypclouds撰写():

 --sort=<type>
Run Code Online (Sandbox Code Playgroud)

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

  • " refname"(词典顺序),
  • " version:refname"或" v:refname"(标签名称被视为版本).

前置" -"以反转排序顺序.


所以,如果你有:

git tag foo1.3 &&
git tag foo1.6 &&
git tag foo1.10
Run Code Online (Sandbox Code Playgroud)

这是你会得到的:

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

提交b150794(由Jacob Keller,git 2.1.0,2014年8月)以来,您可以具体说明该默认顺序:

tag.sort
Run Code Online (Sandbox Code Playgroud)

此变量控制显示时标记的排序顺序git-tag.
如果未--sort=<value>提供" "选项,则此变量的值将用作默认值.

robinst 评论:

现在可以将版本排序顺序(Git 2.1+)配置为默认值:

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

使用Git 2.4(2015年第2季度),配置变量可用于指定之前versionsort.prerelease配置变量v1.0-pre1v1.0.

看看提交f57610a通过JUNIOÇ滨野(gitster).

注意(见下文)versionsort.prereleaseSuffix现在是(2017)一个不推荐使用的别名versionsort.suffix.


git 2.7.1(2016年2月)将提高git tag自身的产量.

请参阅提交0571979(2016年1月26日),并由Jeff King()提交1d094db(2016年1月24日).(由Junio C Hamano合并- -提交8bad3de,2016年2月1日)peff
gitster

tag:不要将不明确的标签名称显示为" tags/foo"

由于b7cc53e(tag.c:使用' ref-filter'API,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>被附加,条<N>从refname的前面(例如,斜线分隔径分量%(refname:strip=2)变成refs/tags/foofoo.
<N>必须是一个正整数.
如果所显示的参考具有比更少的组件<N>,该命令与一个错误终止.

对于git tag,未指定时,默认为%(refname:strip=2).


更新Git 2.12(2017年第1季度)

提交c026557,提交b178464,提交51acfa9,提交b823166,提交109064a,提交0c1b487,提交9ffda48,提交eba286e(2016年12月8日)由SZEDER伽柏(szeder).
(由Junio C gitsterHamano合并- -提交1ac244d,2017年1月23日)

versionsort.prereleaseSuffix是一个弃用的别名versionsort.suffix.

prereleaseSuffix是在"使用的版本比较的功能,git tag -l"没有正确的当两个或多个prereleases为同一发行人存在(例如,当2.0,2.0-beta12.0-beta2 在那里,代码需要比较2.0-beta12.0-beta2).

  • 在 Git 2.1.0 中,版本排序顺序现在可以配置为默认值: `git config --global tag.sort version:refname` (3认同)

Céd*_*ric 12

根据这个答案,在不支持sort -VWindows和OSX的平台上,您可以使用

git tag -l | sort -n -t. -k1,1 -k2,2 -k3,3 -k4,4


Tom*_*ale 8

结合这里的答案:

本地存储库

git -c 'versionsort.suffix=-' tag --list --sort=-v:refname
Run Code Online (Sandbox Code Playgroud)
  • suffix=-将阻止2.0-rc"后"2.0
  • --sort=- 将最高版本号放在顶部.

远程存储库

git -c 'versionsort.suffix=-' ls-remote -t --exit-code --refs --sort=-v:refname "$repo_url" \
    | sed -E 's/^[[:xdigit:]]+[[:space:]]+refs\/tags\/(.+)/\1/g'
Run Code Online (Sandbox Code Playgroud)

这样做的好处是不会从远程下载任何对象.

有关详细信息,请参阅此答案.