Как настроить git-проект для использования субмодуля внешнего репо?

213

Я хотел бы создать репо, которое тянет в удаленном репо.

Например, скажем, jQuery как подмодуль:

git://github.com/jquery/jquery.git

Каков будет процесс создания репо с jQuery в качестве подмодуля и добавления моего внешнего в качестве удаленного репо.

Кроме того, если после настройки это произойдет, если я нажму / потяну к своему пульту, внешнее устройство останется неповрежденным?

Том
источник
1
Когда вы говорите «втянуть», вы хотите сказать, что хотите, чтобы репозиторий jQuery был подмодулем вашего собственного репо?
езод
Да, извините, если это не ясно. Я хотел бы знать, как я настроил это как внешнее устройство, одновременно нажимая и вытягивая изменения на моем собственном пульте
Том
Смотрите Учебное пособие по подмодулям Git в git wiki.
Грег Бэкон

Ответы:

343
  1. У вас есть проект - назовите его MyWebApp , у которого уже есть репозиторий github
  2. Вы хотите использовать репозиторий jquery в своем проекте
  3. Вы хотите вставить репозиторий jquery в свой проект как субмодуль .

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

cd MyWebApp
git submodule add git://github.com/jquery/jquery.git externals/jquery

Это создаст каталог с именем externals/jquery* и свяжет его с репозиторием gquub jquery. Теперь нам нужно только запустить подмодуль и клонировать код в него:

git submodule update --init --recursive

Теперь у вас должен быть весь последний код, клонированный в подмодуль. Если репозиторий jquery изменился и вы хотите вытащить последний код, просто submodule updateповторите команду. Обратите внимание: у меня обычно есть несколько внешних репозиториев в моих проектах, поэтому я всегда группирую репозитории в каталоге "externals".

Онлайновая книга Pro Git содержит полезную информацию о подмодулях (и git в целом), представленную в удобной для чтения форме. С другой стороны, git help submoduleтакже даст хорошую информацию. Или посмотрите Учебное пособие по подмодулям Git в git wiki.

Я заметил эту запись в блоге, которая рассказывает о подмодулях и сравнивает их с механизмом Subversion svn: externals: http://speirs.org/blog/2009/5/11/understanding-git-submodules.html.

* Рекомендуется всегда размещать свои подмодули в отдельном каталоге, например, в Externals. Если вы этого не сделаете, ваш корневой каталог проекта может стать очень загроможденным очень быстро.

memmons
источник
4
Отличное объяснение! :) Кроме того, «git help submodules» помогает, если вы хотите немного больше деталей, внутренних деталей и т. Д.
WhyNotHugo
2
Спасибо, именно то, что мне было нужно.
MikeSchinkel
1
@ Чеви Это зависит от ваших требований. В общем, добавление проекта git в качестве подмодуля в ваш проект является хорошим решением для проектов, которые часто меняются или находятся в стадии разработки. Это позволяет легко убедиться, что весь сторонний код в вашем проекте обновлен. Для стороннего кода, который по существу статичен - стабильный, зрелый код, который, вероятно, не сильно изменится от версии к версии - использование подмодуля не дает большой ценности.
мемоны
2
извините, но по сравнению с svn externals, это не так просто
Keil
2
@Keil Это две команды, git submodule addи git submodule update... я не уверен, насколько легче это может стать.
меммон
24

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

Как вы знаете, «git pull» не будет обновлять подмодули, а «git submodules update» также не будет загружать последнюю HEAD этих подмодулей.

Чтобы обновить все ваши подмодули до последней версии, вы можете использовать

git submodule foreach git pull

Если вы часто изменяете свои подмодули, и у вас их много, то «git foreach» станет бесценным.

WhyNotHugo
источник
0

Я думаю, что ответ @Hugo может быть тем, что вам нужно, и отлично работает. Поэтому я нашел более простой способ.

git submodule update --remote

Вот и все.

Таким образом, полный рабочий процесс может быть:

git clone project-with-submodules
git submodule init
git config -l
git submodule update --remote
Dapaldo
источник