如何修复缺少对象的git存储库?

时间:2011-12-01 20:24:58

标签: git

我的开发存储库在某个时候丢失了一个对象。

$ git fsck
fatal: failed to read object 2dddc84156fa30e4614a7ea5a1895885011b8db8: Invalid argument
$ git cat-file -t 2dddc84156fa30e4614a7ea5a1895885011b8db8
error: unable to find 2dddc84156fa30e4614a7ea5a1895885011b8db8
fatal: git cat-file 2dddc84156fa30e4614a7ea5a1895885011b8db8: bad file

新近克隆的存储库具有该对象。

$ git cat-file -t 2dddc84156fa30e4614a7ea5a1895885011b8db8
tree

我想保留我的开发存储库,它已经拆除了分支和存储。

如何将该对象修补到我破损的存储库中?

3 个答案:

答案 0 :(得分:8)

您可以尝试的是从新克隆的存储库中获取文件.git/objects/2d/ddc84156fa30e4614a7ea5a1895885011b8db8并将其复制到您的开发目录...

答案 1 :(得分:4)

它几乎可以归结为:你有任何地方备份该文件(.git / objects / 2d / ddc84156fa30e4614a7ea5a1895885011b8db8)吗?如果你能找到它,将它复制回你的git存储库,一切都会好起来的。换句话说,您知道存储库是否已被克隆?如果有,您将在克隆的git文件夹中找到该文件并将其复制到您的文件夹中。如果您还没有克隆存储库,是否已将其压缩到某处?如果你在Mac上,你有没有检查过Time机器?如果您不在Mac上,是否使用了某些东西备份代码?

它基本归结为:你需要备份该文件。 Git的设计使得在发生这种情况时,您只需使用备份(存储库的克隆)来还原文件。也就是说,文件名是基于SHA1哈希的,所以如果你可以在其他任何人的存储库中找到该文件名,那么很可能你可以在自己的库中使用它:)

通常最好将您的存储库克隆到另一个位置,以便在出现类似情况时安全保存。这也是github和bitbucket等服务如此受欢迎的原因。

您也可能想看看这个问题:How to recover Git objects damaged by hard disk failure?

答案 2 :(得分:3)

我最近在本地存储库中有一堆丢失的对象和一个未损坏的参考存储库来从中恢复它。这就是我想出的对我有用的魔力:

cd <path-to-local-repo>
git unpack-objects < <reference-repo-path>/objects/pack/pack-<hash>.pack

事实证明,我需要的所有对象都在参考存储库中的包文件中,而不是单独的&#34;松散&#34;目标文件。这个简单的咒语将打包文件解压缩到本地数据库中,填入漏洞。做完

git gc

清理任何悬空提交(即由于变基,修改提交等),我的 git fsck 现在已经清理。