我试图定义以下规则:“main仅允许来自dev”的拉取请求;因此,如果有人从随机分支打开 PR,则main不应允许。我该如何继续这样做?
您可以将 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之外的任何其他分支作为源分支的拉取请求,工作流程将引发错误,并且您无法合并。
请注意,您还应该将“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)