【问题标题】:How do I deal with corrupted Git object files?如何处理损坏的 Git 对象文件?
【发布时间】:2010-11-06 03:20:28
【问题描述】:

我在接近配额时执行了 Git 拉取操作,结果(我认为)得到了一个损坏的文件:

$ git pull
walk dffbfa18916a9db95ef8fafc6d7d769c29a445aa
fatal: object d4a0e7599494bfee2b5351113895b43c351496b3 is corrupted

$ git fsck --full
bad sha1 file: .git/objects/66/b55c76947b1d38983e0944f1e6388c86f07a1b.temp
fatal: object d4a0e7599494bfee2b5351113895b43c351496b3 is corrupted

$ git cat-file -t d4a0e7599494bfee2b5351113895b43c351496b3
error: unable to find d4a0e7599494bfee2b5351113895b43c351496b3
fatal: git cat-file d4a0e7599494bfee2b5351113895b43c351496b3: bad file

我该如何解决这种损坏?

.git/objects/66/b55c76947b1d38983e0944f1e6388c86f07a1b.temp 为零字节;删除它并没有解决我的问题(同样的错误)。

【问题讨论】:

  • 内容必须与文件名相加。没有办法根据哈希恢复内容,所以除非 git 为这种确切情况内置了某种冗余(我不能说它没有)我会说你需要重新获取或克隆再次远程。
  • 您说您已将其删除 - 之后您是否尝试再次拉取?一个零大小的临时对象有点中止传输的味道......
  • find . -name d4a0e7599494bfee2b5351113895b43c351496b3 的输出什么都没有。删除 sha1 文件然后拉取只会导致生成空的 sha1 文件。
  • 还有$ git cat-file -t d4a0e7599494bfee2b5351113895b43c351496b3's 输出为:error: unable to find d4a0e7599494bfee2b5351113895b43c351496b3 fatal: git cat-file d4a0e7599494bfee2b5351113895b43c351496b3: bad file
  • 这不是该对象的存储位置。应该是.git/objects/d4/a0e7599...。您可以尝试备份并删除 那个 对象(并删除任何关联的临时文件)并再次拉取。

标签: git


【解决方案1】:

您可以使用“查找”来删除/objects目录中大小为0的所有文件,命令如下:

find .git/objects/ -size 0 -delete

建议备份

【讨论】:

  • 嗯,这有帮助,在挂起后我有几个对象是空的,删除它们允许我从远程仓库获取真实对象。幸运的是,我在暂停前确实推动了。但是要查看我尚未提交的文件的情况,希望它们在挂起之前已同步到磁盘。警告,如果需要进一步检查,最好保存您删除的哈希值。
【解决方案2】:

一般来说,修复损坏的对象可能非常困难。但是,在这种情况下,我们确信问题是传输中止,这意味着对象位于远程存储库中,因此我们应该能够安全地删除我们的副本并让 git 从远程获取它,这一次是正确的.

大小为零的临时目标文件显然可以被删除。这对我们没有任何好处。引用它的损坏对象d4a0e75... 是我们真正的问题。它可以在.git/objects/d4/a0e75... 中找到。正如我上面所说,删除它是安全的,但以防万一,请先备份它。

此时,一个新的git pull 应该会成功。

...假设它首先会成功。在这种情况下,似乎某些本地修改阻止了尝试的合并,因此stashpullstash pop 是有序的。但是,任何合并都可能发生这种情况,并且与损坏的对象没有任何关系。 (除非有一些必要的索引清理,并且存储在这个过程中这样做了......但我不这么认为。)

【讨论】:

  • 这可能会导致error: refs/heads/branch does not point to a valid object!。请务必备份。
【解决方案3】:

Recovering from Repository Corruption是官方回答。

真正简短的答案是:找到未损坏的对象并复制它们。

【讨论】:

  • 这不是特别有用。所讨论的损坏对象几乎可以肯定不是需要恢复的对象;它是部分从远程获取的。
【解决方案4】:

对于遇到相同问题的任何人:

我通过在另一个位置再次克隆 repo 解决了这个问题。然后,我将整个 src 目录(显然没有 .git 目录)从损坏的仓库复制到新克隆的仓库中。因此,我拥有了所有最近的更改和一个干净且工作的存储库。

【讨论】:

    【解决方案5】:

    唯一对我有用的是删除 git repo 并重新配置它:

    rm -rf .git
    git remote set-url origin <repo-url>
    

    【讨论】:

    • 您可能还需要在git remote 命令之前运行git init
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    相关资源
    最近更新 更多