git - 在某些条件下使用钩子(Hook)自动将一个分支 merge 到另一个基础上?

标签 git github gitlab githooks

我的 github 存储库中有两个分支 - masterdev分支。我有一个需要 merge 的需求master分支到 dev在以下条件下分支:

  • 一旦 PR 直接 merge 到 master 分支,我需要自动将 master 分支 merge 回 dev 分支。
  • 每当有人直接向主分支添加提交时,我需要 merge master分支回 dev自动分支。

  • 这有可能做到吗?我相信我们可以使用 git Hooks 完成这项工作,但我不知道该怎么做。有人可以提供一个如何实现这一目标的例子吗?
    我在网上看了一下,好像可以用post-receive与下面的内容 Hook ,但只有当有人向 master 添加提交时,我才对如何执行此操作感到困惑分支或任何 PR merge 到主分支?这也是正确的方法吗?
      git checkout master
      git pull
    
      git checkout dev
      git pull
    
      git merge master --no-ff --no-edit
      git push
    
    我明白,由于 merge 冲突,它可能并不总是可能的,但如果可能的话,我们希望它自动发生。
    更新
    阅读更多关于 Github Actions 的信息后- 我创建了这样的文件.github/workflows/merge-back-to-dev.yml在我的 git 存储库的根文件夹中,内容如下。这看起来对吗?我是否需要所有这些字段,例如 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 merge 到 master直接分支然后master分支会自动 merge 到dev分支对吗?

    最佳答案

    对于私有(private) GHE (GitHub Enterprise) 服务器,仅 pre-receive hooks受支持,这不是您需要的(接收后 Hook 会很好)
    由于 OP 也有 GitLab 服务器,因此 gitab-ci.yml可以做到这一点并执行 merge 。
    有点像 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 时)
    那不会使用钩子(Hook),而是 GitHub Actions ,这有助于自动化在 GitHub 端执行的过程(与在客户端执行的钩子(Hook)相反)
    您可以使用 on.<push|pull_request>.<branches|tags> 进入您的.github/workflows/myscript.yml (您可以用更夸张的名称替换“myscript”,例如 merge-back-to-dev.yml )
    您可以使用 nightly-merge 之类的操作,它会自动将稳定分支( mastermain ) merge 到开发分支中。除了你的情况,你会在推送事件上明确调用它。

    关于git - 在某些条件下使用钩子(Hook)自动将一个分支 merge 到另一个基础上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64759535/

    相关文章:

    gitlab - Gitlab CI 中的 `when:manual` 和 `only:web` 有什么区别?

    git - 使用 http 客户端直接从 gitolite 托管的 git 存储库访问文件

    git - Windows 上的 Git 目前存在哪些问题

    Github:权限被拒绝(公钥)但我得到 "You' 已成功通过身份验证”消息

    git - 在 bitbucket 上使用 git 部署到 Heroku

    docker - GitLab CD工作流将Docker应用程序部署到登台和生产中

    git - 使用 Git/Github 部署

    xcode - 如何让 Xcode 记住我的私有(private) git 存储库密码?

    javascript - 注销 npm 的 GitHub Packages

    continuous-integration - 我可以从 Gitlab 中的未解决问题创建功能分支吗?