Github "分支名称模式" 否定

55
在 Github 上,当您进入分支设置并创建“分支保护规则”时,如何指定除 'master' 以外的任何分支? 我尝试了一堆类似正则表达式的表达式,但似乎都不起作用 :(

我不确定,但可以尝试一下 {m,[^m]*,ma,m[^a]*,mas,ma[^s]*,mast,mas[^t]*,maste,mast[^e]*,maste[^r]*} - revo
@revo "规则无效" :( - Magnus
Github的fnmatch实现似乎有限。有人解决了吗? - Krumelur
我已经发布了一个社区反馈帖子,请求将正则表达式作为新功能加入。 - Richard Tyler Miles
5个回答

44

GitHub使用fnmatch来匹配任何提供的模式,以查找规则适用于哪些分支以进行分支保护。

目前还没有一个精确的fnmatch模式可用于GitHub,可以精确地解析除master之外的任何内容,但最接近它的模式是:

*[!master]*

但这也将排除仅包含master或仅包含这些字母组合的分支。
请查看GitHub帮助fnmatch文档中有关上述内容的更多细节。

1
嘿@MadhuBhat,fnmatch页面从未提到[!...]语法。您能告诉我它来自哪里吗? - revo
@revo,文档没有提供这个确切情况的示例,但我从给出的示例中推导出来了。其中 *c*[set]! or ^ 的句法均为否定运算符。 - Madhu Bhat
2
我在文档中发现!^在否定字符类方面的行为相同。这意味着[!master]并不意味着“不是master”,而是意味着“既不是maste也不是r”。 - revo
这是设置GitHub分支规则的正确方法:https://dev59.com/xFMI5IYBdhLWcg3w5v0N#61421938 - peterdemin
1
很遗憾,GitLab在受保护的分支中没有使用fnmatch,而是使用正则表达式,并且它们逃避规则,因此仅以fnmatch方式支持*:https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/models/ref_matcher.rb#L38-45 - Patrick Valsecchi

31

你可以使用以下方式创建规则:

master

接着创建另一条规则(在第一条规则之后):

**/**

那么这个第二条规则将适用于除了主分支以外的所有分支,因为主分支已经被之前的一条规则覆盖:

输入图片描述


完美的解决方案!! - jay1648
1
如何重新排序现有规则? - Qi Luo

2
我通过创建六个单独的规则解决了这个问题:
[!m]*
m[!a]*
ma[!s]*
mas[!t]*
mast[!e]*
maste[!r]*

branch protection rules


2
切换默认分支为“main”的具体示例,将使生活更加简单。聪明的解决方案+1。 - bishop

-1
Github分支名称模式基于“fnmatch”,而不是正则表达式。为了匹配所有包含“master”关键字的分支名称,我们使用了以下模式。
**/master

-12

您可以使用负向先行断言来断言字符串 "master" 不匹配:

^((?!^master$).)*$

你可以在这里测试这个正则表达式


对于 ^((?!^master$).)*$,提示信息为“规则无效”。 - Magnus
似乎 Github 的分支保护规则只支持通配符而不支持正则表达式。 - 0xAA55
1
Github的规则基于fnmatch,而不是regex。 - Dan Ortega

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接