61

在将新分支推送到 gerrit 服务器时,我们遇到以下错误:

de@roma:~/git-hate/www$ git push origin landingpage
Counting objects: 149, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (73/73), done.
Writing objects: 100% (111/111), 2.77 MiB, done.
Total 111 (delta 68), reused 80 (delta 38)
remote: Resolving deltas: 100% (68/68)
error: unpack failed: error Missing tree 30c4809ade0b4b0c81cb7f882450774862b82361
fatal: Unpack error, check server log
To ssh://user@git-server/repository
 ! [remote rejected] landingpage -> landingpage (n/a (unpacker error))
error: failed to push some refs to 'ssh://user@git-server/repository'

我们尝试手动将提到的树对象复制到远程 git,但没有成功。

在 gerrit 方面,我们得到一个堆栈跟踪:

[2013-05-16 13:43:42,753] ERROR com.google.gerrit.sshd.BaseCommand : Internal server error (user de account 1000000) during git-receive-pack '/repository'
com.google.gerrit.sshd.BaseCommand$Failure: fatal: Unpack error, check server log
        at com.google.gerrit.sshd.commands.Receive.runImpl(Receive.java:157)
        at com.google.gerrit.sshd.AbstractGitCommand.service(AbstractGitCommand.java:106)
        at com.google.gerrit.sshd.AbstractGitCommand.access$000(AbstractGitCommand.java:34)
        at com.google.gerrit.sshd.AbstractGitCommand$1.run(AbstractGitCommand.java:72)
        at com.google.gerrit.sshd.BaseCommand$TaskThunk.run(BaseCommand.java:430)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
        at java.util.concurrent.FutureTask.run(FutureTask.java:166)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:165)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:266)
        at com.google.gerrit.server.git.WorkQueue$Task.run(WorkQueue.java:337)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:636)
Caused by: java.io.IOException: Unpack error on project "repository":
  AdvertiseRefsHook: org.eclipse.jgit.transport.AdvertiseRefsHookChain@7047125class org.eclipse.jgit.transport.AdvertiseRefsHookChain

        at com.google.gerrit.sshd.commands.Receive.runImpl(Receive.java:156)
        ... 13 more
Caused by: org.eclipse.jgit.errors.UnpackException: Exception while parsing pack stream
        at org.eclipse.jgit.transport.ReceivePack.service(ReceivePack.java:202)
        at org.eclipse.jgit.transport.ReceivePack.receive(ReceivePack.java:142)
        at com.google.gerrit.sshd.commands.Receive.runImpl(Receive.java:98)
        ... 13 more
Caused by: org.eclipse.jgit.errors.MissingObjectException: Missing tree 30c4809ade0b4b0c81cb7f882450774862b82361
        at org.eclipse.jgit.transport.BaseReceivePack.checkConnectivity(BaseReceivePack.java:996)
        at org.eclipse.jgit.transport.BaseReceivePack.receivePackAndCheckConnectivity(BaseReceivePack.java:756)
        at org.eclipse.jgit.transport.ReceivePack.service(ReceivePack.java:167)
        ... 15 more

伙计们:有什么想法吗?

4

10 回答 10

107

推论--no-thin对我来说是一种解决方法:

git push --no-thin omnigerrit HEAD:refs/for/android-4.4
于 2014-05-12T13:51:51.193 回答
13

你在使用 git > 1.8.4.2 吗?

我发现 git 1.8.4.3+ 和 gerrit 2.6 之间不兼容,因为 https://github.com/git/git/commit/fbd4a7036dfa71ec89e7c441cef1ac9aaa59a315

通过这个增强,如果 git 发现树 sha1 已经存在于服务器中,它不会再次发送它,但 gerrit 想在上传的包中搜索与提交 sha1 关联的树 sha1。

看起来我无法用 gerrit 2.8-rc3 重现它,而不是最新版本的 scm-manager。我想说这已经在 jgit 中解决了,但是还找不到哪个版本。

