Я получил похожую ошибку в моем Homebrew инсталляционном репозитории Git. Вместо того, чтобы восстанавливать все отсутствующие объекты один за другим, я обнаружил, что проще просто удалить каталог .git
и создать его заново путем повторного клонирования из открытого хранилища Homebrew . Это были мои шаги:
- Проверьте, какую информацию у вас есть в вашем Git-репозитории, которую вы не получите, просто перекодировав. Для меня это были частные филиалы, тайники и пульты.
- Преобразуйте тайники в реальные коммиты, создав новую ветку, применив тайник и зафиксировав что-то вроде «[WIP]» в имени, чтобы показать, что это тайник.
- Сохраняйте ветки, которые не находятся на общедоступном пульте, передавая их на свой пульт. Это может быть форк репозитория на GitHub или просто новый репозиторий Git в другом месте на вашем компьютере.
- Если у вас более одного пульта, сохраните вывод
git remote -v
, который содержит имена и URL-адреса ваших пультов, чтобы вы могли вручную добавить их позже.
- Удалите каталог вашего хранилища
.git
(или переименуйте его в .git-broken
и удалите его позже). В командной строке это rm -rf .git
.
- Повторно клонируйте удаленный каталог с
git clone https://github.com/Homebrew/homebrew.git
или любым другим URI.
- Это создаст новую подпапку
homebrew
, названную в честь хранилища. Вы хотите только каталог .git
из этого; ваши локальные файлы уже в порядке. Итак, mv homebrew/.git .git
, а затем удалите папку homebrew
.
- В вашем репозитории Git не должно быть ошибок, поскольку вы воссоздали его с нуля. Теперь просто восстановите любую информацию, которую вы сохранили на первом этапе.
- Если у вас были дополнительные пульты, добавьте их снова с помощью
git remote add <name> <url>
.
- Если вы создали резервные копии ветвей (или хранилищ, преобразованных в ветви) в удаленный репозиторий, перетащите их из этого репозитория в локальный репозиторий.
- Если хотите, вы можете преобразовать ветки stash обратно в хранилища, выполнив коммит «[WIP]» с помощью
git reset HEAD^
и снова сохранив рабочий каталог в хранилище с помощью git stash save <custom-message>
.
Если вы запустите git fsck
, вы не увидите ошибок:
$ git fsck
Checking object directories: 100% (256/256), done.
Checking objects: 100% (197135/197135), done.
Checking connectivity: 197162, done.
$
И git stash list
, git branch
и git remote -v
должны показывать тот же вывод, что и раньше.