Вопрос

Мне не ясно, что означает следующее (от GIT Submodule Update документация):

... заставит подмодули головку отстранена, если только --rebase или же --merge указан ...

Как это --rebase/--merge изменить вещи?

Мой основной вариант использования состоит в том, чтобы иметь кучу центральных репозиториев, которые я внедряю через подмодулы в другие репозитории. Я хотел бы иметь возможность улучшить эти центральные репозитории, либо непосредственно в их первоначальном месте, либо из их встраивающих репозитории (те, которые используют их через подмодуль).

  • Изнутри этих подмодулей, могу ли я создавать ветви/модификации и использовать Push/Pull, как я бы в обычных репозиториях, или есть что -то, что можно осторожно?
  • Как бы я продвигал подмодуль, ссылаясь на коммит, скажем, (с меткой) от 1,0 до 1.1 (даже если глава первоначального репозитория уже на 2,0), или выбрать коммит какой филиала вообще?
Это было полезно?

Решение

Этот Gitpro Page прекрасно обобщает последствия обновления подмодуля GIT

Когда вы бежите git submodule update, он проверяет конкретную версию проекта, но не в филиале. Это называется с отдельной головой - это означает, что файл головы непосредственно указывает непосредственно на коммит, а не на символическую ссылку.
Проблема в том, что вы, как правило, не хотите работать в отдельной головной среде, потому что легко потерять изменения.
Если вы выполняете первоначальное обновление подмодуля, совершите в этом каталоге подмодулей без создания филиала для работы, а затем снова запустите обновление GIT Submodule от SuperProject, не выполняя в то же время, GIT будет перезаписать ваши изменения, не сказав вам. Технически вы не потеряете работу, но у вас не будет указания филиала, поэтому будет несколько сложно получить.


Примечание марта 2013:

Как упоминалось в "GIT Submodule отслеживает последнее"Сейчас подмодуль (GIT1.8.2) может отслеживать ветвь.

# add submodule to track master branch
git submodule add -b master [URL to Git repo];

# update your submodule
git submodule update --remote 
# or (with rebase)
git submodule update --rebase --remote

Видеть "git submodule update --remote против git pull".

MindtoothS. отвечать Иллюстрируйте ручное обновление (без локальной конфигурации):

git submodule -q foreach git pull -q origin master

В обоих случаях это изменит ссылки на подмодули ( Гитлинк, а Специальная запись в родительском индексе репо), и вам нужно будет добавить, совершать и вытащить указанные ссылки из основного репо.
В следующий раз, когда вы будете клонировать этот родительский репо, он заполнит подмодули, чтобы отразить эти новые ссылки на SHA1.

Остальная часть этого ответа подробно описывает классическую функцию подмодуля (ссылка на исправлено Коммит, который является всем, что стоит за понятием подмодуля).


Чтобы избежать этой проблемы, создайте филиал, когда вы работаете в каталоге подмодулей с работой GIT Checkout -B или чем -то эквивалентным. Когда вы делаете обновление подмодуля во второй раз, оно все равно вернет вашу работу, но, по крайней мере, у вас есть указатель, чтобы вернуться.

Переключение ветвей с подмодулями также может быть сложным. Если вы создаете новую ветвь, добавьте там подмодуль, а затем переключитесь обратно в ветку без этого подмодуля, у вас все равно есть каталог подмодулей в качестве не отказанного каталога:


Итак, чтобы ответить на ваши вопросы:

Могу ли я создавать филиалы/модификации и использовать Push/Pull, как я бы в обычных репо, или есть что -то, что можно осторожно?

Вы можете создать ветвь и протолкнуть модификации.

Предупреждение (от GIT Submodule Tutorial): Всегда публикуйте (толкайте) изменение подмодуля перед публикацией (push) изменение на суперпроект, который ссылается на него. Если вы забудете опубликовать изменение подмодуля, другие не смогут клонировать репозиторий.

Как я бы продвигал подмодуль, ссылаясь на коммит, скажем, (с меткой) от 1,0 до 1.1 (хотя голова оригинального репо уже находится на 2,0)

Страница "Понимание подмодулей" может помочь

GIT -подмодулы реализованы с использованием двух движущихся частей:

  • а .gitmodules Файл и
  • Особый вид объекта дерева.

Они вместе триангулируют конкретный пересмотр конкретного репозитория, который проверяется в определенном месте в вашем проекте.


