142

当我输入命令时:

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

如何对当前列表进行排序以获得这样的结果?

4

9 回答 9

204

使用版本排序

git tag -l | sort -V

或者对于 git 版本 >= 2.0

git tag -l --sort=v:refname
git tag -l --sort=-v:refname # reverse
于 2013-01-11T07:29:11.243 回答
95

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

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

 --sort=<type>

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

  • " refname" (字典顺序),
  • version:refname”或“ v: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*"
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

此变量控制标签在显示时的排序顺序git-tag
如果没有--sort=<value>提供 " " 选项,此变量的值将用作默认值。

罗宾斯特 评论

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

git config --global tag.sort version:refname

正如Leo Galleguillos评论中指出的那样:

要将 Git 配置为首先显示最新标签降序),只需在 version 之前添加一个连字符。
命令变为:

git config --global tag.sort -version:refname

使用Git 2.4 (Q2 2015)配置变量可用于指定之前versionsort.prereleasev1.0-pre1v1.0.

请参阅Junio C Hamano ( )提交 f57610agitster

注意(见下文)versionsort.prereleaseSuffix现在(2017 年)已弃用versionsort.suffix.


git 2.7.1(2016 年 2 月)将提高git tag自身的输出。

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

tag:不要将模棱两可的标签名称显示为“ tags/foo

b7cc53e ( tag.c: use ' ref-filter' APIs, 2015-07-11) 以来,git tag已经开始将名称不明确的标签(即,当“ heads/foo”和“ tags/foo”都存在时)显示为“ tags/foo”,而不仅仅是“ foo”。
这是两者:

  • 无意义; "" 的输出git tag包括 only 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调用相同的行为,同时让“ ”在所有地方都具有相同的一致含义。tagfor-each-ref:short

如果strip=<N>被附加,<N>则从 refname 的前面去除斜杠分隔的路径组件(例如,变成%(refname:strip=2).必须是一个正整数。 如果显示的 ref 的组件少于,则命令中止并出现错误。refs/tags/foofoo
<N>
<N>

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


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

请参阅SZEDER Gábor ( ) 的提交c026557提交 b178464提交 51acfa9提交 b823166提交 109064a提交 0c1b487提交 9ffda48提交 eba286e(2016 年 12 月 8 日(由Junio C Hamano 合并——提交 1ac244d中,2017 年 1 月 23 日)szeder
gitster

versionsort.prereleaseSuffix是不推荐使用的别名versionsort.suffix

“ ”prereleaseSuffix中使用的版本比较功能在git tag -l存在两个或多个相同版本的预发行版时不正确(例如,何时2.0、、2.0-beta12.0-beta2 存在并且代码需要比较2.0-beta12.0-beta2)。

于 2014-03-25T12:29:12.093 回答
13

结合这里已有的答案:

本地存储库

git -c 'versionsort.suffix=-' tag --list --sort=-v:refname
  • 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'

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

有关更多信息,请参阅此答案

于 2018-10-06T16:14:55.650 回答
12

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

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

于 2014-06-18T10:21:56.560 回答
2

要使用该sort -V方法进行反向排序:

git tag -l | sort -V --reverse
于 2017-03-15T21:39:20.680 回答
1

调整这个 perl 脚本,它对看起来像的标签进行排序client_release/7.2/7.2.25,以适应您的特定标签方案。

于 2014-02-09T17:09:56.890 回答
1

我最终编写了一个简单的 shell 脚本来简化这个任务。

#!/usr/bin/env bash

TAGS=$(git tag)
CODE=$?

if [ $CODE = 0 ]; then
    echo "$TAGS" | sort -V
fi

exit $CODE

我将其保存git-tags在我的文件中$PATH,并git tags在需要列出标签时运行。

于 2014-06-05T21:21:30.987 回答
1

如果您在 Linux 上并使用 ZSH;只需使用gtl命令。它应该为您预定义为别名。

别名代码:
gtl='gtl(){ git tag --sort=-v:refname -n -l "${1}*" }; noglob gtl'

于 2021-08-07T09:05:25.490 回答
0

尝试最后一个特殊甲酸盐的清单

git tag -l --sort=refname | grep -E '^\d+\.\d+\.\d+.*' | tail -n 1

或第一个

git tag -l --sort=refname | grep -E '^\d+\.\d+\.\d+.*' | head -n 1

于 2022-02-11T06:52:08.467 回答