Рекурсивное нажатие подмодулей приводит к фатальным последствиям: src refspec должен указать ссылку, если содержащий проект не находится в главной ветке

У меня есть репозиторий git с тремя подмодулями. Содержащий репозиторий имеет две ветки master и develop. Все подмодули имеют только одну ветвь — ветвь master.

Когда содержащий репозиторий находится в основной ветке, отправка в источник через git push --recurse-submodules=on-demand работает, как и ожидалось. Выталкиваются как содержащий проект, так и его подмодули.

Теперь вот проблема. Когда содержащий репозиторий находится в ветке develop, у меня возникает проблема при отправке через git push --recurse-submodules=on-demand. Операция push отменяется и печатается сообщение об ошибке.

Вот полный вывод, который я получаю от git:

$ git push --recurse-submodules=on-demand
fatal: src refspec 'refs/heads/develop' must name a ref
fatal: process for submodule 'Frameworks/OpenLearnWareClient' failed

Я могу смягчить эту проблему, сначала отправив изменения в каждый подмодуль вручную, а затем отправив содержащий их репозиторий. Однако это очень утомительно и противоречит цели --recurse-submodules=on-demand.

Вот мой файл .gitmodules:

[submodule "Frameworks/OpenLearnWareKit"]
    path = Frameworks/OpenLearnWareKit
    url = [email protected]:kaiengelhardt/OpenLearnWareKit.git
    branch = master
[submodule "Frameworks/OpenLearnWareClient"]
    path = Frameworks/OpenLearnWareClient
    url = [email protected]:kaiengelhardt/OpenLearnWareClient.git
    branch = master
[submodule "Frameworks/KEFoundation"]
    path = Frameworks/KEFoundation
    url = [email protected]:kaiengelhardt/KEFoundation.git
    branch = master

Я использую git версии 2.20.1 (Apple Git-117).

Кто-нибудь знает, что здесь происходит не так и как заставить работать рекурсивное нажатие?


person Kai Engelhardt    schedule 23.04.2019    source источник
comment
это может помочь   -  person gavin    schedule 23.04.2019
comment
@gavin Это то, что уже делает OP, но в данном случае это не удается.   -  person Konrad Rudolph    schedule 21.05.2019
comment
Это абсолютно похоже на ошибку самого git. Все еще получаю это с git версии 2.24.0 на macOS Mojave. Я не знаю, как зарегистрировать ошибку с помощью git, но все, что нужно сделать, это указать ссылку на этот вопрос SO.   -  person Devin Rhode    schedule 25.11.2019
comment
Только что узнал, что я могу успешно запустить git push --recurse-submodules=on-demand в своей ветке dev, и он успешно отправил новую фиксацию в подмодуль. (Примечание: здесь не использовался рабочий процесс PR, просто отправка прямо в мою собственную ветку)   -  person Devin Rhode    schedule 25.11.2019
comment
Я получил эту ошибку при использовании сторонних подмодулей и обнаружил, что могу заставить пройти --recurse-submodules=no. Очевидно, что в ОП дело обстоит иначе, но оставить этот комментарий для будущих искателей. Оба моих подмодуля имеют отдельные головы.   -  person Adam J Richardson    schedule 15.05.2021


Ответы (1)


Насколько я могу судить (хочу оказаться неправым!) это невозможно. Ветки в подмодулях - странный зверь.

Близкий обходной путь — использовать команду git submodule foreach для выполнения push-уведомлений. Это все еще раздражает, но, по крайней мере, решает «утомительный» аспект. Объедините команды следующим образом, чтобы убедиться, что неудачная отправка подмодуля прерывает отправку родительского модуля:

git submodule foreach --recursive 'git push' &&
git push

Насколько я могу судить, это эквивалентно передаче --recurse-submodules=on-demand, но работает с ветвями.

person Konrad Rudolph    schedule 21.05.2019