Почему git не удается получить определенный допустимый подмодуль для данного коммита и как его исправить?

У меня есть git repo, у которого есть еще одна зависимость submodule. В корне моего проекта (где .git, .gitsubmodules и т.д.) Я вызывал

git submodule update

Не удалось выполнить следующее сообщение:

Выбрано в подмодульном пути 'src/framework', но не содержит cc8c38e9d853491c672452d8dbced4666fc73ec8. Неправильная выборка этого сообщения не удалась.

где src/framework является подкаталогом моего проекта (PROJECT_ROOT/src/framework) и должен быть там, где применяется стороннее репо. Данный хеш фиксации является допустимым.

Я также пробовал git clone --recursive <my-repo>, но он тоже не работает.

Содержимое моего .gitsubmodules равно

[submodule "src/framework"]
        path = src/framework
        url = [email protected]:gh/framework.git

В дополнение к этому я должен отметить следующий важный факт: из-за недавних обновлений в реестре framework мой код прерывается, поэтому мне действительно нужно получить эту конкретную версию, где все работает нормально.

Ответ 1

Да, я могу перейти по ссылке в моем веб-браузере (используя GitLab)

Можете ли вы клонировать этот репо с включенным коммитом?
GitLab имеет уровень разрешений, который ограничивает доступ, поэтому убедитесь, что ваши команды git clone выполняются с нужным пользователем и с ключами ssh в указанном user home directory/.ssh.

Если вы не можете клонировать репозиторий субмодуля самостоятельно (в любом месте на локальном жестком диске), это объяснит сообщение об ошибке.

Проблема возникла у кого-то, кто сделал сброс головы на коммит до того, который был связан как подмодуль в репозитории, с которым я работал. Это сделало ссылку недействительной. Я понятия не имею, как это исправить

Вы можете убедиться, что подмодуль следует за веткой (здесь, например, master):

cd /path/to/parent/repo
git config -f .gitmodules submodule.bar1.branch master

Затем обновите подмодуль на последнем извлеченном master фиксации.

git submodule update --remote

Опция --remote гарантирует, что она не будет использовать записанные в SHA-1 суперпроекты для обновления субмодуля, а вместо этого будет использовать состояние ветки удаленного отслеживания субмодулей.

Это позволило бы избежать сообщения об ошибке " did not contain cc8c38e9d853491c672452d8dbced4666fc73ec8 ".

Ответ 2

Проблема для меня заключалась в том, что субмодуль указывал на личный (клон) репозиторий, размещенный на github.

У меня было несколько репозиториев, содержащих ссылку на один и тот же субмодуль. Я изменил ГОЛОВУ субмодуля в одном из этих репозиториев и зафиксировал репозиторий. К сожалению, я не смог отправить новый подмодуль HEAD на github, поэтому в других экземплярах репозитория не было записи о самом последнем заголовке, даже после git submodule update и т.д.

Ответ 3

Выполнение этой команды после клонирования (и получения ошибки) решило мою проблему:

git submodule update --force --recursive --init --remote

Конечно, это не очень хорошее решение. Лучше найти и решить основную проблему, но если кто-то спешит, это сработало для меня.