使用钩子在某些条件下自动将一个分支合并到另一个分支?
Automatically merge one branch into another basis on some conditions using hook?
我的 github 存储库中有两个分支 - master
和 dev
分支。我有一个要求,我需要在以下条件下将 master
分支合并到 dev
分支:
- 一旦 PR 直接合并到 master 分支,那么我需要自动将 master 分支合并回 dev 分支。
- 每当有人直接向 master 分支添加提交时,我需要自动将
master
分支合并回 dev
分支。
这有可能做到吗?我相信我们可以使用 git Hooks 来完成这项工作,但我不确定该怎么做。有人可以提供有关如何实现此目标的示例吗?
我在网上阅读它,看起来我可以使用 post-receive
钩子和下面的内容,但我很困惑如何只有当有人向 master
分支或任何分支添加提交时才可以这样做PR 合并到 master 分支?这也是正确的方法吗?
git checkout master
git pull
git checkout dev
git pull
git merge master --no-ff --no-edit
git push
我明白,由于合并冲突,这可能并不总是可能的,但如果可能的话,我们希望它自动发生。
更新
阅读更多关于 Github Actions
的信息后 - 我在 git 存储库的根文件夹中创建了一个这样的文件 .github/workflows/merge-back-to-dev.yml
,内容如下。这看起来对吗?我需要像 runs-on
这样的所有字段吗?
name: 'Nightly Merge'
on:
push:
branches:
- master
jobs:
nightly-merge:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v1
- name: Nightly Merge
uses: robotology/gh-action-nightly-merge@v1.3.1
with:
stable_branch: 'master'
development_branch: 'dev'
allow_ff: false
所以现在有了这个更改,每当我直接向 master
分支添加提交或任何 PR 直接合并到 master
分支时,master 分支将自动合并到 dev 分支,对吗?
对于私有 GHE(GitHub Enterprise)服务器,仅支持 pre-receive hooks,这不是您所需要的(post-接收挂钩就可以了)
由于 OP 也有一个 GitLab 服务器,gitab-ci.yml
可以完成合并。
有点像this gist:
merge_back:
stage: merge back master to dev
only:
- master
script:
- git config --global user.email "$GIT_USER_EMAIL"
- git config --global user.name "$GIT_USER_NAME"
- git switch dev
- git merge $CI_COMMIT_SHA --no-commit --no-ff
原回答(当时以为是github.com)
那不会使用挂钩,而是 GitHub Actions,这有助于自动化在 GitHub 端执行的流程(与在客户端执行的挂钩相反)
您可以在 .github/workflows/myscript.yml
中使用 on.<push|pull_request>.<branches|tags>
(您可以将“myscript”替换为更昂贵的名称,例如 merge-back-to-dev.yml
)
您可以使用像 nightly-merge
这样的操作,它会自动将稳定分支(master
或 main
)合并到开发分支中。除了你的情况,你会在推送事件中显式调用它。
我的 github 存储库中有两个分支 - master
和 dev
分支。我有一个要求,我需要在以下条件下将 master
分支合并到 dev
分支:
- 一旦 PR 直接合并到 master 分支,那么我需要自动将 master 分支合并回 dev 分支。
- 每当有人直接向 master 分支添加提交时,我需要自动将
master
分支合并回dev
分支。
这有可能做到吗?我相信我们可以使用 git Hooks 来完成这项工作,但我不确定该怎么做。有人可以提供有关如何实现此目标的示例吗?
我在网上阅读它,看起来我可以使用 post-receive
钩子和下面的内容,但我很困惑如何只有当有人向 master
分支或任何分支添加提交时才可以这样做PR 合并到 master 分支?这也是正确的方法吗?
git checkout master
git pull
git checkout dev
git pull
git merge master --no-ff --no-edit
git push
我明白,由于合并冲突,这可能并不总是可能的,但如果可能的话,我们希望它自动发生。
更新
阅读更多关于 Github Actions
的信息后 - 我在 git 存储库的根文件夹中创建了一个这样的文件 .github/workflows/merge-back-to-dev.yml
,内容如下。这看起来对吗?我需要像 runs-on
这样的所有字段吗?
name: 'Nightly Merge'
on:
push:
branches:
- master
jobs:
nightly-merge:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v1
- name: Nightly Merge
uses: robotology/gh-action-nightly-merge@v1.3.1
with:
stable_branch: 'master'
development_branch: 'dev'
allow_ff: false
所以现在有了这个更改,每当我直接向 master
分支添加提交或任何 PR 直接合并到 master
分支时,master 分支将自动合并到 dev 分支,对吗?
对于私有 GHE(GitHub Enterprise)服务器,仅支持 pre-receive hooks,这不是您所需要的(post-接收挂钩就可以了)
由于 OP 也有一个 GitLab 服务器,gitab-ci.yml
可以完成合并。
有点像this gist:
merge_back:
stage: merge back master to dev
only:
- master
script:
- git config --global user.email "$GIT_USER_EMAIL"
- git config --global user.name "$GIT_USER_NAME"
- git switch dev
- git merge $CI_COMMIT_SHA --no-commit --no-ff
原回答(当时以为是github.com)
那不会使用挂钩,而是 GitHub Actions,这有助于自动化在 GitHub 端执行的流程(与在客户端执行的挂钩相反)
您可以在 .github/workflows/myscript.yml
中使用 on.<push|pull_request>.<branches|tags>
(您可以将“myscript”替换为更昂贵的名称,例如 merge-back-to-dev.yml
)
您可以使用像 nightly-merge
这样的操作,它会自动将稳定分支(master
或 main
)合并到开发分支中。除了你的情况,你会在推送事件中显式调用它。