【发布时间】:2018-07-13 07:59:50
【问题描述】:
当我们尝试推送补丁时,我们收到以下错误:
错误:未能将一些引用推送到 '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 commit 的引用,它实际上是通过 gerrit 放弃的,但没有反映在 Git 中。
我们仍然可以在 platform/frameworks/base.git/info/refs
中看到引用eec90465656f3426cd5a45e5333cec90f07982c1 refs/changes/68/1968/1
所以第一个问题是,如果我们放弃任何补丁,该条目是否仍然存在于 refs 文件夹中,是否有任何文件列出了已放弃的补丁?
我认为这是特定项目无法同步的原因,我们无法推送新的更改。
git pull 和 git checkout,指向最后一个通过 Gerrit 成功合并的提交补丁。
我尝试使用git push -f origin HEAD:refs/for/8939_ferrari_main进行强制推送,显示补丁推送成功,可以在frameworks/base中看到它的入口.git/info/refs
cdd319b12cc422541b101e25470317ca28ddf6bc
refs/for/8939_ferrari_main
但它没有在 gerrit 中列出。 有什么办法可以从 git bare repo 中删除这个补丁,因为它没有在 Gerrit 中列出。
如果可以共享任何指针来解决问题,将不胜感激。
编辑
有没有办法将 git 裸仓库重置为任何特定标签?
【问题讨论】:
-
放弃的更改不是原因。 Gerrit 会永久保留已放弃的更改和引用,例如
refs/changes/68/1968/1,因为 Gerrit 允许“恢复”已放弃的更改。如果一个分支foo已经被git push -f更新了,那么新的提交肯定不会被review。git push -f表示直接推送,不会为新提交创建 Gerrit 条目。只有“git push origin foo:**refs/for/foo**”推送的提交可以被审查并有 Gerrit 条目。 -
抱歉混淆了用于推送的命令是:git push -f origin HEAD:refs/for/8939_ferrari_main。通过使用此命令,repo sync 仍然无法将代码与最新补丁同步。
-
从错误我猜本地分支在远程分支后面。可能没有新的本地提交。试试
git fetch origin 8939_ferrari_main && git log FETCH_HEAD...HEAD看看是否打印了任何提交。如果没有,则不必推送本地分支,因为远程分支具有本地分支的每个提交。 -
感谢 Elpiekay,命令 git fetch origin 8939_ferrari_main && git log FETCH_HEAD...HEAD 的输出没有显示任何内容。但我正在尝试推送一个新的提交,即使我们遇到了同样的快进错误
-
假设新的提交是 xxxxxx。命令
git fetch origin 8939_ferrari_main && git merge-base xxxxxx FETCH_HEAD打印什么?如果是对的 xxxxxx,那么对远程 8939_ferrari_main 来说就不是“新”了。