Подмодуль Git Foreach Checkout Супермодуль филиал
Рассмотрим git-репозиторий Foo/, который имеет подмодули bar1/ и bar2/.
Каждый из них имеет одинаковые ветви: 1 и 2.
Я вхожу в супермодуль и хочу обновить супермодуль, чтобы он содержал самые последние коммиты из источников bar1 и bar2. Я уже установил и обновил супермодуль, поэтому в bar1 и bar2 есть рабочие деревья, но они находятся в отдельном состоянии. Я могу сделать следующее:
cd foo;
git checkout 1
git submodule foreach git checkout 1
git pull
Теперь, что меня беспокоит, так это повторение идентификатора ветки. Могу ли я сделать что-то вроде "подмодуль git foreach git checkout $CURRENT_BRANCH_ID"? Есть ли лучшая альтернатива?
2 ответа
Подмодуль по умолчанию всегда находится в режиме отсоединенного HEAD.
Вы можете заставить каждый подмодуль следовать за веткой.
Смотрите " Как сделать существующий субмодуль отслеживающим ветку".
cd /path/to/your/parent/repo/Foo
git config -f .gitmodules submodule.bar1.branch branch1
git config -f .gitmodules submodule.bar2.branch branch2
Тогда все, что вам нужно сделать, это:
git submodule update --remote
Это обновит каждый подмодуль до последней соответствующей ветки (выборка + извлечение).
Код
Вот скрипт, который я упомянул в своем комментарии:
function checkout_branch_not_refs() {
for line in $(git config --list | awk -F'[.=]' '/submodule.*branch/ {print $2","$4}'); do
IFS=',' read -r submodule branch <<< "$line"
if ! [ -d "$submodule" ]; then
echo "Cannot switch branch to '$branch' for submodule '$submodule'"
continue
fi
pushd "$submodule" && git switch "$branch" && popd
done
}
использоваться как
checkout_branch_not_refs
git submodule foreach git pull
Объяснение различий
Оригинальный ответ
git submodule update --remote
делает именно то, что вы от него просите. Он обновляет подмодуль, просматривая файл remote. Пульт настроен в
.gitmodules
. В
update --remote
команда ищет
submodule.<submodule_name>.branch
key & проверяет эту фиксацию напрямую.
ASCII-арт:
HEAD ------------\
\
V
remote branch --> Commit
Мой ответ
checkout_branch_not_refs
Эта команда проверит саму ветку.
HEAD
->
Branch
->
commit
.
ASCII-арт:
HEAD --> local branch --> Commit
Обязательным условием этого ответа является понимание разницы между локальной ветвью и удаленной ветвью. Это ответ на то, почему мы должны бежать
git pull
в подмодуле после.