首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何恢复硬盘损坏的Git对象?

如何恢复硬盘损坏的Git对象?
EN

Stack Overflow用户
提问于 2009-04-29 09:21:04
回答 5查看 105K关注 0票数 94

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

代码语言:javascript
复制
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生成一个仅包含正确对象的新包。

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-04-29 13:09:55

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

你的数据库中似乎有一些坏的对象。所以你可以用手工的方式来做。

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

代码语言:javascript
复制
mv .git/objects/pack/* <somewhere>
for i in <somewhere>/*.pack; do
  git unpack-objects -r < $i
done
rm <somewhere>/*

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

您可以执行以下操作:

代码语言:javascript
复制
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

票数 86
EN

Stack Overflow用户

发布于 2009-05-04 13:46:24

Banengusk让我走上了正确的道路。为了进一步参考,我想发布我为修复存储库损坏而采取的步骤。我很幸运地找到了所有需要的对象,无论是在较旧的包中还是在存储库备份中。

代码语言:javascript
复制
# Unpack last non-corrupted pack
$ mv .git/objects/pack .git/objects/pack.old
$ git unpack-objects -r < .git/objects/pack.old/pack-012066c998b2d171913aeb5bf0719fd4655fa7d0.pack
$ git log
fatal: bad object HEAD

$ cat .git/HEAD 
ref: refs/heads/master

$ ls .git/refs/heads/

$ cat .git/packed-refs 
# pack-refs with: peeled 
aa268a069add6d71e162c4e2455c1b690079c8c1 refs/heads/master

$ git fsck --full 
error: HEAD: invalid sha1 pointer aa268a069add6d71e162c4e2455c1b690079c8c1
error: refs/heads/master does not point to a valid object!
missing blob 75405ef0e6f66e48c1ff836786ff110efa33a919
missing blob 27c4611ffbc3c32712a395910a96052a3de67c9b
dangling tree 30473f109d87f4bcde612a2b9a204c3e322cb0dc

# Copy HEAD object from backup of repository
$ cp repobackup/.git/objects/aa/268a069add6d71e162c4e2455c1b690079c8c1 .git/objects/aa
# Now copy all missing objects from backup of repository and run "git fsck --full" afterwards
# Repeat until git fsck --full only reports dangling objects

# Now garbage collect repo
$ git gc
warning: reflog of 'HEAD' references pruned commits
warning: reflog of 'refs/heads/master' references pruned commits
Counting objects: 3992, done.
Delta compression using 2 threads.
fatal: object bf1c4953c0ea4a045bf0975a916b53d247e7ca94 inconsistent object length (6093 vs 415232)
error: failed to run repack

# Check reflogs...
$ git reflog

# ...then clean
$ git reflog expire --expire=0 --all

# Now garbage collect again
$ git gc       
Counting objects: 3992, done.
Delta compression using 2 threads.
Compressing objects: 100% (3970/3970), done.
Writing objects: 100% (3992/3992), done.
Total 3992 (delta 2060), reused 0 (delta 0)
Removing duplicate objects: 100% (256/256), done.
# Done!
票数 37
EN

Stack Overflow用户

发布于 2009-04-29 10:01:13

Git checkout实际上可以从修订版中挑选出单个文件。只需提供提交散列和文件名即可。更多详细信息here.

我想安全修复这个问题的最简单方法是恢复到最新的未提交备份,然后从新提交的文件中有选择地挑选未损坏的文件。祝好运!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/801577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档