gpt4 book ai didi

git - 如何恢复硬盘故障损坏的 Git 对象?

转载 作者:IT王子 更新时间:2023-10-29 01:25:15 27 4
gpt4 key购买 nike

我遇到过硬盘故障,导致 Git 存储库的某些文件损坏。运行 git fsck --full 时,我得到以下输出:

error: .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack SHA1 checksum mismatch
error: index CRC mismatch for object 6c8cae4994b5ec7891ccb1527d30634997a978ee from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack at offset 97824129
error: inflate: data stream error (invalid code lengths set)
error: cannot unpack 6c8cae4994b5ec7891ccb1527d30634997a978ee from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack at offset 97824129
error: inflate: data stream error (invalid stored block lengths)
error: failed to read object 0dcf6723cc69cc7f91d4a7432d0f1a1f05e77eaa at offset 276988017 from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack
fatal: object 0dcf6723cc69cc7f91d4a7432d0f1a1f05e77eaa is corrupted

我有存储库的备份,但唯一包含包文件的备份已经损坏。所以我认为我必须找到一种方法来从不同的备份中检索单个对象,并以某种方式指示 Git 生成仅包含正确对象的新包。

你能给我提示如何修复我的存储库吗?

最佳答案

在以前的一些备份中,您的坏对象可能已打包在不同的文件中,也可能是松散的对象。因此您的对象可能会被恢复。

您的数据库中似乎有一些坏对象。所以您可以手动完成。

因为 git hash-objectgit mktreegit commit-tree 不写入对象,因为它们在包中找到,然后开始这样做:

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

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

你可以这样做:

git cat-file -t 6c8cae4994b5ec7891ccb1527d30634997a978ee

并检查对象的类型。

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

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

如果类型为commit:同git showgit cat-filegit commit-tree

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

另外,看看 How to Recover Corrupted Blob Object .

关于git - 如何恢复硬盘故障损坏的 Git 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/801577/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com