Восстановить недостающее дерево

Мой 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

определить его хеш. Я думаю, что все, что вам нужно знать, чтобы восстановить ваш репозиторий.

Другие вопросы по тегам