【问题标题】:How can I recover my Git repository for a "missing tree" error?如何恢复我的 Git 存储库的“丢失树”错误?
【发布时间】:2011-11-06 09:29:32
【问题描述】:

我们将 Gerrit 用于我们的 Git 存储库。在一个已经活跃了几个月的项目上,我们突然无法推动任何更改。当我们执行git push 时,我们会看到以下错误:

error: unpack failed: error Missing tree 14d62f0ed4385e3f68f226ac133fa9932a9c65c9

执行git fsck --full 产生:

dangling tree 2701c92fb6eab1826482f6bcc9598413e651a92a  
dangling blob c505b3b12cfacd1e26dec8dc559820a30fc20c27  
dangling blob 8907f94b5b4ec881e1b86d50681795e368c167ff  
dangling blob 4938d9fc34c6e2f92c68872bfec6e070b2b3a9c2  
dangling blob 8a5c8b8d35484ea1470e2d8e6c482fcb97b23d0f  
dangling commit 3072d3314e20bf6c6998e1c02986d83019d3e1df  
dangling tree 5377d7f7111d340854c3ee0946667c202227e603  
dangling tree c3783e9ab540457924ceb9f9fb5ea1c2b97472b1  
dangling blob 8b92d1765038e4ec5e721f98a2aabb305a7f9819  
dangling tree 38a03153f0f18ca15846e9bd4983a86800a43a94  
dangling commit 8db2d6ae5364174bebe13720a359ddb2e62d4c9d  

我们所有的开发人员在尝试推送时都遇到了同样的错误。到目前为止,我们已经尝试重新初始化 gerrit repo (git init --bare ...) 并推动它。我们还尝试使用单独的 repo 创建一个新的 gerrit 项目。最后,我们不断收到同样的错误。

有没有人知道原因是什么,或者如何恢复?

【问题讨论】:

标签: git gerrit


【解决方案1】:

备份它...在您尝试任何操作之前立即备份它。

现在,这听起来很不幸。听起来您没有定期备份可以访问,这也很遗憾。不过,有一个好消息:我敢打赌你的开发人员有这个文件,虽然它可能在一个包文件中。在其他人的 .git 目录中尝试以下操作。 请注意,git 使用哈希的前两个字符作为目录名称。

find . -name d62f0ed4385e3f68f226ac133fa9932a9c65c9

如果出现这种情况,将该文件复制到服务器上的相同相对路径,生活应该会顺利进行。如果没有,那么试试这个:

find . -name \*.idx -exec cat {} \; | git show-index | grep 14d62f0ed4385e3f68f226ac133fa9932a9c65c9

这不会告诉你它是哪个包文件(你可以快速编写脚本或手动执行),但它会告诉你它在那里。找到合适的包文件并展开它...

git unpack-objects $FILE

从那里,将文件复制到服务器上的相同相对路径。如果这不能解决问题,则需要进一步的工作。交换开发人员的最新存储库可能会解决问题。您可能还想探索https://git.wiki.kernel.org/index.php/GitFaq#How_to_fix_a_broken_repository.3F,或发布更新 cmets 并等待我回来。

【讨论】:

  • 感谢您的信息,它帮助了我很多。我能够找到正确的 idx 文件,但解压缩包文件并没有恢复任何内容。对于我们的其他一些开发人员来说,情况也是如此。最后,我没时间了,所以我们通过初始化一个新的 repo 并保留旧的 repo 来解决这个问题。
  • 我们有一个类似的问题,由于缺少树错误,我们无法推送某些分支。我们已找到丢失的对象并将其复制到远程存储库,但问题仍然存在。有什么线索吗?
【解决方案2】:

试试git pull --rebase。

我保存了差异(git show > ~/mychanges.txt,取出文件顶部的提交消息)。签出的新分支 (git checkout -b newbranch) 应用了更改 (git apply ~/mychanges.txt),然后执行了 git pull --rebase。然后一切正常。

【讨论】:

  • 感谢您拯救我的一天!
【解决方案3】:

从技术上讲,这个答案有点晚了,但对我有用的是为我试图推送的变更集创建一个补丁,将存储库重新克隆到另一个磁盘位置,应用补丁,重新提交并推送。

【讨论】:

    【解决方案4】:

    快速解决方案是 获取 -> 变基-> 提交然后推送。

    【讨论】:

      【解决方案5】:

      如果不在 master 分支上,您可以通过以下方式简单地删除远程分支:

      git push --delete origin <branch_name>
      

      然后将你的分支推回远程:

      git push -u origin <branch_name>
      

      【讨论】:

        【解决方案6】:

        我在我的 tortiuse git 上遇到了同样的错误。我终于找到了这个错误的根本原因。

        导致此错误的步骤;

        • 在头部创建一个新分支。
        • 对新分支进行一些修改
        • 有人还对 head 分支进行了修改
        • 尝试推送你的分支

        如果创建了本地分支并且直到在头分支中进行了一些修改才推送,则会发生此错误。这是正常的事情,因为远程头分支在推送操作之前对您的本地分支一无所知。

        要解决此错误,请切换 head 分支以获得完整的 pull 操作。然后切换你的分支并尝试推送。

        【讨论】:

        • 哇,这是一个完全不明显的原因。这个解决方案对我有用!
        【解决方案7】:

        使用git push --no-thin 代替git push。

        来自 Git 文档:

        当发送者和接收者共享许多相同的对象时,精简传输会显着减少发送的数据量。默认为--thin。

        【讨论】:

        • 如果您的分支领先于许多提交,您可能需要使用此选项。效果很好!
        【解决方案8】:

        当我们得到这个时,我几乎总是可以用 git gc 修复它:

        git gc --aggressive --prune=now
        

        先备份你的 git 仓库!

        【讨论】:

          【解决方案9】:

          这通常发生在提交时间和推送时间不同的情况下,这最终会在两棵树之间造成不匹配。给定一个远程分支 upstream 和本地分支 foo

          首先使用丢弃所有未提交的更改

          git reset --hard foo
          

          然后使用跟踪远程分支

          git branch --set-upstream-to=upstream/foo
          

          最后

          git pull
          

          【讨论】:

            【解决方案10】:

            我遇到了同样的问题。为了解决这个问题,我使用了 git fetch 然后我再次推送,它工作得很好。

            【讨论】:

            • 为我工作。谢谢!!
            【解决方案11】:

            我删除了我的主分支并再次创建。它的工作。 git 分支 -D 大师, git结账大师 幸运的是它工作

            【讨论】:

              【解决方案12】:

              在我的情况下,我忘记在 git rebase -i origin/master 之前执行 git fetch。因此,当我尝试推送到 gerrit 时,出现上述错误。

              【讨论】:

                【解决方案13】:

                很奇怪,--no-thin 参数对我不起作用。有效的是git pull(所以可能是git fetch。

                【讨论】:

                  【解决方案14】:

                  尝试先做

                  git gc

                  然后做

                  git 推送

                  遇到同样的问题。上述解决方案对我有用。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-10-30
                    • 2010-12-05
                    • 2019-11-13
                    • 2012-11-11
                    • 2019-06-15
                    • 2016-06-15
                    相关资源
                    最近更新 更多