Git中损坏的文件

mnm*_*nml 8 git repository file-corruption

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

git filter-branch --index-filter 'git rm -r --cached var' -- --all
Run Code Online (Sandbox Code Playgroud)

不幸的是,我不能再从这个 repos 中提取了,这是我得到的错误集:

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
Run Code Online (Sandbox Code Playgroud)

And*_*ack 7

一些好心人写了一个脚本来自动执行此操作(并且更彻底),但恢复过程基本上是这样的:

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

    $ hexdump .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
    
    Run Code Online (Sandbox Code Playgroud)

    您正在寻找文件中包含大量零的部分。如果有多个这样的跨度,我在只考虑第一组巨大的零时运气很好(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.
    
    Run Code Online (Sandbox Code Playgroud)

    您可以由此确定对象的实际大小。在这里,它将是 0x504 或 1,284 字节。

  2. 制作对象的备份副本。如果您选择了错误的零组,您可以使用不同的组重试。

    $ cp .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0 ~/old_4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将文件截断为其适当的长度。

    $ truncate -s 1284 .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
    
    Run Code Online (Sandbox Code Playgroud)

现在应该修复损坏的对象。假设它是唯一的,克隆/推/拉存储库现在应该按预期工作。

引用我的消息来源,我相信我遇到了同样的问题,但在我的情况下使用 Ubuntu 10.4(内核 2.6.32-23-generic)。在这种情况下,这是一个尚未追踪到的文件系统错误。关于这个主题的ecryptfs有一个未解决的问题,还有一个相关的 usenet 线程。在寻求解决方案的过程中,我在 StackOverflow 上找到了一个方便的答案和总结。该链接的文章很有意思,虽然我最终去了不同的方式。