2012-02-20 71 views
2

我正在调试由硬盘驱动器故障导致的git存储库损坏情况。我有查找对象属于哪个提交?

>git fsck --full 
fatal: loose object 25e9d8d2deb964c3da0f86f60bbd5a23e8387349 (stored in 
.git/objects/25/e9d8d2deb964c3da0f86f60bbd5a23e8387349) is corrupt 

>git show 25e9d8d2deb964c3da0f86f60bbd5a23e8387349 
fatal: loose object 25e9d8d2deb964c3da0f86f60bbd5a23e8387349 (stored in 
.git/objects/25/e9d8d2deb964c3da0f86f60bbd5a23e8387349) is corrupt 

现在,我想知道关于此对象的一些事情 - 它是什么,它属于哪里? (哪个文件夹,其呈交?)

当我试图调查对象的存储,我得到:

>git show e9d8d2deb964c3da0f86f60bbd5a23e8387349 
fatal: ambiguous argument 'e9d8d2deb964c3da0f86f60bbd5a23e8387349': unknown revision or 
path not in the working tree. Use '--' to separate paths from revisions 

我应该如何进行?

我有一个从今天早些时候的存储库的副本,但我不想只是垃圾我的本地更改 - 我宁愿看看我是否可以修复回购,或者只是垃圾一个提交。

P.S. - 我发现了一些关于“松散对象”问题的线索,但没有提供关于如何调查/解决的具体指示,无论是在哪里找到另一个回购库中的腐败对象的备份,以及在没有备份这个对象。

P.S. 2 - 奇怪的是,gitk --all运作良好,并不在乎这种腐败状态。

+0

我想说的第一件事就是使用'git cat-file -p'来试图找出它是什么类型的对象。 – 2012-02-20 21:55:12

+0

@格雷格 - 输出:'错误:无法解开25e9d8d2deb964c3da0f86f60bbd5a23e8387349头 错误:inflateEnd:失败 致命的:不是有效的对象名25e9d8d2deb964c3da0f86f60bbd5a23e8387349' – ripper234 2012-02-20 22:00:14

+0

好吧,也许尝试一些其他的'猫file'选项,看看你能找出。 – 2012-02-20 22:02:44

回答

2

消息“松散对象25e9d8d2deb964c3da0f86f60bbd5a23e8387349”告诉你已经有了所述对象的确切哈希值;它是25e9d8d2deb964c3da0f86f60bbd5a23e8387349。 Git通过拆分单独目录的前两个字符来组织子目录中的对象。因此该对象存储在/25/e9d8d2deb964c3da0f86f60bbd5a23e8387349中,但不会更改其标识符是完整散列。因此,您只需要使用git show 25e9d8d2deb964c3da0f86f60bbd5a23e8387349即可。但是,由于对象已损坏,因此无法将其恢复。

然而,好消息是“松散对象”意味着没有任何东西指向它,所以如果你的存储库是好的,你将不需要该对象。

Oddly enough, gitk --all works well and doesn't care about this corrupt state.

gitk - 以及几乎所有其他用户从Git命令 - 只能看从头部或其他命名引用(分支,标签)可达的对象。所以如果有一个松散的对象,没有任何东西指向它,因为这样尤其是HEAD和另一个命名引用都没有指向它,并且不会出现错误。

+0

'所以如果您的存储库是好的,你不会需要该对象。' - 有没有办法简单地将索引恢复到最后一次已知的好提交?像'reset --hard'这样的东西会在腐败的回购中起作用吗? – ripper234 2012-02-20 22:50:11

+0

我不认为你真的是指索引。但是当然你可以使用'reset --hard'将HEAD移动到不同的提交。正如我所说的,您的存储库似乎不是腐败的;只是一个*松散*对象,所以一切都应该罚款无论如何。 – poke 2012-02-21 12:19:25