Предположим следующую структуру 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
Спасибо за вашу помощь!
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 о восходящих ветках.
Да, см. связанный ответ для одного из способов настройки ветвей для каждого подмодуля.
Поэтому, если не все подмодули имеют нужную мне ветку функций, мне все равно нужно использовать сценарий bash, который я добавил в своем вопросе, или я настраиваю каждую ветку вручную. Достаточно честно, я не могу ожидать, что git сам по себе покроет все возможные сценарии. Спасибо!
Другой способ — настроить спецификацию выборки в каждом подмодуле, чтобы сопоставить восходящую ветвь, которую вы хотите, с конкретной ссылкой отслеживания.
Большое спасибо! Будет ли эта команда неудачной, если
feature_B
не является ветвью в одном подмодуле?