`
chimer
  • 浏览: 36202 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

记一次git_gerrit文件破损错误排查

阅读更多
某一天拉代码发生了一次错误

Checking object directories: 100% (256/256), done.
error: ./objects/pack/pack-e434848729a1a52d7ec5cd39ade4fac7f7aa5595.pack SHA1 checksum mismatch
error: index CRC mismatch for object 582bda543520dcbde0f6baaae86d5f9b626787f0 from ./objects/pack/pack-e434848729a1a52d7ec5cd39ade4fac7f7aa5595.pack at offset 57938241
error: inflate: data stream error (invalid distances set)

常规思路谷歌一下是否有类似解决方法,搜到一篇很有用的文章:
http://web.mit.edu/jhawk/mnt/spo/git/git-doc/howto/recover-corrupted-object-harder.html
有一个对应的译文,不过译文有点绕口,不知道是否机器翻译人工简单修订了下
http://blog.jobbole.com/50108/

大致思路是采用穷举改变错误地方的每一个字节,让其能够被解压缩,可惜这个玩意试验后不适用我的情况,因为那个作者只是错了一个字节,而我最后修复后发现错了9个字节并且散落在不同位置。

中间绕过很多弯路,把git源码拉下来修改解包源码然后编译让其调过错误的那个块,但最后我的情况修复可以绕过很多弯路处理,那就是是我错误的 sha1 object 可以完整的打印出来。

git cat-file -p 582bda543520dcbde0f6baaae86d5f9b626787f0 
可以得到这个对象,然后一切就简单了,把这个文件cat出来,放到一个新的git仓库,然后add进去并gc, 从 pack 文件把打包的 offset 用 dd 命令down下来, 原样不动的覆盖掉错误的地方就解决了。

目前不得其解的是为什么错了的还能正确 cat 出来,如果cat 都出不来,那就只能用采用解包方式来处理这个了。

git这么强大,应该有相关low level命令可以处理而不用涉及改源码,目前还没研究真正的原因,等什么时候空了再去查一下根本原因是什么,暂时记录下来供参考。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics