如何禁止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]配置块,新增如下参数:
该参数允许不同submodule对应不同Gerrit项目时,相同Change-Id不会被识别为同一变更,避免跨项目关联更新。allowSameChangeIdInDifferentProjects = true - 如果两个submodule归属同一个Gerrit项目的不同路径,找到
[receive]配置块,新增如下参数:
避免同项目不同分支的相同Change-Id被误识别为同一变更。enableSameChangeIdForDifferentBranches = true
2. 本地开发操作规范(团队2侧)
- cherrypick未合并的submodule变更时,添加
--no-commit参数,手动完成代码合并后重新提交,提交前删除提交信息中原有的Change-Id行:
只要你本地配置了Gerrit官方的git cherry-pick --no-commit <submodule1的233421变更对应的commit hash> # 确认代码合并无冲突后执行提交 git commitcommit-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
相关产品推荐
相关产品推荐

