Ответ 1
Короткий ответ:
cd ProjectFooBarCommoneSubmodule
git checkout master
<Do your editing>
git commit --all -m "Lots of fixes"
git push submodule_origin master
cd ..
git add ProjectFooBarCommoneSubmodule
git commit -m "Bumped up the revision of ProjectFooBarCommoneSubmodule"
git push origin master
Чем длиннее:
ПодмодулиGit - это механизм зависимости, где основной проект (скажем, A) определяет указанную ревизию в подпроекте (скажем, B), который будет использоваться при построении проекта A. Для того чтобы инструмент был полезным, поведение должно быть предсказуемым с точки зрения A: s. Зависимости не могут измениться, если кто-то не решит включить изменение в проект A. Могут произойти всевозможные неприятные вещи: автоматически ли импортировались изменения проекта B: s, из которых ошибки компиляции, вероятно, являются лучшими, поскольку A незамедлительно заметил бы сбои. Вот почему головка B: s находится в отключенном состоянии.
Состояние B хранится в (проверьте git submodule status
), и изменение изменения должно быть выполнено и зафиксировано в A, чтобы оно имело какой-либо эффект. Это то, что происходит в приведенном выше примере, A изменяет номер ревизии, хранящийся в репо, и набирает версию до последней. Этот процесс необходимо будет повторить и в другом основном репо, поэтому автоматическое "использование мастер-переключателя" AFAIK.
BTW. Git глава книги о подмодулях и моей учетной записи github. Коммиты не имеют смысла и содержат мусор, но настройка должна быть прекрасной. Пожалуйста, проверьте это, чтобы следовать.
Оба ProjectFoo и ProjectBar совместно используют код в общем подмодуле.
ProjectFooBarCommoneSubmodule: master 6850e4e4c1fac49de398
В ProjectFoo:
git submodule status
-6850e4e4c1fac49de39890703f21486ca04b87a0 общий
В ProjectBar:
git submodule status
-6850e4e4c1fac49de39890703f21486ca04b87a0 общий
Итак, оба указывают на ту же ревизию, верно? Трюк здесь заключается в том, чтобы увидеть, что ProjectFoo и ProjectBar указывают на версию (6850e4e4c1fac49de39890703f21486ca04b87a0) не ветвь (мастер), хотя они - одно и то же. Первая - отдельная голова, а другая - именованная ветка.
Если вы хотите сделать некоторые исправления в ProjectFooBarCommoneSubmodule, вы можете перейти к поддиректору, например. ProjectFoo и выберите ветку вместо ревизии:
git checkout master
<Do your coding and pushing here>
Затем перейдите в один каталог вверх и проверьте состояние подмодуля git. Он должен сказать вам, что вы сейчас не синхронизированы. Например
git submodule status
+ e24bd2bf45d52171a63b67ac05cd4be0ac965f60 общий (heads/master-1-ge24bd2b)
Теперь вы можете сделать git add, чтобы установить ссылку на эту конкретную фиксацию (ge24bd...), выполнить фиксацию, и после этого ссылка на подмодуль указывает на эту ревизию, которая также является мастером на ProjectFooBarCommoneSubmodule.
Теперь вам нужно обновить ссылку в ProjectBar. Перейдите в ProjectBar/common и выполните git fetch origin (это быстрое слияние вперед), do
git checkout master
cd ..
git add common
git commit -m "Bumped up the revision"
git push origin master # to publish the revision bump to everybody else
Итак, как и в любом репозитории git, вам не нужно работать с отдельной головой. Вы можете либо работать с мастером, либо создать именованную ветку. В любом случае, убедитесь, что вверх по потоку содержит изменения ProjectFooBarCommoneSubmodule, или вы сломаете ProjectFoo и ProjectBar, если они ссылаются на то, что не существует. Надеюсь, это объяснило это лучше.