You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁止Gerrit提交时自动更新cherrypick的未合并父提交补丁集

Gerrit多submodule协作避免cherrypick源补丁被意外更新方案

问题根因

Gerrit识别变更的核心依据是提交信息中的Change-Id字段。你在cherrypick submodule 1的233421变更时,原提交的Change-Id也被完整复制到了本地提交中,推送时如果该提交被同步推送到submodule 1对应的Gerrit项目,Gerrit匹配到相同Change-Id就会自动给原有233421变更生成新的补丁集,而非生成独立变更。


具体配置&操作方案

1. Gerrit服务端配置调整

  • 打开Gerrit安装目录下的配置文件gerrit.config,找到[change]配置块,新增如下参数:
    allowSameChangeIdInDifferentProjects = true
    
    该参数允许不同submodule对应不同Gerrit项目时,相同Change-Id不会被识别为同一变更,避免跨项目关联更新。
  • 如果两个submodule归属同一个Gerrit项目的不同路径,找到[receive]配置块,新增如下参数:
    enableSameChangeIdForDifferentBranches = true
    
    避免同项目不同分支的相同Change-Id被误识别为同一变更。

2. 本地开发操作规范(团队2侧)

  • cherrypick未合并的submodule变更时,添加--no-commit参数,手动完成代码合并后重新提交,提交前删除提交信息中原有的Change-Id行:
    git cherry-pick --no-commit <submodule1的233421变更对应的commit hash>
    # 确认代码合并无冲突后执行提交
    git commit
    
    只要你本地配置了Gerrit官方的commit-msg钩子,提交时会自动生成全新的Change-Id,不会和原变更关联。
  • 推送代码时仅推送submodule 2目录下的变更,不要在父项目根目录全量推送:
    cd <submodule2的本地目录>
    git push origin HEAD:refs/for/<目标分支名>
    

3. 团队协作规则补充

  • 未进入合并状态的submodule变更被其他团队依赖时,优先采用父项目submodule指针指向对应commit hash的方式引入,不要直接cherrypick变更到本地分支开发,从根源避免提交污染。
  • 如果必须cherrypick未合并变更,所有开发人员提交代码前必须检查提交信息中的Change-Id是否为新生成的,确认没有复用其他未合并变更的Change-Id。

内容的提问来源于stack exchange,提问作者user3243499

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:24:03