恢复 git 存储库/提交等

Posted

技术标签:

【中文标题】恢复 git 存储库/提交等【英文标题】:Restore git repository/commits etc 【发布时间】:2011-09-03 22:52:33 【问题描述】:

我不小心删除了一个包含 .git/ 的项目。只有这个本地仓库。

我使用recuva 恢复了许多文件,并且项目在那里恢复。但是 .git-things 没有回来,因为我只有一个包含所有文件的文件夹:http://pastebin.com/sBiQ9fin 我不知道把它们放在哪里。

是否可以将这些文件放回 .git/ 文件夹中,以便我可以恢复项目的所有提交等?

【问题讨论】:

【参考方案1】:

如果您已恢复松散的目标文件并且只有 38 个字符的名称后缀,则很容易恢复全名。我写了这个 Python 脚本:

import os
import hashlib
import sys

for name in sys.argv[1:]:
    with open(name) as obj:
        contents = obj.read().decode('zlib')
        sha1 = hashlib.sha1(contents).hexdigest()
        assert sha1[2:] == name
        path = sha1[:2]
        os.renames(name, '.git/objects/0/1'.format(path, name))

首先在包含所有对象的目录中运行git init,然后调用它

python recover.py ??????????????????????????????????????

之后,运行git fsck 来验证松散对象数据库。如果你成功了,它会告诉你哪些提交是悬空的,比如

josh@tengwar:~/test (master)$ git fsck 
notice: HEAD points to an unborn branch (master)
notice: No default references
dangling commit 0170886ebc339424aab2e1685a32a2de2ce62e13
dangling commit 6451cd01f1f76b224352f1d2d0fca12a21454c3e
dangling commit 1e13a551382e652fa07a108341516f0f4a441c9c
dangling tag 7914223b1bb0d0e9179027a00bc2f62e118483d4
dangling tag 2895de51d79904d707dfbf5bcd68b047e49c9f03
dangling commit 8156f571839e5f42d043dcb6bd91aa406e909f76
dangling commit 75b7d8d60344b576b19cc7908d180757d50274c3
dangling tag 9aed839bbc4e3c5cd031d73b78ea87b43688e34c
dangling commit 69fe3581a8b06266c294d72e5944e2415d5af612

然后你可以用git checkout <id> -b newbranch创建一个指向任何提交的分支,一切都会好起来的。 (如果git fsck 报告丢失的对象,事情会很困难。)

【讨论】:

谢谢。听起来不错,但我不知道 python 并且它还不起作用:pastebin.com/YK6r7dky 在这种情况下,您没有完美恢复对象,所以这不起作用。【参考方案2】:

您似乎无法再恢复任何东西。为避免再次发生这种情况,我建议在各种代码托管站点之一(github、gitorious、repo.or.cz)上设置一个 repo。如果您需要,他们支持私人回购,有些免费,有些则没有。

此外,磁盘备份是另一种保证代码安全的方法。

【讨论】:

哈哈当然。我在这个安装中有大约 20 个项目.. 并且所有项目都在线.. 只有这个没有......我不知道为什么......无论如何.. 这 解决问题跨度> 【参考方案3】:

如果这就是你所拥有的,那是不可能的。这些不是完整的 sha 地址(38 个字符而不是 40 个),因为前两个字符是这些对象所属的目录名称。

除非你有别的东西。

【讨论】:

是的 - 这不会有太大帮助。对不起。 恢复完整的对象名称很简单;您只需要解压缩对象并对其进行哈希处理。

以上是关于恢复 git 存储库/提交等的主要内容,如果未能解决你的问题,请参考以下文章

如何将公共 Git 存储库恢复到特定的先前提交?

如何将多个 Git 提交(已推送)还原到已发布的存储库?

使用重置头恢复提交

恢复到 Git 中的特定提交 [重复]

如何还原某些用户在 GIT 存储库中所做的更改

如何将我的 git 分支恢复到指定的提交?