我正在使用
git describe --long --tags
从存储库标签自动生成版本字符串。这样,如果我有 1.20 标签,我的代码中就会得到 1.20-5-g27ba6e8 版本字符串。
现在我只对正则表达式中看起来像
^\d+\.\d+$
的标签感兴趣(我不希望 describe
看到任何其他描述性标签)。
git describe
有 --match 开关,如果不是因为匹配是使用 glob 模式完成的,这正是我所需要的。
如何将全局模式限制为仅由点分隔的两个数字(可以有任意位数!)?
如何将全局模式限制为仅由点分隔的两个数字(可以有任意位数!)?
你不能。最大的问题是 glob 模式无法重复最后一个模式一次或多次,没有像正则表达式中那样的
+
运算符。你能做的最接近的是:
[0-9]*.[0-9]*
遗憾的是
*
与 any 字符匹配。 bash
shell 通过引入 +([0-9]).+([0-9])
形式的扩展 glob 解决了这个问题。 但是您可以多次指定--match
并为所有可能的组合生成模式(粉扑):
# generated with:
# p="[0-9] [0-9][0-9] [0-9][0-9][0-9]"; for i in $p; do for j in $p; do echo "--match \"$i.$j\""; done; done | paste -sd' '
# should handle up numbers up to 3 digits
git describe --long --tags --match "[0-9].[0-9]" --match "[0-9].[0-9][0-9]" --match "[0-9].[0-9][0-9][0-9]" --match "[0-9][0-9].[0-9]" --match "[0-9][0-9].[0-9][0-9]" --match "[0-9][0-9].[0-9][0-9][0-9]" --match "[0-9][0-9][0-9].[0-9]" --match "[0-9][0-9][0-9].[0-9][0-9]" --match "[0-9][0-9][0-9].[0-9][0-9][0-9]"
我还建议为开源做出贡献并沿着
--regexmatch
到 git describe
实施一些事情。另一种方法是自己进行过滤,并将标签传回git-describe
来描述它。在 POSIX shell 中,可能是这样的:
git tag --sort=committerdate | grep '^[0-9]\+\.[0-9]\+$' | tail -n1 | xargs git describe --long --tags --exact-match --match
我知道这个问题已经问了三年多了,但直到今天我在研究类似的问题时才偶然发现它,答案是:是的,你可以(它只是不像正则表达式支持那么简单) ).
您需要几个球来逐渐缩小所需图案的范围。
专门针对这个问题中的问题,这里是过滤器:
git describe --tags --exclude=*[!0-9.]* --exclude=*\.*\.* --match=v[0-9]*\.[0-9]*
您可能需要添加一个或两个以上的排除项来过滤掉“格式错误”的版本,例如
1.01
或 00.0
(semver,例如,不允许前导零),但关键思想是相同的:由于全局限制而无法匹配?然后排除。