补丁未被推送到Gerrit。

5
在尝试推送补丁时,我们遇到了以下错误:
错误:无法将一些引用推送到'ssh:// git_bare_repo @ 10.20.88.250 / home / ferrari_users / git_bare_repo / android_m / hlos / platform / frameworks / base' 提示:因为推送的分支提示:分支提示被拒绝更新滞后于其远程对应项。在再次推送之前,检查此分支并集成远程变更提示:(例如,“git pull ...”)提示: 有关详细信息,请参见'git push --help'中的“有关快进的注释”。
当我调试时,我发现了一个gerrit提交的引用,实际上是通过gerrit放弃的,但在Git中没有反映出来。
我们仍然可以在platform/frameworks/base.git/info/refs中看到一个引用
问题是如果我们放弃任何补丁,是否仍会在引用文件夹中保留条目,并且是否有列出放弃的补丁的文件? 我认为这就是特定项目无法同步并且我们无法推送新更改的原因。
Git pull和git checkout指向已通过Gerrit成功合并的最后提交补丁。
我尝试使用git push -f origin HEAD:refs / for / 8939_ferrari_main进行强制推送。它显示补丁推送成功,并且可以在frameworks/base.git/info/refs中看到其条目
但是它没有在gerrit中列出。 是否有删除git裸存储库中此补丁的方法,因为它未在Gerrit中列出? 如果可以分享任何指针以解决此问题,将不胜感激。
编辑 是否有将git裸存储库重置为任何特定标记的方法?

1
被废弃的更改不是原因。 Gerrit 永久保留被废弃的更改和引用,例如 refs/changes/68/1968/1,因为 Gerrit 允许“恢复”被废弃的更改。如果使用 git push -f 更新了分支 foo,则新提交肯定未经审核。git push -f 表示直接推送,不会为新提交创建 Gerrit 条目。只有通过“git push origin foo:refs/for/foo”推送的提交才能进行审核并具有 Gerrit 条目。 - ElpieKay
抱歉造成困惑,用于推送的命令是:git push -f origin HEAD:refs/for/8939_ferrari_main。使用此命令后,仓库同步仍无法将代码与最新补丁同步。 - Anshul
1
从错误信息来看,我猜测本地分支落后于远程分支。可能没有新的本地提交。尝试运行 git fetch origin 8939_ferrari_main && git log FETCH_HEAD...HEAD 命令,查看是否有任何提交被打印出来。如果没有,则不需要推送本地分支,因为远程分支已经包含了本地分支的所有提交。 - ElpieKay
谢谢Elpiekay,命令git fetch origin 8939_ferrari_main && git log FETCH_HEAD...HEAD的输出为空。但是我正在尝试推送一个新的提交,即使这样我们仍然得到了快进错误的相同错误。 - Anshul
假设新提交是xxxxxx。命令git fetch origin 8939_ferrari_main && git merge-base xxxxxx FETCH_HEAD会打印什么?如果它是正确的xxxxxx,那么它对于远程的8939_ferrari_main来说并不是“新的”。 - ElpieKay
显示剩余2条评论
1个回答

0

要将裸仓库重置为特定的标签,您需要在refs/heads/BRANCH上拥有force push访问权限。

警告:这将使您失去标签之后所做的提交!

git clone <REPO>
git checkout master
git reset --hard <TAG>
git push --force origin HEAD:refs/heads/master

谢谢,我已经尝试过了,但是没有用。我最大的担忧是补丁没有被路由到 Gerrit,尽管代码库的裸仓库中有条目。 - Anshul
@Anshul 如果你在 Gerrit 上找不到已合并到裸仓库的提交所做的更改,这意味着当推送时你没有使用魔法引用 refs/for/BRANCHrefs/drafts/BRANCH。如果你对 refs/heads/* 有写入权限,你实际上可以绕过 Gerrit 直接向裸仓库推送。 - Ezwig

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