如何在Gerrit上重写历史记录?

5
Gerrit不小心引入了一些合并提交(配置为“必要时合并”选项),我想从历史记录中将它们删除。虽然我们使用Git进行团队协作,但在这种情况下,开发人员不会受到影响,因为他们在本地没有更改任何内容。
我在本地运行git rebase -i并且Git自动删除了Gerrit的合并提交。我仔细删除了每个提交消息中以前的Gerrit Change-Ids,并且Gerrit提交消息挂钩添加了新的Change-Ids。 git status命令输出:
On branch master Your branch and 'origin/master' have diverged, and have 7 and 9 different commits each, respectively. (use "git pull" to merge the remote branch into yours) nothing to commit, working directory clean
这正是我想要的(9个提交减去2个合并提交)。
当我尝试使用git push origin HEAD:refs/for/master推送到Gerrit时,没有错误。但是当我尝试在Gerrit Web界面上审查和提交时,我会收到以下错误:
The change could not be merged due to a path conflict. Please rebase the change locally and upload the rebased commit for review.
我做错了什么?
1个回答

5
当重写历史时,您不应该推动审核(不要推送到refs/for/*)。您需要直接推送到原始存储库(refs/heads/*)。这意味着您需要绕过Gerrit中的审核权限。我建议您暂时赋予自己权限,并在完成后删除它们,以免将来意外绕过审核。
您还需要使用-f标志运行git push命令,以告诉git重写历史。

谢谢您的回复,但是当我执行以下命令时:"git push -f origin HEAD:refs/heads/master",我收到了错误提示:! [remote rejected] HEAD -> master (non-fast forward) error: failed to push some refs to 'ssh://repositories:29418/repository'。我在refs/heads/*上拥有以下权限:创建引用/推送/提交。我需要更多的权限吗? - Romain Hautefeuille
是的,但权限名称取决于您使用的 Gerrit 版本。请参见 http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/access-control.html#category_push - 直接推送:强制选项允许删除现有分支。由于强制推送实际上是立即执行删除然后创建操作,但在服务器上以原子方式记录,因此该选项还允许对分支进行强制推送更新。启用此选项允许从项目历史记录中丢弃现有提交。 - Brad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接