【问题标题】:patch not getting pushed to gerrit补丁没有被推送到 gerrit
【发布时间】: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 来说就不是“新”了。

标签: git gerrit


【解决方案1】:

要将裸仓库重置为某个 TAG ,您需要在 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 如果您无法在 gerrit 上找到合并到裸仓库中的提交的更改,这意味着,在推送时您没有使用魔术引用 refs/for/BRANCHrefs/drafts/BRANCH推送时,如果你写在refs/heads/* and push directly to the bare repo上,你实际上可以绕过gerrit
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多