Git损坏的仓库:如何从干净的仓库中选择一个Git对象

8
这是关于Git仓库损坏的众多问题之一,确切地说,是一个松散对象出了问题:
$ git gc
Counting objects: 3299, done.
error: inflate: data stream error (unknown compression method)
error: unable to unpack 831a5d31af4a0af2f5a367689bee27a44efc22c9 header
Delta compression using up to 6 threads.
Compressing objects: 100% (3283/3283), done.
error: inflate: data stream error (unknown compression method)
fatal: loose object 831a5d31af4a0af2f5a367689bee27a44efc22c9 (stored in .git/objects/83/1a5d31af4a0af2f5a367689bee27a44efc22c9) is corrupt
error: failed to run repack

在处理与 Git 对象文件损坏相关的问题时,可以参考以下现有的答案(如何处理损坏的 Git 对象文件?如何修复损坏的 Git 存储库?由于缺少对象而导致的 Git 损坏该怎么办?)。我已经从受损的存储库中删除了对象831a5d31

在我的情况下,我拥有一个克隆的存储库,似乎保存了我遗失的对象,但是在objects/83/1a5d31af4a0af2f5a367689bee27a44efc22c9 路径下没有文件。我该如何修复我的存储库?

1个回答

11

如果文件存在于其他地方

清理仓库的对象已被重新打包,因此它不再存在于文件中。

要恢复它,请先从干净的仓库保存为文件,使用

git show 831a5d31af4a0af2f5a367689bee27a44efc22c9 > 831a5-file

将损坏的存储库中的831a5-file移动,然后运行

git hash-object -w 831a5-file

请确保输出中给出的SHA1值为831a5d31af4a0af2f5a367689bee27a44efc22c9

这将存储该对象,并且仓库已经固定!

如果文件不存在于其他地方

如果文件在提交后但在您能够推送之前发生损坏,即表示文件不存在于其他地方,则有一种方法可以恢复您的存储库并重新提交更改。请参见此答案以获取相关问题的解决方案。


这适用于blob对象;是否有一种方法可以导入/导出树对象? - fuzzyTew
1
为了回答自己的问题,对于树等对象,可以这样做: git cat-file tree <hash> > temp git hash-object -t tree -w temp - fuzzyTew
1
谢谢,你救了我的代码库!请注意,如果你的干净代码库来自不同的操作系统,如果行尾在操作系统之间不相同,则SHA1可能不匹配。但是解决方案仍然有效。 - mrm
1
这对我没有用,但是根据 git fsck 指定的方式复制缺失的 object 文件可以解决问题。 - bbodenmiller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接