Git中损坏的文件


8

我最近使用以下命令从我的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

您在哪个Linux系统上进行了更改?
Andres Jaan Tack

我在用窗户;现在我在linux上运行良好
mnml

Answers:


7

善良的灵魂 写了一个脚本 自动(并且更彻底)执行此操作,但恢复过程基本上是这样的:

  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-通用)。在这种情况下,它是一个尚未被跟踪的文件系统错误。有一个未解决的问题 ecryptfs 关于这个问题,还有一个 相关的usenet线程 。在找到解决方案的过程中,我发现了一个 方便的答案和总结 在StackOverflow上。该 相关文章 非常有趣,虽然我最终采取了不同的方式。


非常感谢你的回答。当我遇到你提到的同样的ecryptfs错误时,git-remove-trailing-garbage.py(上面的文字链接“写了一个脚本”)保存了我的培根!
Adam Monsen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.