如何将一个 Github 分支规则应用于多个分支?

124

我的意思是我想创建一条规则,并指定多个分支,比如 dev|master。但在查看文档后,我认为这是不可能的吗?难道我必须创建两条规则才能使用同一条规则来保护两个分支吗?


4
GitHub让这件事变得如此困难,令人失望。https://docs.github.com/articles/defining-the-mergeability-of-pull-requests/ - Ryan
我已经发布了一个社区反馈帖子,请求将正则表达式作为新功能加入。 - Richard Tyler Miles
9个回答

139

我找到了一个相当丑陋的方法来做到这一点,至少可以接近目标(尽管如果@GitHub能给我们比fnmatch更好的东西就好了...)。

你可以使用字符集来指定仓库名称中的起始字符,像这样:

(Using "main" branch): [dm][ea][vi]*
(Using "master" branch): [dm][ea][vs]*

它将匹配devmain/master,这正是您想要的,但第二个还将匹配“mastodon-rules”和“devo-is-my-favorite-band”,因为通配符。我认为fnmatch不像正则表达式?那样给你一个“零或一”的量词,所以它相当受限制。

Github的fnmatch确实允许否定字符集,因此如果某条规则捕获了您不想包含的分支,您可能可以绕过该问题:

(using "main" branch): [dm][ea][vi][!o]*
(using "master" branch): [dm][ea][vs][!o]*

这将错过dev分支(但它会捕获developmain/master),但它排除了“devo”,所以至少在与你的金属头朋友进行通宵摇滚时,“whip it”不会开始播放。

不可否认,这不是一个非常令人满意的解决方案。但是使用fnmatch这可能是目前最好的选择。


你不应该做什么

还有其他多个答案声称这种模式(或类似变体)可以正常工作:

[main,qa,stage,master]*

不要被这美妙的诱惑所迷惑

引擎会将方括号中的字符视为单个字符。添加逗号(或分号,或任何其他“分隔符”)也无法改变这种行为。

方括号:“匹配其中任意一个字符”
星号:“匹配任意长度的任意字符串”

因此,虽然该模式肯定会匹配方括号中的单词,但它还会匹配以方括号中的任一字符开头的任意长度的任意字符串[aegimnqrst,]


8
比起为同一件事情创建三个不同的规则,这样做更好! - Adam Reis
22
好过没有。 - Sraw
4
很遗憾,这种格式过于严格了,会保护一些我并不想要保护的分支。 - kian
11
我想知道为什么Github不使用正则表达式来处理这件事情。 - Seonghyeon Cho
48
不是我预期的答案,而我贡献的全部只有[w][t][f]*。 - Victor Ude
显示剩余6条评论

12

今天早上我一直在努力理解这个问题,我认为你(/我们)可能需要为每个分支创建两个完全相同的规则。至少在阅读以下内容后,我是这样认为的:

https://github.community/t5/How-to-use-Git-and-GitHub/Apply-a-single-branch-protection-rule-to-both-master-and-release/td-p/11587

版主评论:

"不,无法在“应用规则于”框中执行此操作。正如受保护分支文档中所述,我们使用fnmatch库将分支名称与匹配表达式匹配。如果启用了一个标志,那么有一种功能可以允许匹配两个规则,但我们在我们的环境中不启用该标志。"

或者,如果您想将一个规则应用于以相同匹配短语开头或包含相同匹配短语的所有分支,则可以使用此解决方案:

https://github.community/t5/How-to-use-Git-and-GitHub/Branch-Protection-on-multiple-branches/td-p/10519

社区经理的评论:

分支保护规则模式基于fnmatch语法。您可以使用releases/v?.?来自动保护类似releases/v1.0、releases/v2.0和releases/v2.1的分支。而[1-9]-[0-9]-stable可以自动保护类似1-0-stable、2-0-stable和2-1-stable的分支。


7

跟随z4-tear的精彩解释 这将涵盖开发 主分支暂存分支

[dms][tea][avs]*[iet][ne][gtr]

这是一个很好的选择,因为它不会允许像 master-blahblah 这样的东西。 - ReenigneArcher
1
仍然可以使用“保存”、“主动干掉”、“迷惑”,“之后道歉”,“座位”和“会话测试”。但是,匹配分支的集合肯定更小。 - Abel

7

若要应用于所有内容,请添加 --> **/**


0

-1

根据上述解释,[mds][aet][iva][neg]* 适用于 developstagingmain。当然,它也匹配其他组合。


-5

在开发和主分支上启用它,但不要在测试分支上启用

[develop;master]*[!test]*

3
这将使其在名称的第一个字符为任何字符 [adelmoprstv;] 并且字符串的其余部分不包含任何字符 [est] 的任何分支上启用它。 - Z4-tier

-14
根据GitHub文档所述,它们使用fnmatch库来进行模式匹配操作。该语法允许使用交替方式:

{a,b}

如果启用了File::FNM_EXTGLOB标志,则匹配模式a和模式b。类似于正则表达式联合((?:a|b))。

对于您的问题,您要查找的模式可能是{dev, master}。 我不知道“如果启用了File::FNM_EXTGLOB标志”是什么意思,因此这可能行不通。

4
这个回答应该被删除。 - Lokesh
8
这是关于 fnmatch 的唯一正确答案,但是 GitHub 似乎没有传递所需的 File::FNM_EXTGLOB,因此实际上无法正常工作。但是,从语法上讲,这是唯一正确的答案,也是人们期望在 GitHub 使用 fnmatch 时能够正常工作的答案。 - dossy

-19

他们已经启用了通配符。因此,这个模式可以工作:

[main,qa,stage,master]*

3
@James 这并不是你想要的... 这将匹配方括号中任何字符开头的任何长度的单词,这包括超过200,000个字典单词(它将匹配“steves_branch”和“testing”以及许多其他你可能不想要的东西)。 接受的答案展示了如何避免这种情况。 - Z4-tier
1
我的错,我现在看到了。我使用[Mm][Aa][sSiI][tTnN]*匹配主或者主节点。 - James

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