我不得不从备份中恢复一些 git 裸存储库,并发现 git(我在 wondows XP 上使用 msysgit)无法识别该存储库。经过一番调查,我发现问题似乎是文件夹“refs”以及子文件夹“heads”和“remotes”丢失了。我也没有文件“heads/master”。有什么办法可以重新创建它吗?我真的需要恢复这些文件夹中的数据。
2 回答
如果您丢失了所有引用(refs 文件夹),但没有丢失任何实际数据,您可以通过查找悬空提交来找到所有可能的最后提交(即其他提交未作为父提交引用的提交)
您可以在此命令的帮助下完成
git fsck --lost-found
这列出了所有悬空提交(可能还有一些其他有用的信息)。采用
git log SHA1SUM
进一步调查。跑步也是个好主意
git fsck
确保只在丢失的地方引用。
UPD: Also refs can be located in packed-refs file.
当然,如果您对这些存储库有任何结帐,最简单的方法就是从这些存储库中恢复。
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 -10
从objects
目录中获取它;你可以尝试一对,看看会发生什么。如果你从中得到,说
04/718652eb1f03bb0594cc05665665b749b52a87
然后删除/
以获取您要使用的哈希:
04718652eb1f03bb0594cc05665665b749b52a87