代码之家  ›  专栏  ›  技术社区  ›  Mike

如何处理损坏的Git对象文件?

git
  •  50
  • Mike  · 技术社区  · 14 年前

    $ 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为零字节;删除它不会解决我的问题(同样的错误)。

    3 回复  |  直到 6 年前
        1
  •  37
  •   Cascabel    14 年前

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

    大小为零的临时对象文件显然可以被删除。这对我们没有任何好处。指代它的腐败对象, d4a0e75... ,是我们真正的问题。它可以在 .git/objects/d4/a0e75... . 正如我上面所说,它将是安全的删除,但以防万一,备份它首先。

    git pull 应该成功。

    ……假设它一开始就成功了。在这种情况下,似乎某些本地修改阻止了尝试的合并,因此 stash pull , stash pop 一切正常。不过,任何合并都可能发生这种情况,与损坏的对象无关。(除非有一些索引清理的必要,而且在这个过程中,存储库做到了这一点。。。但我不这么认为。)

        2
  •  26
  •   Kazmi John Boker    5 年前

    /objects 具有0大小的目录,使用命令:

    find .git/objects/ -size 0 -delete
    

    建议备份 .

        3
  •  8
  •   Peter Mortensen icecrime    6 年前

    Recovering from Repository Corruption

    最简单的答案是:找到未损坏的对象并复制它们。