0

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

4

2 回答 2

4

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

您可以在此命令的帮助下完成

git fsck --lost-found

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

git log SHA1SUM

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

git fsck

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

UPD: Also refs can be located in packed-refs file.

于 2012-07-22T23:21:53.080 回答
0

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


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 上ls -1t */* | head -10objects目录中获取它;你可以尝试一对,看看会发生什么。如果你从中得到,说

04/718652eb1f03bb0594cc05665665b749b52a87

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

04718652eb1f03bb0594cc05665665b749b52a87
于 2012-07-22T22:48:01.370 回答