如何解决git描述--匹配限制

问题描述 投票:0回答:2

我正在使用

git describe --long --tags
从存储库标签自动生成版本字符串。这样,如果我有 1.20 标签,我的代码中就会得到 1.20-5-g27ba6e8 版本字符串。

现在我只对正则表达式中看起来像

^\d+\.\d+$
的标签感兴趣(我不希望
describe
看到任何其他描述性标签)。

git describe
有 --match 开关,如果不是因为匹配是使用 glob 模式完成的,这正是我所需要的。

如何将全局模式限制为仅由点分隔的两个数字(可以有任意位数!)?

git glob
2个回答
4
投票

如何将全局模式限制为仅由点分隔的两个数字(可以有任意位数!)?

你不能。最大的问题是 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

0
投票

我知道这个问题已经问了三年多了,但直到今天我在研究类似的问题时才偶然发现它,答案是:是的,你可以(它只是不像正则表达式支持那么简单) ).

您需要几个球来逐渐缩小所需图案的范围。

专门针对这个问题中的问题,这里是过滤器:

git describe --tags --exclude=*[!0-9.]* --exclude=*\.*\.* --match=v[0-9]*\.[0-9]*
  • 通过第一个排除,您可以过滤掉其中包含数字或点以外的字符的任何标签
  • 使用第二个过滤掉具有多个点的标签
  • 现在你剩下的标签只包含数字和一个点,剩下的就是确保点之前和之后至少有一个数字,这就是最后一个匹配所完成的(两个额外的排除也会做这个伎俩)。

您可能需要添加一个或两个以上的排除项来过滤掉“格式错误”的版本,例如

1.01
00.0
(semver,例如,不允许前导零),但关键思想是相同的:由于全局限制而无法匹配?然后排除。

© www.soinside.com 2019 - 2024. All rights reserved.