2011-05-28 141 views
2

我不小心删除了一个.git /在其中的项目。只有这个本地存储库。恢复Git仓库/提交等

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

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

回答

2

这似乎不太可能你能够恢复更多。为了避免这种情况再次发生,我建议在各种代码托管站点之一(github,gitorious,repo.or.cz)上设置一个repo。他们支持私人回购,如果你需要的话,有些是免费的,有些则不是。

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

+0

哈哈耶当然。我有大约20个项目在这个安装..和所有在线..只有这一个不是......我不知道为什么......无论如何..这_would_已经解决了问题 – Stuck 2011-05-28 14:14:50

1

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

除非你有别的东西。

+0

这就是我所拥有的:http://pastebin.com/sBiQ9fin – Stuck 2011-05-28 14:04:39

+0

是的 - 这不会有太大的帮助。抱歉。 – Abizern 2011-05-28 14:10:44

+1

恢复完整的对象名称很简单;你只需要解压缩对象并对其进行散列。 – 2011-05-28 16:29:45

2

如果你已经恢复了松散的目标文件,并且只有38个字符后缀的名字,很容易得到全名。与所有对象的目录

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验证松散对象数据库:我写了这Python脚本。如果你成功了,它会告诉你哪些提交都会被晃来晃去,像

[email protected]:~/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报告丢失物体,事情将很困难。)

+0

谢谢。听起来不错,但我不知道蟒蛇,它不工作:http://pastebin.com/YK6r7dky – Stuck 2011-05-29 11:40:48

+0

在这种情况下,你没有一个完美的对象恢复,所以这是行不通的。 – 2011-05-29 13:10:48

+0

好的:-(无论谢谢!也许有人可以使用它.. – Stuck 2011-05-29 21:45:30