如何限制谁可以合并到 GitHub 仓库的主分支?

21

我在Github上的仓库设置了一个分支保护规则,对于主分支(master branch)进行以下检查(启用):

  • 要求在合并之前进行Pull Request审核
  • 所需批准的评审者: 1
  • 包括管理员
  • 限制谁可以推送到匹配分支

那么现在情况是,团队中至少有一位成员必须审核通过PR,然后其他人才能将自己的dev分支合并到master分支。

除了上述内容外,我还想选择只有一些人有权限合并已审核和批准的PR,而不是每个人都可以访问该仓库。

这种设置是否可行?


文档中缺少什么?请参阅以下链接:https://docs.github.com/en/github/administering-a-repository/enabling-branch-restrictions - Ôrel
我已经阅读了这篇文章,但它并不是那么明确。也许“限制谁可以推送到匹配分支”也意味着限制谁可以合并到匹配分支?如果我启用这些人,他们是否能够直接向主分支推送而无需进行PR? - koalaok
请访问 https://docs.github.com/en/github/administering-a-repository/enabling-required-reviews-for-pull-requests,添加最小验证器并设置在合并之前需要拉取请求审查。 - Ôrel
6个回答

7
不,GitHub不允许您限制谁可以执行合并。但是,如果您想要在合并之前要求特定组的人员审批PR,则可以使用 CODEOWNERS 文件 并在分支保护设置中要求代码所有者的批准。
例如,如果您希望核心团队审核所有更改,则可以在您的 CODEOWNERS 文件中使用以下内容:
*  @my-org/core

3
但是这将使得每个在此之后创建的新分支,即使基础分支不是主分支,也需要向代码所有者请求审核。 - Teju Amirthi
不是我所知。"Require review from Codeowners"是分支保护规则的一部分,因此仅适用于您在保护规则中定义的分支(或分支模式)。因此,您可以将其限制在您的主分支上。 - undefined

4

合并拉取请求会遵守目标分支的分支保护规则。因此,请将应被允许合并的人员添加到保护规则中,然后您就可以开始了。enter image description here

enter image description here


3
请提供更多信息,这是如何实现的?使用什么规则? - kutschkem
你如何实现这个? - Dominic Farolino
前往Github存储库。在“代码和自动化”下,进入“设置”->“分支”,然后勾选“限制谁可以推送到匹配的分支”。 - ogborstad
这可能真的能胜任这个工作 - Lelo
如果您在设置中找不到此选项,请记住您需要 GitHub 团队或 GitHub 免费组织。 - Alexander Kucheryuk
显示剩余3条评论

4

我也有和你一样的需求,只允许特定的人(而不是所有协作者)批准对主分支的更改。对于 Github 免费公共仓库,我按照以下步骤操作:

  • 编写一个 Github Actions 文件来检查运行该文件的人员姓名。如果这是一个强大的协作者的名字,则该操作将成功。

name: actions_on_main_branch
on: 
  pull_request_target:
    types:
      - opened
      - synchronize
      - reopened
    branches:    
      - 'main'

jobs:
  job1:
    name: check_adminA
    runs-on: ubuntu-latest
    env:
      NAME_ADMIN: adminA
    steps:
      - name: st1
        if: ${{ github.actor != env.NAME_ADMIN }}
        run: exit 1
      - name: st2
        if: ${{ github.actor == env.NAME_ADMIN }}
        run: echo "ok"

  • 在存储库设置中,添加保护“main”分支的规则。在该规则中,选择'Require status checks to pass before merging'并选择您之前在Github Actions文件中指定的jobs。(如果没有显示作业,请尝试创建触发这些Github Actions的拉取请求,然后在搜索栏中找到作业) (您还可以选择'Include administrators')

    enter image description here

通过这样做,对“main”分支进行的更改必须通过拉取请求,并且这些检查将运行并失败并防止合并。直到强大的协作者(adminA,adminB)进入该拉取请求并重新运行它们,这些检查才会成功并允许合并。
(pull_request_target事件使Github-actions在基本分支的上下文中运行,而不是合并分支。因此,您不必担心Github Actions文件很容易从外部编辑通过。)


这样做不会让协作者在他们的PR中删除此操作吗?这将使所有检查“成功”,并允许他们合并吗? - MartijnvdB
@MartijnvdB 不行。我上面提到的 pull_request_target 事件将确保从主分支中选择 github-actions 文件,而不是合并分支。这意味着协作者无法修改来自合并分支的操作以使 PR 全部通过。 - irous

2

使用“分支保护规则”可以实现此功能:

Branch protection Rules Section

您需要选择要保护的分支,并在此选项中选择允许合并的人员:

Section to add people who can approve pull request


2
你可以清楚地在屏幕截图中看到,该功能是用于控制谁可以推送到匹配分支,与控制谁可以合并无关。 - Sam
@Sam推送不是执行合并的必要步骤吗?你必须将合并结果推送到远程仓库才能存储在那里,所以也许这实际上是原始问题的答案。我需要调查一下是否有效。 - Harvey Adcock

0

@irous 我按照你的答案操作,对于单个用户来说它是有效的,但是当尝试指定多个用户时,要求这两个指定的协作者必须通过才能进行PR合并。以下是添加的脚本:

  job1:
name: check_adminA
runs-on: ubuntu-latest
env:
  NAME_ADMIN1: pracin
steps:
  - name: st1
    if: ${{ github.actor != env.NAME_ADMIN1 }}
    run: exit 1
  - name: st2
    if: ${{ github.actor == env.NAME_ADMIN1 }}
    run: echo "ok"
job2:
name: check_adminB
runs-on: ubuntu-latest
env:
  NAME_ADMIN2: stephus
steps:
  - name: st1
    if: ${{ github.actor != env.NAME_ADMIN2 }}
    run: exit 1
  - name: st2
    if: ${{ github.actor == env.NAME_ADMIN2 }}
    run: echo "ok"

我没有收到你的标记通知。你的问题是什么?你想要ADMIN1或ADMIN2的接受是否足够?还是两者都必须接受? - irous
@irous 是的,我想要 ADMIN1 或 ADMIN2 的接受都可以。 - Pensec
在 job1 中,st1 使用 '&&' 检查两个管理员。在 job1 中,st2 使用 '||' 检查任何一个管理员。参考。请删除 job2。 - irous
你好 @irous,我尝试编辑下面的脚本,但发现无论谁想要合并,它都会通过,这破坏了计划,请帮忙检查。name: actions_on_snapshot on: pull_request_target: types: - opened - reopened branches: - 'snapshot'jobs: job1: name: merger runs-on: ubuntu-latest env: ADMIN1: user1 ADMIN2: user2steps: - if: ${{ env.ADMIN1 != 'user1' || env.ADMIN2 != 'user2' }} run: exit - if: ${{ env.ADMIN1 == 'user1' || env.ADMIN2 == 'user2' }} run: echo "ok" - Pensec
我假设你期望的结果是允许管理员1或2。如果是这样,在步骤1中,请尝试使用“&&”而不是“||”,并使用“exit 1”而不是“exit”。 - irous

0

我记得至少一半的功能都在GitHub的设置中。在你的情况下,只有审批者应该被添加为“合作者”,因为他们可以进行push操作。其他用户将不得不打开一个pull request来进行任何更改。


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