于 2013-12-02T13:48:49.253 回答
11

我的情况

我也遇到了这个问题,解决这个问题需要很长时间。

首先,我在 gerrit 日志中注意到一个错误信息:

Internal server error (user newptone account 1) during git-receive-pack                           '/neutron.git' 
com.google.gerrit.sshd.BaseCommand$Failure: fatal: Unpack error,   check server log
......
... Missing unknown 613fd2557fba30aff2dbd51c3807cc57561bab08

什么是 613fd2557fba30aff2dbd51c3807cc57561bab08 对象?

然后我使用 git review -l 搜索这个项目中子的所有打开的补丁集:

1974  master  Add two interfaces for manipulate forwarding individually

然后我通过搜索在 gerrit 仪表板中找到了这个补丁集,我点击了链接,它似乎是错误的:

613fd2557fba30aff2dbd51c3807cc57561bab08 cannot  found

啊哈,就是这个原因!

但是为什么这个物体不见了?

原因是我的同事告诉我 neutron 项目将使用新的 repo 来替换旧的 repo,我删除了旧的 repo 但没有关闭 gerrit 中所有打开的补丁集。打开的补丁集将在 gerrit 仪表板中消失,但它仍然存在于 gerrit 数据库中。

如何解决

登录你的reviewdb sql,找到这条记录:

首先,确保这是我们要修改的:

select * from changes where change_id=1974\G;

然后更新这条记录:

update changes set open='N',status='A' where change_id=1974;
于 2014-01-22T02:18:48.927 回答
8

我刚刚也遇到了这个错误。

对于我的场景,我试图推送一个修改过的提交,其中自上次推送相同的提交以来没有任何文件发生更改。我实际上刚刚修改了更改的提交消息,并尝试再次推送。作为提交的一部分,没有文件更改。

我的推送被您发布的相同错误消息拒绝。

Gerrit 似乎不喜欢除了修改后的提交消息之外没有任何更改的推送。

我从字面上对文件进行了一个字符更改,添加了文件,再次修改了提交,然后推送,推送成功了。

我正在使用 git == 1.8.4.2

于 2013-12-12T14:54:50.757 回答
8

我今天遇到了这个问题并尝试了所有建议。最后解决方案非常简单:

  1. 切换到另一个分支(例如开发)。
  2. 从远程仓库拉取
  3. 切换回您的新分支并推送。

运气好的话,它现在可以工作了。

于 2015-12-02T10:56:09.383 回答
2

我刚刚遇到这个问题,我的情况是:有人 git init 并将一个全新的分支(也就是说,这个分​​支与 gerrit 中的 origin git 中的任何修订无关)推送到 gerrit 中的 git 项目. 我尝试了很多方法,但都失败了。最后,我受到@obuseme 答案的启发,请遵循并修复:

git remote add gerrit GERRIT_GIT_PROJECT_URL
git fetch gerrit
And then upload again.
于 2014-02-24T08:12:21.597 回答
2

我今天遇到了这个问题,我没有使用 git > 1.8.4.2。我在 Gerrit 2.7 上。

在经历了大约 5 分钟的挫折之后,我决定只切换到我试图推送到的分支的本地版本,然后我做了一个 pull。在那之后,我的推送再次开始工作,但我不明白为什么。

于 2013-12-05T23:49:41.433 回答
1

就我而言,我只需要在尝试推送之前使用 master HEAD 进行 rebase。

于 2020-06-04T20:14:23.910 回答
0

当您收到解包错误时,您可能还需要查找此行: remote: error: unable to create temporary file: No space left on device

删除几个旧的备份文件释放了足够的空间让它再次工作。

于 2019-08-14T21:59:39.023 回答
0

我通过重新克隆存储库并从旧存储库复制我的更改来解决此问题。

其他解决方案对我不起作用,除了我没有尝试 obrienks。

我尝试使用 git 2.6.1 和 JGit 4.6.1,我使用 Gerrit 2.13.1。

于 2017-04-06T16:25:35.603 回答