从对象目录中恢复git存储库

时间:2011-09-24 07:38:26

标签: git

我不知道它是怎么发生的,但我有一个数据丢失,只剩下一个只包含.git目录的objects目录。

我已按照Recovering Git repository from objects only

中的步骤操作
  1. 创建了一个新目录并运行git init
  2. 将我所拥有的objects目录复制到新的.git/objects目录
  3. git fsck命令。
  4. 上述步骤的输出产生了以下信息:

    notice: HEAD points to an unborn branch (master)
    notice: No default references
    dangling commit 0b2c7d52b6a7e6d4e2858e9ebf207c315407c87c
    dangling commit 8dceafea1634c923069f6d4b925839c28d92c4e5
    dangling commit dd7bdd04c557a018c15fd0948075121f181decd1
    

    当我尝试在此阶段运行git log时,我得到fatal: bad default revision 'HEAD'

    我应该怎么做以恢复我的数据?


    编辑:

    klaustopher的建议:

    1. 我在/refs/heads下添加了一个名为master的文件,其中包含一个悬空提交。
    2. 我收到的消息是fatal: unable to read tree 3c864da48b16ad0dc5f8ae585380270a708a1e56
    3. 我检查了“对象”下面没有3c目录...

1 个答案:

答案 0 :(得分:1)

嗯,你得到了对象,但是git不知道哪个是它应该解释为master的提交。 git fsck的输出中有三个建议。您可以尝试以下方法:

  • 创建.git/refs/heads目录并创建名为master
  • 的文件
  • 将其中一个提交的SHA1哈希值放在此文件中
  • 运行git checkout master

如果那不是您要查找的提交,请在master - 文件中添加另一个sha1哈希

-

编辑:如果这些不是您在评论中描述的真实提交,那么您应该浏览对象。使用git show 2452845a7b526db3dfbf88c1c2ca05967ef9653a,您可以看到文件的内容。如果是提交,它将以单词commit开头,并且还包含日期,提交消息等。您可以编写一个小shell脚本来遍历所有对象。当你找到你的提交时,把它的sha1放在refs / heads / master文件中并执行我上面描述的