(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
(З «» походження є ім'я вищого віддалений репозиторій підмодуля був клонований з.
А git remote -v
всередині , що подмодуль буде відображати його. Як правило, це «походження»)
Не забудьте записати новий стан вашого підмодуля у своєму батьківському репо:
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+ (Q3 2016) ви можете використовувати " .
" як ім'я гілки:
Назва філії записується як submodule.<name>.branch
у .gitmodules
для update --remote
.
Особливе значення .
використовується для вказівки на те, що назва гілки в підмодулі має бути тим самим іменем, що і поточна гілка в поточному сховищі .
Але , як зауважив по LubosD
Якщо git checkout
, якщо назва гілки, яку слід слідувати, " .
", це вб'є вашу незайняту роботу!
Використовуйте git switch
замість цього.
Це означає Git 2,23 (серпень 2019 року) або більше.
Див. " Плутатиgit 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 (I квартал 2020 р.) Виборка, яку повідомляють рекурсивно отримувати оновлення в підмодулях, неминуче створює перетворення результатів, і стає важко помітити повідомлення про помилки.
Команду вчили перелічувати підмодулі, які мали помилки в кінці операції .
Див. Комітет 0222540 (16 січня 2020 р.) Емілі Шаффер ( nasamuffin
) .
(Об'єднав Хуніо С Хамано - gitster
- у комітеті b5c71cc , 05 лютого 2020 р.)
fetch
: підкреслити збій під час отримання субмодуля
Підписався: Емілі Шаффер
У випадках, коли підбір модуля виходить з ладу, коли є багато підмодулів, помилка від самотнього виходу з ладу підмодуля переховується під активністю на інших підмодулях, якщо більше одного з них випало fetch-by-oid
.
Викликайте помилку пізно, щоб користувач усвідомлював, що щось пішло не так, і де .
Тому що fetch_finish()
викликається лише синхронізуванням, run_processes_parallel,
ніколи не вимагається навколо них submodules_with_errors
.