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

Sch*_*ern 12 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
Run Code Online (Sandbox Code Playgroud)

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

$ git cat-file -t 2dddc84156fa30e4614a7ea5a1895885011b8db8
tree
Run Code Online (Sandbox Code Playgroud)

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

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

kla*_*her 8

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

  • OIC,我需要在新的回购中打开它们.在`cd/path/to/broken-repo中有什么危害吗?git unpack-objects </ path/to/clean-repo/.git/objects/pack/pack-blahblah`来获取可能丢失或损坏的所有内容? (4认同)

小智 8

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

cd <path-to-local-repo>
git unpack-objects < <reference-repo-path>/objects/pack/pack-<hash>.pack
Run Code Online (Sandbox Code Playgroud)

事实证明,我需要的所有对象都在参考存储库中的一个包文件中,而不是在单独的“松散”对象文件中。这个简单的咒语将打包文件解包到本地数据库中,填补漏洞。做完之后

git gc
Run Code Online (Sandbox Code Playgroud)

清理任何悬而未决的提交(即由于变基、修改提交等),我的git fsck现在是干净的。


Car*_*arl 5

可以归结为:您是否在任何地方都有该文件的备份(.git / objects / 2d / ddc84156fa30e4614a7ea5a1895885011b8db8)?如果找到它,请将其复制回您的git存储库,一切将再次恢复正常。换句话说,您知道存储库是否已克隆吗?如果有的话,您将在克隆的git文件夹中找到该文件并将其复制到您的文件中。如果尚未克隆存储库,是否将其压缩到某个位置?如果您使用的是Mac,是否检查了Time Machine?如果您不在Mac上,是否正在使用某种方式来备份代码?

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

通常最好将存储库克隆到另一个位置,以防万一发生这种情况。这也是为什么github和bitbucket这样的服务如此受欢迎的原因。

您可能还想看一下这个问题:如何恢复由于硬盘故障而损坏的Git对象?