注意:我没有任何此存储库的损坏前克隆。我相信我的情况与这里描述的其他人不同,因为我错过了一棵树,而不是一个blob。Git恢复:“目标文件为空”。如何重新创建树木?
发生了什么事:
当我试图克隆了LAN(通过SSH)存储库,Git会返回一个错误,指出该库已损坏:
remote: error: object file ./objects/2e/223ce259e9e33998d434acc778bc64b393d5d4 is empty
remote: fatal: loose object 2e223ce259e9e33998d434acc778bc64b393d5d4 (stored in ./objects/2e/223ce259e9e33998d434acc778bc64b393d5d4) is corrupt
error: git upload-pack: git-pack-objects died with error.
fatal: git upload-pack: aborting due to possible repository corruption on the remote side.
remote: aborting due to possible repository corruption on the remote side.
我在什么地方发现git fsck
可用于诊断腐败,但它并没有告诉我任何新的东西:
git fsck --full
error: object file ./objects/2e/223ce259e9e33998d434acc778bc64b393d5d4 is empty
fatal: loose object 2e223ce259e9e33998d434acc778bc64b393d5d4 (stored in ./objects/2e/223ce259e9e33998d434acc778bc64b393d5d4) is corrupt
我试图克隆reposito本地(使用--no-hardlinks
)查看会发生什么,但我得到的结果完全相同。
然后我在this question迷迷糊糊的,谁回答的家伙刚刚删除的空文件(步骤3),所以我这样做(即我已经删除了子目录文件223ce259e9e33998d434acc778bc64b393d5d4
)。
git fsck
一遍,我看到:
Checking object directories: 100% (256/256), done.
broken link from tree 838e437f371c652fa4393d25473ce21cbf697d7a
to tree 2e223ce259e9e33998d434acc778bc64b393d5d4
dangling commit 54146bc0dc4eb3eede82a0405b749e05c11c5522
missing tree 2e223ce259e9e33998d434acc778bc64b393d5d4
dangling commit 864864feec207786b84158e526b2faec7799fd4e
dangling blob d3cfd7cc7718d5b76df70cf9865db01c25181bfb
所以,现在有树木838e437f37
问题。这不是上面提到的那个家伙发生的事情,所以我去谷歌搜索,发现some information from Linus。
所以,我做了git ls-tree 838e437f371c652fa4393d25473ce21cbf697d7a
和输出有这样一行:
040000 tree 2e223ce259e9e33998d434acc778bc64b393d5d4 moje
现在,“moje”是目录(不像莱纳斯解释说,这是一个文件中的示例)。我想这就是为什么Linus建议下一步,git hash-object moje
返回fatal: Unable to hash moje
。
但无论如何,这只是一个小的机会,这是我所需要的,所以我进一步寻找。我跑了git log --raw --all --full-history -- moje/
,根据Linus的指南,应该有一个提交列出2e223作为一些内容的SHA-2散列,但没有。并且列表以
fatal: unable to read source tree (2e223ce259e9e33998d434acc778bc64b393d5d4)
我试着查看错误之前列出的最后一个提交,但是我没有找到这个哈希。我见过this,但它没有帮助我,可能是因为是有问题的版本和工作树的当前状态之间的一些变化。
有一件事情可能很重要:在moje/
里面有一个目录cli/
,它是一个Git仓库本身(一个子模块)。我已经在那里寻找有问题的SHA-2哈希,但还没有找到它。
我该怎么办?
很好的意见,但你也可以将它张贴作为自己的回答你的问题。你甚至可以接受你自己的答案,但不要这样做;)Chronial的答案赢得了公平和正确的“刻度标记”。 – VonC 2013-02-13 11:45:49
当然,Chronial的答案将保持公认的答案:)我已经将解决方案移至单独的答案中,正如所建议的那样。 – 2013-02-14 09:21:27