在 github 中,有没有办法阻止除 dev 之外的任何其他分支向 main 发出拉取请求?

Eze*_*r K 6 github

我试图定义以下规则:“main仅允许来自dev”的拉取请求;因此,如果有人从随机分支打开 PR,则main不应允许。我该如何继续这样做?

Sas*_*cha 9

您可以将 GitHub 工作流程添加到项目中,该工作流程将在每个打开的拉取请求上运行。在该工作流程中,您可以比较源分支和目标分支,如果不满足您的要求,则抛出错误。工作流程可以是这样的。

name: Check pull request source branch
on:
  pull_request_target:
    types:
      - opened
      - reopened
      - synchronize
jobs:
  check-branches:
    runs-on: ubuntu-latest
    steps:
      - name: Check branches
        run: |
          if [ ${{ github.head_ref }} != "dev" ] && [ ${{ github.base_ref }} == "main" ]; then
            echo "Merge requests to main branch are only allowed from dev branch."
            exit 1
          fi

Run Code Online (Sandbox Code Playgroud)

有了工作流程后,转到项目设置,单击“分支”,然后单击“添加规则”标记合并前需要通过状态检查复选框,然后从下拉菜单中选择状态检查检查分支。然后点击保存。如果您现在尝试合并以main作为目标分支和除dev之外的任何其他分支作为源分支的拉取请求,工作流程将引发错误,并且您无法合并。


ajs*_*app 5

请注意,您还应该将“edited”添加到上面的类型中,以便当创建 PR 的基础分支设置为 main 的人在 PR 已创建且看到后将其更改为 dev 时,检查会再次运行检查失败。否则,他们必须关闭并重新打开 PR 才能再次触发它。

我已经添加到 Sascha 的解决方案中,这样会更好:

name: Check pull request source branch
on:
  pull_request_target:
    types:
      - opened
      - reopened
      - synchronize
      - edited
jobs:
  check-branches:
    runs-on: ubuntu-latest
    steps:
      - name: Check branches
        run: |
          if [ ${{ github.head_ref }} != "dev" ] && [ ${{ github.base_ref }} == "main" ]; then
            echo "Merge requests to main branch are only allowed from dev branch."
            exit 1
          fi
Run Code Online (Sandbox Code Playgroud)