Почему 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
Конечно, это не очень хорошее решение. Лучше найти и решить основную проблему, но если кто-то спешит, это сработало для меня.