如何修复一个缺失对象的git仓库?

15

我的开发仓库在某个时间点丢失了一个对象。

$ 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

我希望保留我的开发存储库,其中包含未推送的分支和藏匿。

如何将该对象打补丁到我的损坏存储库中?


类似的:https://dev59.com/52445IYBdhLWcg3wTIjm - Ciro Santilli OurBigBook.com
3个回答

12

最近我在本地仓库中有许多丢失的对象,但有一个完好的参考仓库可以用来恢复。以下是我想出并对我有效的魔法:

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

原来我需要的所有对象都在引用仓库的打包文件中,而不是在单独的“松散”对象文件中。这个简单的咒语将该打包文件解包到本地数据库中,填补了空缺。完成后

git gc

为了清理任何悬空提交 (例如由于变基、修订提交等),我的git fsck现在干净了。


太完美了!运行得非常好!谢谢! - Rafael Xavier
我也试过了,可以确认。 - starikcetin

10

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


1
嗯,新的存储库中不存在这个。.git/objects/ 包含一个空的 info/pack/pack-dce082ac46b5bd850378e93f384a1b8e01e3b87a.idx 以及 pack/pack-dce082ac46b5bd850378e93f384a1b8e01e3b87a.packgit unpack-objects -r < .git/objects/pack/pack-dce082ac46b5bd850378e93f384a1b8e01e3b87a.pack 声称已经解压了100%,但我找不到它们。 - Schwern
4
我需要在一个新的仓库中解压它们。使用cd /path/to/broken-repo; git unpack-objects < /path/to/clean-repo/.git/objects/pack/pack-blahblah来获取可能缺失或损坏的所有内容,这样做会有什么危害吗? - Schwern

7
基本上就是这样:你是否有那个文件(.git/objects/2d/ddc84156fa30e4614a7ea5a1895885011b8db8)的备份?如果你能找到它,将其复制回git仓库,一切都会恢复正常。换句话说,你知道仓库是否被克隆了吗?如果是的话,你会在克隆的git文件夹中找到那个文件,并将其复制到你的文件夹中。如果你没有克隆该仓库,你是否将其压缩并存储在其他地方了呢?如果你使用的是mac电脑,你是否检查过Time machine?如果你不是用的mac电脑,你是否使用了其他备份代码的工具?
基本上就是这样:你需要那个文件的备份。Git的设计就是当出现这种情况时,你只需使用备份(即仓库的克隆)来恢复文件。话虽如此,文件名是基于SHA1哈希的,因此如果你在其他人的仓库中找到了那个文件名,很有可能你可以在自己的仓库中使用它 :)
通常最好的做法是将你的仓库克隆到另一个位置,以防万一发生类似这样的情况。这也是为什么像github和bitbucket这样的服务如此受欢迎的原因。
你还可能想看一下这个问题:如何恢复因硬盘故障而损坏的Git对象?

1
他说他有一个新克隆的存储库(参见第2个代码片段)。还有一件小事:git文件名是sha1,而不是md5 :) - klaustopher
谢谢。我更新了我的回答 :). 另外,如果你的新克隆的存储库有那个对象,@klaustopher建议的方法将解决问题。 - Carl

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