Мне не ясно, что означает следующее (из документации по обновлению подмодуля Git ):
... сделает Подмодули ГОЛОВА быть отсоединена, если
--rebase
или--merge
не указан ...
Как --rebase
/ --merge
изменить вещи?
Мой основной вариант использования - иметь несколько центральных репозиториев, которые я буду вставлять через подмодули в другие репозитории. Я хотел бы иметь возможность улучшить эти центральные репозитории, либо непосредственно в их исходном местоположении, либо из их встраиваемых репозиториев (тех, которые используют их через субмодуль).
- Могу ли я создавать ветки / модификации из этих подмодулей и использовать push / pull точно так же, как в обычных репозиториях, или есть вещи, которые нужно соблюдать осторожность?
- Как бы я продвинул коммит, на который ссылается субмодуль, скажем, с (помеченного) 1.0 до 1.1 (даже если заголовок исходного репозитория уже находится на 2.0), или выбрал, какая фиксация ветки используется вообще?
git
git-submodules
темно-синий
источник
источник
Ответы:
Эта страница GitPro действительно суммирует последствия обновления подмодуля git
Примечание март 2013:
Как упоминалось в « последнем отслеживании подмодулей git », подмодуль сейчас (git1.8.2) может отслеживать ветку.
Смотрите "
git submodule update --remote
противgit pull
".MindTooth «сек ответ иллюстрирует обновление вручную (без локальной конфигурации):
В обоих случаях это изменит ссылки на подмодули ( gitlink , специальная запись в индексе родительского репо ), и вам нужно будет добавить, зафиксировать и отправить указанные ссылки из основного репо.
В следующий раз, когда вы будете клонировать это родительское репо, оно заполнит подмодули, чтобы отразить эти новые ссылки SHA1.
В остальной части этого ответа подробно описывается классическая функция субмодуля (ссылка на фиксированный коммит, который является основным понятием понятия подмодуля).
Итак, чтобы ответить на ваши вопросы:
Вы можете создать ветку и нажать на изменения.
ПРЕДУПРЕЖДЕНИЕ (из учебника по Git Submodule ): всегда публиковать (отправлять) изменения подмодуля, прежде чем публиковать (отправлять) изменения в суперпроект, который ссылается на него. Если вы забудете опубликовать изменение субмодуля, другие не смогут клонировать репозиторий.
Страница « Понимание подмодулей » может помочь
Вместе они триангулируют конкретную ревизию определенного репозитория, которая извлекается в определенное место в вашем проекте.
Со страницы подмодуля git
100% правильно: вы не можете изменить подмодуль, а только сослаться на один из его коммитов.
Вот почему, когда вы изменяете подмодуль из основного проекта, вы:
Подмодуль позволяет вам разрабатывать компонентный подход , когда основной проект ссылается только на конкретные коммиты других компонентов (здесь «другие репозитории Git, объявленные как субмодули»).
Подмодуль - это маркер (коммит) в другом репозитории Git, который не связан основным циклом разработки проекта: он («другое» репозиторий Git) может развиваться независимо.
Основной проект должен выбрать из этого репо то, что ему нужно.
Однако, если вы хотите, из-за удобства , изменить один из этих подмодулей непосредственно из вашего основного проекта, Git позволяет вам сделать это, при условии, что вы сначала опубликуете эти изменения подмодуля в его исходном репозитории Git, а затем подтвердите свой основной проект, ссылаясь на новая версия указанного субмодуля.
Но основная идея остается: ссылки на конкретные компоненты, которые:
Список конкретных коммитов, на которые вы ссылаетесь в своем основном проекте, определяет вашу конфигурацию (это то, чем занимается Configuration Management, включая простую систему контроля версий )
Если компонент действительно может быть разработан в то же время, что и ваш основной проект (поскольку любая модификация основного проекта будет включать изменение подкаталога и наоборот), то это будет не «подмодуль», а скорее слияние поддеревьев (также представлено в вопросе « Перенос базы устаревшего кода из cvs в распределенный репозиторий» ), связывающее историю двух репозиториев Git вместе.
Помогает ли это понять истинную природу подмодулей Git?
источник
svn:externals
.git submodule foreach
Чтобы обновить каждый подмодуль, вы можете вызвать следующую команду (в корне хранилища):
Вы можете удалить опцию -q, чтобы проследить весь процесс.
источник
git submodule update --init --recursive
из корня, он получит их все рекурсивно и инициализирует их, если это еще не сделано.git submodule update --rebase --remote
Чтобы рассмотреть вариант
--rebase
против--merge
:Допустим, у вас есть супер-репозиторий A и подмодуль B, и вы хотите выполнить некоторую работу в подмодуле B. Вы выполнили свою домашнюю работу и знаете, что после звонка
git submodule update
вы находитесь в состоянии HEAD, поэтому к любым коммитам, которые вы делаете в этот момент, трудно вернуться. Итак, вы начали работу над новой веткой в подмодуле B
Между тем, кто-то еще в проекте A решил, что последняя и самая лучшая версия B - это то, что A заслуживает. Вы по привычке объединяете самые последние изменения и обновляете свои подмодули.
О нет! Вы снова находитесь в безголовом состоянии, вероятно, потому что B теперь указывает на SHA, связанный с новым советом B, или каким-то другим коммитом. Если бы только у вас было:
Теперь эта лучшая идея для B была перенесена в новый коммит, и что более важно, вы все еще находитесь в своей ветке разработки для B, а не в безголовом состоянии!
(Изменения
--merge
будут перенесены из beforeUpdateSHA в afterUpdateSHA в вашу рабочую ветвь, в отличие от изменения ваших изменений в afterUpdateSHA.)источник
В Git 1.8.2 появилась новая опция
--remote
, которая включит именно это поведение. Бегбудет получать последние изменения из апстрима в каждом подмодуле, перебазировать их и проверять последнюю версию подмодуля. Как сказано в документации :
Это эквивалентно запуску
git pull
в каждом подмодуле, что, как правило, именно то, что вы хотите.(Это было скопировано из этого ответа .)
источник