git 如何在macOS上模拟“sort -V”

kg7wmglp  于 2023-01-01  发布在  Git
关注(0)|答案(5)|浏览(135)

我写了一个bash脚本,我需要在linux和macOS上使用sort命令。我将git tag -l的输出通过管道传输到sort,以获得所有版本标签的正确语义顺序列表。GNU提供了-V,使其自动化,但macOS不支持此参数。所以我需要弄清楚如何在没有它的情况下完成这个排序顺序。

6.3.1.1
6.3.1.10
6.3.1.11
6.3.1.2
6.3.1.3
...

需要排序为

6.3.1.1
6.3.1.2
6.3.1.3
...
6.3.1.10
6.3.1.11
6g8kf2rb

6g8kf2rb1#

您可以使用git tag的其他特性来获取与模式匹配的标记列表,并按照版本标记顺序正确排序(通常没有前导零):

$ git tag --sort v:refname
v0.0.0
v0.0.1
v0.0.2
v0.0.3
v0.0.4
v0.0.5
v0.0.6
v0.0.7
v0.0.8
v0.0.9
v0.0.10
v0.0.11
v0.0.12

$ man git-tag开始:

--sort=<type>
       Sort in a specific order. Supported type is "refname
       (lexicographic order), "version:refname" or "v:refname" 
       (tag names are treated as versions). Prepend "-" to reverse 
       sort order. When this option is not given, the sort order
       defaults to the value configured for the tag.sort variable
       if it exists, or lexicographic order otherwise. See 
       git config(1).
7vhp5slm

7vhp5slm2#

您可以从http://rudix.org/packages/index.html下载coreUtils
它包含gnusort,支持sort -V sintax

jm2pwxwz

jm2pwxwz3#

sed 's/\b\([0-9]\)\b/0\1/g' versions.txt  | sort | sed 's/\b0\([0-9]\)/\1/g'

为了解释为什么会这样,考虑第一个sed命令本身,输入versions.txt,第一个sed命令在一位数版本号前面加一个前导零,生成:

06.03.01.01
06.03.01.02
06.03.01.03
06.03.01.10
06.03.01.11

以上可以正常排序,之后就是去掉添加的字符,在完整命令中,最后一个sed命令去掉前导零,得到最终输出:

6.3.1.1
6.3.1.2
6.3.1.3
6.3.1.10
6.3.1.11

只要版本号为99或更小,命令就能正常工作。如果版本号大于99但小于1000,命令只会稍微复杂一些:

sed 's/\b\([0-9]\)\b/00\1/g ; s/\b\([0-9][0-9]\)\b/0\1/g' versions.txt  | sort | sed 's/\b0\+\([0-9]\)/\1/g'

由于我没有Mac电脑,上面的测试是在Linux上进行的。
更新:Jonathan Leffler在评论中说,尽管Mac regex文档中有单词边界(\b),但Mac sed似乎无法识别它,他建议将第一个sed替换为:

sed 's/^[0-9]\./0&/; s/\.\([0-9]\)$/.0\1/; s/\.\([0-9]\)\./.0\1./g; s/\.\([0-9]\)\./.0\1./g'

因此,完整命令可能是:

sed 's/^[0-9]\./0&/; s/\.\([0-9]\)$/.0\1/; s/\.\([0-9]\)\./.0\1./g; s/\.\([0-9]\)\./.0\1./g' versions.txt | sort | sed 's/^0// ; s/\.0/./g'

这可以处理高达99的版本号。

pw136qt2

pw136qt24#

安装在OS X上的标准排序可以使用分隔符按字段排序,所以你可以对版本号和任何后缀进行排序。
这将首先按后缀排序,然后按X.Y.Z部分sort -s -t- -k 2,2n | sort -t. -s -k 1,1n -k 2,2n -k 3,3n -k 4,4n排序,还可以对git describe --tags命令中的-N-g格式版本号排序

0.11.1
0.11.4
0.11.9-1-ge6b0c59
0.12.0
0.12.1
0.12.2-1-g2d0a334
0.13.0
0.13.0-1-g7711b16
0.13.0-2-g32f91bd
0.13.0-3-g83e21c5
0.14.1-alpha
0.14.1
0.14.2

上面的-3-g83 e21 c5是后缀的示例,git describe --tags命令将自动附加到最新的标记,以表示自标记(3)以来的提交次数,以及最近提交的Git SHA哈希(83 e21 c5)
要将排序反转为降序,请执行以下操作:sort -s -t- -k 2,2nr | sort -t. -s -k 1,1nr -k 2,2nr -k 3,3nr -k 4,4nr
也可以在其周围定义一个shell函数。

version_sort() {
        # read stdin, sort by version number descending, and write stdout
        # assumes X.Y.Z version numbers

        # this will sort tags like pr-3001, pr-3002 to the END of the list
        # and tags like 2.1.4 BEFORE 2.1.4-gitsha

        sort -s -t- -k 2,2nr |  sort -t. -s -k 1,1nr -k 2,2nr -k 3,3nr -k 4,4nr
    }

或者把它写进一个名为version-sort的小文件中,然后放到你的PATH中的某个目录下。

#!/usr/bin/env bash
sort -s -t- -k 2,2nr |  sort -t. -s -k 1,1nr -k 2,2nr -k 3,3nr -k 4,4nr
11dmarpk

11dmarpk5#

第一个月
如果安装了corutils,您的Mac上应该有gsort
gsort --version

相关问题