#git #restore #recover
#git #восстановить
Вопрос:
Я случайно удалил проект с .git/ в нем. Существует только этот локальный репозиторий.
Я восстановил много файлов с помощью recuva
, и проект восстановлен там. Но .git-вещи не возвращаются, потому что у меня есть только одна папка, содержащая все файлы:http://pastebin.com/sBiQ9fin и я не знаю, куда их поместить.
Возможно ли поместить эти файлы обратно в .git / папку, чтобы я мог восстановить все коммиты и т.д. проекта?
Ответ №1:
Маловероятно, что вы сможете восстановить что-либо еще. Чтобы избежать повторения подобного, я бы рекомендовал настроить репозиторий на одном из различных сайтов размещения кода (github, gitorious, repo.or.cz ). У них есть поддержка частных репозиториев, если вам нужно, некоторые бесплатные, а некоторые нет.
Кроме того, резервные копии диска — это еще один способ сохранить код в безопасности.
Комментарии:
1. ха-ха-ха, да, конечно. У меня около 20 проектов в этой установке.. и все они подключены к Сети.. только этого не было… Я не знаю почему… в любом случае .. это бы решило проблему
Ответ №2:
Если вы восстановили незакрепленные объектные файлы и в их именах есть только суффикс из 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
сообщается об отсутствующих объектах, все будет сложно.)
Комментарии:
1. Спасибо. Звучит неплохо, но я не знаю python, и он пока не работает: pastebin.com/YK6r7dky
2. В этом случае у вас нет идеального восстановления объектов, поэтому это не сработает.
Ответ №3:
Если это все, что у вас есть, это маловероятно. Это не полные адреса sha (38 символов вместо 40), потому что первые два символа — это имя каталога, к которому принадлежат эти объекты.
Если у вас нет чего-то другого.
Комментарии:
1. Да — это не сильно поможет. Извините.
2. Восстановить полное имя объекта тривиально; вам просто нужно распаковать объект и хэшировать его.