Git 中的损坏文件

Git 中的损坏文件

我最近使用以下命令从我的 git repos 历史记录中删除了一些文件夹:

git filter-branch --index-filter 'git rm -r --cached var' -- --all

不幸的是我无法从该存储库中提取任何内容,这是我收到的错误集:

git pull
remote: Counting objects: 3953, done.
remote: Compressing objects: 100% (2810/2810), done.
error: garbage at end of loose object '4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0'
fatal: object 4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0 is corrupted
fatal: index-pack failed

答案1

有些善良的灵魂写了一个脚本自动(更彻底)地执行此操作,但恢复过程基本上如下:

  1. 使用 hexdump 检查报告垃圾的文件。

    $ hexdump .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
    

    您正在寻找文件中存在大量零的部分。如果有多个这样的范围,当仅考虑第一个巨大的零集时,我的运气很好(N = 2),即使它们包括少量非零数据。这就是 git 抱怨的“垃圾”。

    ...
    0000500 0532 0302 0000 0000 0000 0000 0000 0000    # <-- Beginning here...
    0000510 0000 0000 0000 0000 0000 0000 0000 0000
    *
    0001000             # ... almost 3kb of zeros.
    

    由此您可以确定真实的对象的大小。这里是 0x504,也就是 1,284 字节。

  2. 制作对象的备份副本。如果您选错了零集,您可以用另一组零再试一次。

    $ cp .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0 ~/old_4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
    
  3. 将文件截断为适当的长度。

    $ truncate -s 1284 .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
    

现在应该修复损坏的对象。假设这是唯一的一个,那么克隆/推送/拉取存储库现在应该可以按预期工作。

引用我的资料,我相信我也遇到过同样的问题,但我使用的是 Ubuntu 10.4(内核 2.6.32-23-generic)。在这种情况下,这是一个尚未追踪的文件系统错误。有一个未解决的问题加密文件系统关于这个问题,以及相关 usenet 主题在寻找解决方案的过程中,我发现了一个方便的答案和总结在 StackOverflow 上。链接文章非常有趣,尽管我最终选择了不同的方式。

相关内容