使用钩子在某些条件下自动将一个分支合并到另一个分支?

Automatically merge one branch into another basis on some conditions using hook?

我的 github 存储库中有两个分支 - masterdev 分支。我有一个要求,我需要在以下条件下将 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 这样的操作,它会自动将稳定分支(mastermain)合并到开发分支中。除了你的情况,你会在推送事件中显式调用它。