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)
一些好心人写了一个脚本来自动执行此操作(并且更彻底),但恢复过程基本上是这样的:
使用 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 字节。
制作对象的备份副本。如果您选择了错误的零组,您可以使用不同的组重试。
$ cp .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0 ~/old_4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
Run Code Online (Sandbox Code Playgroud)将文件截断为其适当的长度。
$ truncate -s 1284 .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
Run Code Online (Sandbox Code Playgroud)现在应该修复损坏的对象。假设它是唯一的,克隆/推/拉存储库现在应该按预期工作。
引用我的消息来源,我相信我遇到了同样的问题,但在我的情况下使用 Ubuntu 10.4(内核 2.6.32-23-generic)。在这种情况下,这是一个尚未追踪到的文件系统错误。关于这个主题的ecryptfs有一个未解决的问题,还有一个相关的 usenet 线程。在寻求解决方案的过程中,我在 StackOverflow 上找到了一个方便的答案和总结。该链接的文章很有意思,虽然我最终去了不同的方式。
| 归档时间: |
|
| 查看次数: |
5543 次 |
| 最近记录: |