Gerrit搭配Jenkins时远程分支合并变更后不再更新如何解决
问题根因
两个异常现象是同一原因导致:你日常使用的git push origin HEAD:refs/for/branch_name是Gerrit代码评审的专用推送命令,不会将提交直接推到远程正式分支的引用refs/heads/branch_name上,仅会把提交上传到Gerrit的临时评审引用区,等待评审通过后才会合入正式分支。
- 本地执行
git status提示Your branch is ahead of 'origin/branch_name' by 2 commits,是因为你本地的2个提交从未被推送到远程正式分支,本地分支头指针比远程正式分支的头指针超前2个提交,属于完全符合预期的提示。 - Jenkins任务默认配置是拉取远程正式分支
branch_name的代码,也就是拉取refs/heads/branch_name指向的、已经完成合入的旧提交,自然无法获取你推到评审临时区的新变更,无论你怎么推评审提交,构建都会用旧的合入版本。
可落地方案
根据你是否需要保留Gerrit评审流程二选一即可:
方案1:保留评审流程,调整Jenkins拉取逻辑
如果团队要求必须走评审、不允许直接推送正式分支,修改Jenkins任务配置即可:
- 安装Gerrit Trigger插件,配置评审提交触发规则,当你推送
refs/for/branch_name下的评审提交时,Jenkins会自动拉取对应评审版本的代码执行构建,不需要等合入正式分支。 - 临时测试单个提交时,可以直接在Jenkins任务的构建参数里填入要测试的commit哈希,手动指定拉取对应提交构建,不用修改分支配置。
方案2:测试分支跳过评审,直接推送正式分支
如果这个分支是你专属的测试分支,不需要走评审流程,不要带refs/for/前缀推送,直接执行命令:git push origin HEAD:branch_name
执行后本地提交会直接更新远程正式分支的头指针,git status的超前提示会消失,Jenkins拉取正式分支时就能拿到最新代码。
注意:该操作会跳过Gerrit评审流程直接修改正式分支内容,执行前确认你有该分支的直接推送权限,且操作符合团队分支管理规范。
内容的提问来源于stack exchange,提问作者HollowDev
相关产品推荐
相关产品推荐

