【问题标题】:Git - folder "refs" missingGit - 文件夹“refs”丢失
【发布时间】:2012-07-23 07:32:40
【问题描述】:

我不得不从备份中恢复一些 git 裸存储库,并发现 git(我在 wondows XP 上使用 msysgit)无法识别该存储库。经过一番调查,我发现问题似乎是文件夹“refs”以及子文件夹“heads”和“remotes”丢失了。我也没有文件“heads/master”。有什么办法可以重新创建它吗?我真的需要恢复这些文件夹中的数据。

【问题讨论】:

  • 再来一次clone 存储库怎么样?或者你可以init新仓库

标签: git


【解决方案1】:

如果您丢失了所有引用(refs 文件夹),但没有丢失任何实际数据,您可以通过查找悬空提交(即未被其他提交引用的提交)找到所有可能最后提交作为父母)

你可以在这个命令的帮助下做到这一点

git fsck --lost-found

这列出了所有悬空提交(可能还有一些其他有用的信息)。 使用

git log SHA1SUM

进一步调查。 运行也是个好主意

git fsck

确保只在丢失的地方引用。

UPD: refs 也可以位于 packed-refs 文件中。

【讨论】:

    【解决方案2】:

    当然,如果您对这些存储库有任何签出,最简单的做法就是从这些存储库中恢复。


    refs 仅包含具有这些名称指向的提交的 SHA1 的文件; refs/heads/master 可能就是您所需要的,仅包含 HEAD 提交的 SHA1。您没有丢失任何数据(全部在 objects 中),但找出您想要的提交的 SHA1 可能有点棘手。

    如果您有文件logs/HEAD,则 ref 应该在底部(第一个 SHA1 是最近提交的父级,第二个是它的 id;如果是合并,可能会有更多提交,不确定)。例如,这是我的一个回购的最后一行:

    4b2ef6873c3f4c7eaebca06fee4b95ffa9cf58c3 feb84419b6685b920f8a3d61a77e9508ba5dcfe1 Dougal Sutherland <dougal@gmail.com> 1342838724 -0400 pull: Fast-forward
    

    所以以feb84419b6 开头的哈希是我想要的。不幸的是,我认为这些只是在非裸结帐中。

    如果您没有这些日志,则提交都在 objects 目录中。它很可能是最近修改过的,例如,您可以在 Unix 上通过 objects 目录中的 ls -1t */* | head -10 获得它;你可以尝试一对,看看会发生什么。如果你从中得到,说

    04/718652eb1f03bb0594cc05665665b749b52a87
    

    然后删除/ 以获取您要使用的哈希:

    04718652eb1f03bb0594cc05665665b749b52a87
    

    【讨论】:

    • 我没有 logs 文件夹。我只有 hooksinfoobjects。我不确定这是否是因为这是一个镜像存储库,但这是否意味着我不走运?我可以在其他任何地方获得最后一次提交的 SHA1 吗?
    • @LittleFish 如果你使用最近修改的对象的名称,它是否有效?
    • @Dougal,问题是我不知道哪一个是最近修改的。我刚试过,但是objects下的所有文件都有相同的时间戳
    • 好的,通过这里的一些提示,我设法找到了Recovering Git Repository from objects only 的帖子。因为我只有很少的提交,所以很容易从 git fsck 获得正确的提交。然后我按照你的建议将 SHA1 放入 .git/refs/heads/master 文件中,它成功了!!!!非常感谢