【问题标题】:git unpack error on push to gerrit推送到 gerrit 时出现 git 解包错误
【发布时间】:2013-05-11 07:11:22
【问题描述】:

在将新分支推送到 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

伙计们:有什么想法吗?

【问题讨论】:

标签: git push gerrit unpack


【解决方案1】:

你使用的是 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 中解决了,但是还找不到哪个版本。

【讨论】:

  • 这是正确的答案:降级 git 以解决 gerrit 服务器问题。
  • 相应的 Gerrit 问题报告为 herehere
  • 这发生在我尝试将新补丁集推送到现有审查时,其中唯一的更改是提交消息中。对其中一个文件进行小幅更改并推送,这对我来说是一种成功的解决方法
【解决方案2】:

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

在经历了大约 5 分钟的挫折之后,我决定只切换到我尝试推送到的分支的本地版本,然后我做了一个拉取操作。之后,我的推送又开始起作用了,但我不明白为什么。

【讨论】:

    【解决方案3】:

    我也遇到了这个错误。

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

    我的推送被拒绝,并显示与您发布的相同错误消息。

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

    我确实对文件做了一个字符的更改,添加了文件,再次修改了提交,然后推送,推送成功了。

    我正在使用 git == 1.8.4.2

    【讨论】:

    • +1。 AFAIK 发生解包错误,因为 git 是“愚蠢的”,并且在文件系统更改的情况下工作 99%。如果没有,则 git 不会将任何内容推送到远程服务器(与您也不能推送空目录的原因相同)。这让 gerrit 吐槽了。
    • +1000。同样的问题,但是在执行 git revert 时...我在提交中添加了额外的更改,修改了提交并且推送成功!
    • Gerrit 会根据这个 issue 发布 bug 修复吗?
    【解决方案4】:

    我的情况

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

    首先,我在 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 在所有打开的补丁集中搜索这个项目 neutron:

    1974  master  Add two interfaces for manipulate forwarding individually
    

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

    613fd2557fba30aff2dbd51c3807cc57561bab08 cannot  found
    

    啊哈,就是这个原因!

    但是为什么这个对象不见了?

    原因是我的同事告诉我 neutron 项目将使用新的 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;
    

    【讨论】:

    • 太棒了。就我而言,我只是用update changes set open='N',status='A' where open='Y'; 放弃了所有未完成的更改。
    【解决方案5】:

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

    git remote add gerrit GERRIT_GIT_PROJECT_URL
    git fetch gerrit
    And then upload again.
    

    【讨论】:

    • 这对我也有用......但我很困惑这如何让这个问题消失......
    【解决方案6】:

    使用--no-thin 参数推送对我来说是一种解决方法:

    git push --no-thin omnigerrit HEAD:refs/for/android-4.4
    

    【讨论】:

    • 嗯,一个新的优化导致 git 通过网络发送尽可能少的数据导致这个错误出现,所以我的猜测是 --no-thin 只是关闭了这些优化。来自 git push --help:“当发送方和接收方共享许多相同的对象时,精简传输会显着减少发送的数据量。” (--thin 是默认值)。
    • 我怎样才能做到“+2”?这对我有用,然后我注意到我之前已经在这里做了“+1”...
    • 之所以有效,是因为空的更改(即:仅更改日志更改)不会传输任何数据,并且某些服务器正在消耗一些数据。因此他们以“解包错误”作为响应。
    • @shapiroyaacov 您可以点击 Gerrit 上的“回复”按钮并使用 +2。 (答案晚了一年):D
    【解决方案7】:

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

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

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

    【讨论】:

    • 这基本上对我有用。我跳过了一步:我没有切换到不同的分支,而是使用了命令:git pull --rebase=preserve。在那之后,我可以毫无问题地推动。
    【解决方案8】:

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

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

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

    【讨论】:

      【解决方案9】:

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

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

      【讨论】:

        【解决方案10】:

        在我的情况下,我只需要在尝试推送之前使用 master HEAD 进行 rebase。

        【讨论】:

        • 这是解决此问题的最简单方法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 2016-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-12
        • 2011-10-28
        相关资源
        最近更新 更多