Восстановить недостающее дерево
Мой git-репозиторий поврежден и, к сожалению, существует только локально.
$ git fsck --full
Checking object directories: 100% (256/256), done.
broken link from tree 54b4ff576b2e39831a298e58a38d91890f622b63
to tree d564d0bc3dd917926892c55e3706cc116d5b165e
missing tree d564d0bc3dd917926892c55e3706cc116d5b165e
Я проверил, что d564d0bc
есть, и это мое log/
папка в проекте рельсов. Эта папка содержит только *.log
файлы (которые игнорируются) и .gitkeep
файл.
Я попытался выполнить шаги, упомянутые в этом посте, но я использую GitHub для Windows, и powershell кричит на меня из-за пустой трубы.
Любая помощь приветствуется.
Обновление: я скопировал проект в Linux, чтобы мне не пришлось беспокоиться о командах powershell. Я до сих пор не нашел решение, хотя.
1 ответ
Если вы уверены, что отсутствующее дерево содержит только файл.gitkeep, и у вас есть его содержимое, то можно восстановить отсутствующее дерево.
Все, что вам нужно знать, это набор команд git низкого уровня? Вы готовы? Идти! Прежде всего. Вам нужно использовать git mktree
,
Эта команда читает данные из стандартного ввода и создает дерево на основе этой информации. Он выводит сумму sha1 вновь созданного дерева (не забудьте проверить, что оно равно d564d0bc3dd917926892c55e3706cc116d5b165e)
Дальше нужно знать какой формат этого ввода?! Формат следующий
<mode> SP <type> SP <object> TAB <file>
где SP - пробел, TAB - табуляция.
- это файловый режим
- тип объекта git (блоб для файлов, дерево для папок)
- это sha1 хеш объекта
- это имя файла
Позвольте мне показать пример. Создать дерево из этой папки (файл some_file пуст)
drwxrwxr-x 2 aleksandr aleksandr 4096 2012-07-25 03:51 .
drwxrwxr-x 4 aleksandr aleksandr 4096 2012-07-25 03:54 ..
-rw-rw-r-- 1 aleksandr aleksandr 0 2012-07-25 03:51 some_file
тебе нужно бежать
echo -e "100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391\tsome_file" | git mktree
Но как вы узнали нужный хэш sha1?! git hash-object
в помощь. Просто
git hash-object log/.gitkeep
определить его хеш. Я думаю, что все, что вам нужно знать, чтобы восстановить ваш репозиторий.