#git #git-submodules
#git #git-подмодули
Вопрос:
У меня есть очень старый проект git, и я сделал git fsck
над ним. Я получаю следующий вывод:
git fsck --full
Prüfe Objekt-Verzeichnisse: 100% (256/256), Fertig.
Prüfe Objekte: 100% (35666/35666), Fertig.
error in blob 5ac33d03cc28290156dcd17cf8a4efd95adee7b9: gitmodulesPath: disallowed submodule path: --force
dangling blob dc3821dca2a21a6253c929915011e5b1be932203
После некоторого изучения текущего состояния я также проверил историю .gitmodules
файла, потому что в текущей версии не было ошибки.
Я нашел коммит более года назад, который имеет следующее .gitmodules
содержимое:
[submodule "--force"]
path = --force
url = git@gitlab.mygitserver.com:mygroup/myproject.git
в следующем коммите этот подмодуль был снова удален. итак, кто-то явно пытался выяснить, как работают подмодули. проблема в том, что теперь он находится в истории проекта.
git fsck
Действительно ли проверяется каждый .gitmodules
файл в истории, если в нем когда-либо были ошибки? И как я могу это исправить?
Ответ №1:
Возникла та же проблема, и удалось удалить сообщение об ошибке.
$ git fsck
Checking object directories: 100% (256/256), done.
Checking objects: 100% (686/686), done.
error in blob 6d244aeea44652df31a9a243a339608c7ba0ee5d: gitmodulesPath: disallowed submodule path: --force
Кто-то добавил подмодуль с именем «—force» и впоследствии удалил его, но, конечно, он все еще в истории.
Решение (возможно, вы захотите создать резервную копию своего репозитория, прежде чем пытаться это сделать …):
- Найдите коммит, который ввел ваш сломанный подмодуль «—force» (
git log --all --full-history -- "--force"
помог мне) - Удалите его с помощью интерактивной перебазировки (
git rebase -i <commit-hash-1-before>
)
(убедитесь, что вы отбросили фиксацию во всех ветвях)
Теперь у вас должен быть «висячий двоичный объект», который не принадлежит ни одному коммиту. На данный момент git fsck
все еще сообщает об ошибке.
Чтобы избавиться от большого двоичного объекта:
git reflog expire --expire=now --all
(не уверен на 100%, что это требуется)git gc --prune=now
Et voila:
$ git fsck
Checking object directories: 100% (256/256), done.
Checking objects: 100% (545/545), done.