Как исправить ‘gitmodulesPath: запрещенный путь к подмодулю’ в ‘git fsck’

#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» и впоследствии удалил его, но, конечно, он все еще в истории.

Решение (возможно, вы захотите создать резервную копию своего репозитория, прежде чем пытаться это сделать …):

  1. Найдите коммит, который ввел ваш сломанный подмодуль «—force» ( git log --all --full-history -- "--force" помог мне)
  2. Удалите его с помощью интерактивной перебазировки ( git rebase -i <commit-hash-1-before> )

(убедитесь, что вы отбросили фиксацию во всех ветвях)

Теперь у вас должен быть «висячий двоичный объект», который не принадлежит ни одному коммиту. На данный момент git fsck все еще сообщает об ошибке.

Чтобы избавиться от большого двоичного объекта:

  1. git reflog expire --expire=now --all (не уверен на 100%, что это требуется)
  2. git gc --prune=now

Et voila:

 $ git fsck  
Checking object directories: 100% (256/256), done.
Checking objects: 100% (545/545), done.