推送新Commit至Gerrit时指向已关闭旧变更的问题求助
针对你遇到的「新Commit Change ID不同,但推送仍关联已关闭旧变更」的问题,给你几个实际可行的排查和解决方向:
检查推送命令的目标引用
确认你执行的推送命令是明确推送到refs/for/master,而不是误写成了旧变更的特定引用(比如refs/changes/12/3456/2这种格式)。如果之前用过针对旧变更的推送命令,可能不小心复用了错误的目标。可以尝试用完整的指定Commit的命令推送:git push origin <你的新Commit哈希>:refs/for/master检查本地分支的上游配置
执行git branch -vv查看当前分支的上游设置,确认上游不是关联到旧变更的Gerrit引用,而是正常的origin/master或者refs/for/master。如果上游配置错误,执行以下命令重置:git branch --set-upstream-to=origin/master <你的本地分支名>检查Commit消息的完整性
查看新Commit的消息,确认里面只包含当前Commit的Change ID,没有不小心混入旧变更的Change ID、变更编号或者相关关联关键字(比如Depends-On、Related-To)。Gerrit会识别这些关键字自动关联变更,哪怕Change ID不同也可能触发错误关联。可以用git commit --amend修改Commit消息,去掉无关内容后重新推送。重置本地Gerrit相关配置
检查本地git配置里有没有自定义的Gerrit推送规则,比如push.default或者remote.origin.push的设置。执行git config --list | grep -E "(push|gerrit)"查看相关配置,如果有异常的推送默认值,用git config --unset移除,比如:git config --unset remote.origin.push清理本地Gerrit缓存
有时候Gerrit的本地缓存可能导致异常关联,执行以下命令清理:git fetch origin --prune git reflog expire --expire=now --all git gc --prune=now
如果以上方法都无效,可以尝试创建一个全新的本地分支,从origin/master拉取最新代码,然后把当前的变更 cherry-pick 到新分支上,重新生成Commit和Change ID,再推送试试。
内容的提问来源于stack exchange,提问作者andre

