Можно ли проверять ветви главного репозитория синхронно с подмодулями?


Чего я хочу добиться, так это всякий раз, когда я использую git checkout на моем основном репозитории, например:

git checkout my-branch

Мои подмодули будут следовать за моей ветвью вместо отделенной головы.

Возможно ли это, и если да, то как?
1 2

1 ответ:

Если эти репозитории подмодулей имеют свою собственную ветвь my, они могут быть объявлены следующими за этой ветвью

cd /path/to/your/parent/repo/Foo
git config -f .gitmodules submodule.bar1.branch my-branch
git config -f .gitmodules submodule.bar2.branch my-branch

git submodule update --remote

Но это подразумевает повторение этого каждый раз, когда вы проверяете ветвь в Родительском РЕПО.

Торек указывает в комментариях, что эти подмодули могут иметь свои собственные подмодули, поэтому необходимо использовать опцию --recursive.

Вы также можете добавить --recursive и/или --no-fetch в свою команду git submodule update --remote.
Вместо отдельных операций git config -f Вам может понадобиться git submodule foreach, опять же, возможно, с --recursive.

git submodule foreach -q --recursive 'git config -f $toplevel/.gitmodules submodule.$name.branch my_branch'

В нескольких строках для удобства чтения:

git submodule foreach -q --recursive \
  'git config -f $toplevel/.gitmodules submodule.$name.branch my_branch'

Затем вы можете проверить каждый подмодуль в этой ветви:

git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; git checkout $branch'

В нескольких строках для удобства чтения:

git submodule foreach -q --recursive \
  'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; \
   git checkout $branch'