如何通过GitLab CI/CD合并分支?执行合并、切换分支命令报错如何解决?
报错根因
- GitLab CI Runner执行任务时默认开启浅克隆策略,
GIT_DEPTH默认值为50,仅拉取当前触发Pipeline的分支的最近50条提交记录,不会拉取仓库所有分支的本地跟踪引用,也不会同步全量远程分支数据 - 执行
git merge cicd报错是因为本地不存在cicd分支的本地引用,只有远程仓库的origin/cicd引用,Git无法识别本地合并目标 - 执行
git checkout master报错同理,本地未拉取master分支的任何数据,Git无法匹配到对应的分支路径
修复方案
你可以按照以下配置调整CI文件,即可实现自动合并分支的需求:
# 全局变量配置,也可以放在job内部只对单任务生效 variables: # 关闭浅克隆,拉取完整提交历史,避免跨分支合并找不到提交记录 GIT_DEPTH: 0 # 每次任务重新克隆仓库,避免本地缓存导致的分支数据过时 GIT_STRATEGY: clone job1: stage: build script: # 配置Git提交用户信息,合并操作需要用到用户标识 - git config user.name "GitLab CI Auto Merge" - git config user.email "ci-runner@your-domain.com" # 拉取所有远程分支的最新数据 - git fetch --all # 创建本地master分支并跟踪远程master分支,切换到master - git checkout -b master --track origin/master # 合并远程cicd分支的最新代码 - git merge origin/cicd # (可选)如果需要将合并结果推回远程仓库,加上以下命令,注意要提前配置推送权限 # - git push https://oauth2:${CI_PUSH_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git master tags: - cicd
如果需要将合并后的代码推回远程仓库,需要额外配置推送权限:
- 进入项目
设置→访问令牌页面,创建一个拥有write_repository权限的访问令牌 - 进入项目
设置→CI/CD→变量页面,新增名为CI_PUSH_TOKEN的变量,值为刚才创建的访问令牌,勾选隐藏变量选项保存即可
注意事项
- 如果两个分支存在代码冲突,合并操作会直接失败,建议提前处理冲突,或者在脚本中增加冲突处理逻辑
- 不需要全量克隆的场景可以根据两个分支的提交差值调整
GIT_DEPTH的数值,只要大于两个分支的差异提交数即可正常合并
内容的提问来源于stack exchange,提问作者YuSheng
相关产品推荐
相关产品推荐

