Вытяните все подмодули в определенную ветку

Предположим следующую структуру git с подмодулями:

root
|-- .gitmodules
|-- X
    |-- submodule 1
    |-- submodule 2
    ..
    |-- submodule N

Предположим, что я работаю над веткой feature_B из верхнего модуля и вручную создаю ветку с именем feature_B в каждом подмодуле.

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

cd $TOPMODULE
git checkout master 
git pull #just to be sure
git submodule update --init --recursive --force

# do all the testing I need on master

Однако последняя команда сбросила каждый подмодуль до фиксации, указанной в верхнем модуле. Теперь я хочу вернуться к feature_B для каждого подмодуля, имеющего такую ​​ветку. Как я могу сделать?

Конечно, я могу вручную cd в каждый подмодуль и git checkout feature_B, но предположим, что у меня много подмодулей, или, черт возьми, даже только 5, я бы хотел программный способ сделать это.

Я придумал следующий код, но я хотел бы знать, есть ли команда git, чтобы сделать трюк

#!/bin/bash
#set -x
#set -e

cd $TOPMODULE

BRANCH_NAME=$1
SUBS=$( cat .gitmodules | grep -Po "(?<=path = )keyword.*" )
git show-ref --verify --quiet refs/heads/${BRANCH_NAME}

for SUBMODULE_PATH in ${SUBS}
do
    cd $SUBMODULE_PATH
    
    if git show-ref --verify --quiet refs/heads/${BRANCH_NAME}; then
        #echo "checkout " $BRANCH_NAME "in" $SUBMODULE_PATH 
        git checkout $BRANCH_NAME
        git pull
    else 
        echo $BRANCH_NAME "does not exist in" $SUBMODULE_PATH  
    fi
    cd - 
done

Спасибо за вашу помощь!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
git submodule foreach git fetch
git submodule foreach git checkout origin/feature_B

или если вы знаете, что ваши обновления feature_B всегда «чисты», они всегда являются прямыми потомками существующего совета,

git submodule foreach git pull --ff-only origin feature_B

или см. здесь, чтобы рассказать Git о восходящих ветках.

Большое спасибо! Будет ли эта команда неудачной, если feature_B не является ветвью в одном подмодуле?

Fra93 22.11.2022 15:33

Да, см. связанный ответ для одного из способов настройки ветвей для каждого подмодуля.

jthill 22.11.2022 15:37

Поэтому, если не все подмодули имеют нужную мне ветку функций, мне все равно нужно использовать сценарий bash, который я добавил в своем вопросе, или я настраиваю каждую ветку вручную. Достаточно честно, я не могу ожидать, что git сам по себе покроет все возможные сценарии. Спасибо!

Fra93 22.11.2022 15:44

Другой способ — настроить спецификацию выборки в каждом подмодуле, чтобы сопоставить восходящую ветвь, которую вы хотите, с конкретной ссылкой отслеживания.

jthill 22.11.2022 16:00

Другие вопросы по теме