(Git 2.22, Q2 2019, представил git submodule set-branch --branch aBranch -- <submodule_path>
)
Обратите внимание , что если у вас есть существующий подмодуль , который не отслеживание ветки еще , то ( если у вас есть GIT 1.8.2+ ):
Убедитесь, что родительское хранилище знает, что его подмодуль теперь отслеживает ветку:
cd /path/to/your/parent/repo
git config -f .gitmodules submodule.<path>.branch <branch>
Убедитесь, что ваш подмодуль на самом деле не позднее этой ветки:
cd path/to/your/submodule
git checkout -b branch --track origin/branch
# if the master branch already exist:
git branch -u origin/master master
(с именем origin, являющимся именем удаленного репо восходящего потока, с которого был клонирован подмодуль.
A git remote -v
внутри этого подмодуля будет отображать его. Обычно это «origin»)
Не забудьте записать новое состояние вашего подмодуля в родительском репо:
cd /path/to/your/parent/repo
git add path/to/your/submodule
git commit -m "Make submodule tracking a branch"
Последующее обновление для этого подмодуля должно будет использовать --remote
опцию:
# update your submodule
# --remote will also fetch and ensure that
# the latest commit from the branch is used
git submodule update --remote
# to avoid fetching use
git submodule update --remote --no-fetch
Обратите внимание, что с Git 2.10+ (3 квартал 2016 года) вы можете использовать ' .
' в качестве имени ветви:
Название филиала записывается как submodule.<name>.branch
в .gitmodules
for update --remote
.
Специальное значение .
используется, чтобы указать, что имя ветви в подмодуле должно совпадать с именем текущей ветви в текущем репозитории .
Но , как заметил по LubosD
С git checkout
, если имя ветви следовать, « .
», он будет убивать вашу неизрасходованную работу!
Используйте git switch
вместо этого.
Это означает, что Git 2.23 (август 2019) или больше.
Смотрите " Confused bygit checkout
"
Если вы хотите обновить все свои подмодули, следуя ветке:
git submodule update --recursive --remote
Обратите внимание, что результатом для каждого обновленного подмодуля почти всегда будет отдельная ГОЛОВА , как отмечает Дэн Кэмерон в своем ответе .
( Клинт отмечает в комментариях, что, если вы запустите git submodule update --remote
и полученный sha1 будет таким же, как ветвь, в которой в данный момент находится подмодуль, он ничего не сделает и оставит подмодуль все еще «в этой ветке», а не в отдельном состоянии головы. )
Чтобы убедиться, что ветвь действительно извлечена (и это не изменит SHA1 специальной записи, представляющей подмодуль для родительского репо), он предлагает:
git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; git switch $branch'
Каждый подмодуль будет по-прежнему ссылаться на тот же SHA1, но если вы сделаете новые коммиты, вы сможете их подтолкнуть, потому что на них будет ссылаться ветвь, которую вы хотите отследить подмодуль.
После этого продвижения в подмодуле не забудьте вернуться к родительскому репо, добавить, зафиксировать и отправить новый SHA1 для этих модифицированных подмодулей.
Обратите внимание на использование $toplevel
, рекомендованное в комментариях по Александр Погребняк .
$toplevel
был представлен в git1.7.2 в мае 2010 года: commit f030c96 .
он содержит абсолютный путь к каталогу верхнего уровня (где .gitmodules
находится).
dtmland
добавляет в комментариях :
Сценарий foreach не сможет извлекать подмодули, которые не следуют за веткой.
Тем не менее, эта команда дает вам оба:
git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; [ "$branch" = "" ] && git checkout master || git switch $branch' –
Та же команда, но проще для чтения:
git submodule foreach -q --recursive \
'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; \
[ "$branch" = "" ] && \
git checkout master || git switch $branch' –
umläute уточняет команду dtmland с упрощенной версией в комментариях :
git submodule foreach -q --recursive 'git switch $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
несколько строк:
git submodule foreach -q --recursive \
'git switch \
$(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
До Git 2.26 (Q1 2020) выборка, которой велено рекурсивно извлекать обновления в подмодулях, неизбежно создает пакеты вывода, и становится трудно обнаружить сообщения об ошибках.
Команда научена перечислять подмодули, которые имели ошибки в конце операции .
См. Коммит 0222540 (16 января 2020 г.) Эмили Шаффер ( nasamuffin
) .
(Слиты Junio C Hamano - gitster
- в фиксации b5c71cc , 5 февраля 2020)
fetch
: подчеркнуть неудачу во время выборки субмодуля
Подписано: Эмили Шаффер
В тех случаях, когда выборка подмодуля завершается неудачно, когда имеется много подмодулей, ошибка из-за одиночной неудачной выборки подмодуля скрывается под действием других подмодулей, если было выполнено более одной выборки fetch-by-oid
.
Вызовите ошибку поздно, чтобы пользователь знал, что что-то пошло не так и где .
Потому что fetch_finish()
вызывается только синхронно, run_processes_parallel,
мьютекс не требуется вокруг submodules_with_errors
.