2011-05-28 147 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