我最近使用以下命令从我的 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
有些善良的灵魂写了一个脚本自动(更彻底)地执行此操作,但恢复过程基本上如下:
使用 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 字节。
制作对象的备份副本。如果您选错了零集,您可以用另一组零再试一次。
$ cp .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0 ~/old_4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
将文件截断为适当的长度。
$ truncate -s 1284 .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
现在应该修复损坏的对象。假设这是唯一的一个,那么克隆/推送/拉取存储库现在应该可以按预期工作。
引用我的资料,我相信我也遇到过同样的问题,但我使用的是 Ubuntu 10.4(内核 2.6.32-23-generic)。在这种情况下,这是一个尚未追踪的文件系统错误。有一个未解决的问题加密文件系统关于这个问题,以及相关 usenet 主题在寻找解决方案的过程中,我发现了一个方便的答案和总结在 StackOverflow 上。链接文章非常有趣,尽管我最终选择了不同的方式。