Ремонт пропавшего дерева

My git repo стал поврежденным и, к сожалению, он существует только локально.

$ git fsck --full
Checking object directories: 100% (256/256), done.
broken link from    tree 54b4ff576b2e39831a298e58a38d91890f622b63
              to    tree d564d0bc3dd917926892c55e3706cc116d5b165e
missing tree d564d0bc3dd917926892c55e3706cc116d5b165e

Я проверил, в чем находится d564d0bc, и это моя папка log/ в проекте rails. Эта папка содержит только файлы *.log (которые игнорируются) и файл .gitkeep.

Я попытался выполнить шаги, упомянутые в этом сообщении , но я использую GitHub для Windows, и powershell кричит на меня по пустой трубе.

Любая помощь приветствуется.

Обновление: я скопировал проект в Linux, поэтому мне не пришлось бы беспокоиться о командах powershell. Я все еще не нашел решения, хотя.

Ответ 1

Если вы уверены, что отсутствующее дерево содержит только файл .gitkeep, и у вас есть его содержимое, то можно восстановить отсутствующее дерево.

Все, что вам нужно знать, это куча низкоуровневых команд git? Вы готовы? Идти! В первую очередь. Вам нужно использовать git mktree.

Эта команда считывает данные stdin и создает дерево на основе этой информации. Он выводит суммирование sha1 вновь созданного дерева ( Не забывайте, чтобы проверить, что он равен d564d0bc3dd917926892c55e3706cc116d5b165e)

Следующее, что вам нужно знать, какой формат этого входа?! Формат следующий

<mode> SP <type> SP <object> TAB <file>

где SP - это пробел, TAB - это вкладка.

  • - это режим файла
  • - это тип объекта git (blob для файлов, дерево для папок)
  • является хэш-символом 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

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