От GIT Submodule Page

Вы не можете изменить содержимое подмодуля из основного проекта

100% Правильно: вы не можете изменить подмодуль, обратитесь к одному из его коммитов.

Вот почему, когда вы модифицируете подмодуль из основного проекта, вы:

  • нужно совершать и толкать в пределах подмодуль (к модулю вверх по течению) и
  • Затем поднимитесь в своем основном проекте и переосмыслите (для того, чтобы этот основной проект обратился к новому подмодульскому коммитию, которую вы только что создали и настаивали)

Подмодуль позволяет вам иметь Подход на основе компонентов Разработка, где основной проект относится только к конкретным коммитам других компонентов (здесь «другие репозитории GIT объявлены как субмодулы»).

Подмодуль является маркером (совершением) для другого репозитория GIT, который не связан основным циклом разработки проекта: он (другие »GIT Repo) может развиваться независимо.
Основной проект должен выбрать из этого другого репо, что ему нужно.

Однако, если вы хотите, из удобства, изменить один из этих подмодулей непосредственно из вашего основного проекта, GIT позволяет вам сделать это, при условии, что вы первый опубликовать эти модификации подмодулей в свой оригинальный GIT Repo, и тогда Сделайте свой главный проект, ссылаясь на новый Версия указанного подмодуля.

Но основная идея остается: ссылка на конкретные компоненты, которые:

  • иметь свой собственный жизненный цикл
  • иметь свой собственный набор тегов
  • иметь свое собственное развитие

Список конкретных коммитов, на которые вы ссылаетесь в своем основном проекте, определяет ваш конфигурация (Это то, что Конфигурация Управление - это все, что я просто Система управления версиями)

Если компонент действительно может быть разработан в то же время В качестве вашего основного проекта (поскольку любая модификация в основном проекте будет включать изменение подканализации и наоборот), тогда это будет «подмодуль» не более, но слияние подреж (также представлено в вопросе Передача унаследованного кодекса из CVS в распределенный репозиторий), связывая историю двух git Repo вместе.

Помогает ли это понять истинную природу подмодулей GIT?

Другие советы

Чтобы обновить каждый подмодуль, вы можете вызвать следующую команду (в корне репозитория):

git submodule -q foreach git pull -q origin master

Вы можете удалить -q возможность следовать всему процессу.

Чтобы решить --rebase против. --merge вариант:

Скажем так

git submodule update

Вы находитесь в состоянии без головы, поэтому в этот момент трудно вернуться в этот момент, которые вы делаете. Итак, вы начали работать над новым филиалом в подмодуле B

cd B
git checkout -b bestIdeaForBEver
<do work>

Между тем, кто -то еще в проекте A решил, что последняя и самая большая версия B действительно заслуживает. Вы, из привычки, объединяете самые последние изменения и обновляете свои подмодули.

<in A>
git merge develop
git submodule update

О, нет! Вы снова вернулись в безголостное состояние, вероятно, потому, что B теперь указывает на SHA, связанное с новым советом B или какой -то другой коммит. Если бы у тебя было:

git merge develop
git submodule update --rebase

Fast-forwarded bestIdeaForBEver to b798edfdsf1191f8b140ea325685c4da19a9d437.
Submodule path 'B': rebased into 'b798ecsdf71191f8b140ea325685c4da19a9d437'

Теперь, когда лучшая идея для B была перезанаточена на новом коммите, и, что более важно, вы все еще находитесь в своем филиале по разработке для B, а не в безголовом состоянии!

( --merge Сочетает изменения от до начала доштаба до Afterupdatesha в вашу рабочую филиал, а не перебазнуть ваши изменения в Afterupdatesha.)

GIT 1.8.2 имеет новую опцию,--remote, это позволит именно такому поведению. Бег

git submodule update --rebase --remote

Принесет последние изменения от UPSTREAM в каждом подмодуле, повторно их и ознакомьтесь с последним пересмотром подмодуля. В качестве документация кладет это:

--удаленный

Эта опция действительна только для команды Update. Вместо того, чтобы использовать записанный SHA-1 SuperProject для обновления подмодуля, используйте статус удаленного отслеживания подмодуля.

Это эквивалентно бегу git pull В каждом подмодуле, который, как правило, именно то, что вы хотите.

(Это было скопировано из этот ответ.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top