Подмодуль 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>.branchkey & проверяет эту фиксацию напрямую.

ASCII-арт:

      HEAD ------------\
                  \
                   V
remote branch --> Commit

Мой ответ

      checkout_branch_not_refs

Эта команда проверит саму ветку. HEAD-> Branch-> commit.

ASCII-арт:

      HEAD --> local branch --> Commit

Обязательным условием этого ответа является понимание разницы между локальной ветвью и удаленной ветвью. Это ответ на то, почему мы должны бежать git pullв подмодуле после.

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