为了账号安全,请及时绑定邮箱和手机立即绑定

如何恢复因硬盘故障而损坏的Git对象?

如何恢复因硬盘故障而损坏的Git对象?

Git
30秒到达战场 2019-08-12 14:37:06
如何恢复因硬盘故障而损坏的Git对象?我遇到了硬盘故障导致Git存储库的某些文件损坏。运行时,git fsck --full我得到以下输出:error: .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack SHA1 checksum mismatcherror: index CRC mismatch for object 6c8cae4994b5ec7891ccb1527d30634997a978ee from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack at offset 97824129error: inflate: data stream error (invalid code lengths set)error: cannot unpack 6c8cae4994b5ec7891ccb1527d30634997a978ee from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack at offset 97824129error: inflate: data stream error (invalid stored block lengths)error: failed to read object 0dcf6723cc69cc7f91d4a7432d0f1a1f05e77eaa at offset 276988017 from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.packfatal: object 0dcf6723cc69cc7f91d4a7432d0f1a1f05e77eaa is corrupted我有存储库的备份,但包含包文件的唯一备份已经损坏了。所以我认为我必须找到一种方法从不同的备份中检索单个对象,并以某种方式指示Git生成一个只有正确对象的新包。你能否告诉我如何修复我的存储库?
查看完整描述

3 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

在以前的一些备份中,您的坏对象可能已经打包在不同的文件中,或者可能是松散的对象。所以你的对象可能会被恢复。

看来你的数据库中有一些坏对象。所以你可以用手动的方式做到这一点。

因为git hash-objectgit mktree并且git commit-tree因为它们在包中发现不写的对象,然后开始做这样的:

mv .git/objects/pack/* <somewhere>for i in <somewhere>/*.pack; do
  git unpack-objects -r < $idonerm <somewhere>/*

(您的包将从存储库中移出,并再次在其中解压缩;只有好的对象现在在数据库中)

你可以做:

git cat-file -t 6c8cae4994b5ec7891ccb1527d30634997a978ee

并检查对象的类型。

如果类型是blob:从以前的备份中检索文件的内容(使用git showgit cat-filegit unpack-file;然后您可以git hash-object -w重写当前存储库中的对象。

如果类型是树:您可以使用git ls-tree从以前的备份恢复树; 然后git mktree在当前的存储库中再次编写它。

如果类型是commit:与git show,相同,git cat-filegit commit-tree

当然,在开始此过程之前,我会备份您的原始工作副本。

另外,请看一下如何恢复损坏的Blob对象


查看完整回答
反对 回复 2019-08-12
  • 3 回答
  • 0 关注
  • 2062 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信