Вложенные git-репозитории без пультов (он же подмодуль git без пультов) - PullRequest
30 голосов
/ 23 мая 2011

У меня есть проект, в котором я заинтересован в том, чтобы разделять части с открытым исходным кодом.Я создал "основной" git-репозиторий (скажем, в каталоге "main") и вложенные репозитории в "main / one", "main / two", "main / three".Я подумал, что, зайдя в «main» и выполнив

git add one
git add two
git add three

(обратите внимание на отсутствие конечных слешей), я бы настроил субмодули с суб-репозиториями и был бы готов пойти.

Однако, как отмечено в Git - как отследить неотслеживаемый контент? , это создает только ссылки, а не реальные субмодули.

К сожалению, этот ответ не помогает, так как предполагает, чтогде-то есть "главный" репозиторий , иначе для "main / one", "main / two" и "main / three".Я бы хотел, чтобы эти суб-репо стали основными репозиториями.Я рассматриваю поддельные подмодули (согласно Git поддельные подмодули ), но это не особенно идеальная ситуация для клонирования.

Есть ли еще какие-нибудь предложения?

Ответы [ 3 ]

19 голосов
/ 24 мая 2011

Вы можете делать то, что хотите, но ваши one, two и three должны быть доступны для тех, кто будет нуждаться в их клонировании - обычно это не так для «случайных» репозиториев разработки.

Если вы все-таки настроите это, вам нужно быть очень осторожным, чтобы не удалить «ваш» репозиторий (или сделать его недоступным), так как он не просто «ваш»: он будет происхождения в клонах вашего соавтора, и он будет служить «центральным» / «восходящим» хранилищем (как указано в .gitmodules).


Если все ваши соавторы являются локальными (и могут читать изрепозитории), вы можете добавить свои существующие суб-репозитории как субмодули, указав их локальные пути в виде URL:

git rm --cached one two three
git submodule add `pwd`/one
git submodule add `pwd`/two
git submodule add `pwd`/three

Если не все ваши соавторы будут работать на одном компьютере, то это, вероятно, не будет работатьправильно (поскольку он будет хранить локальный путь в .gitmodules; нелокальным соавторам придется корректировать URL-адреса после git submodule init).

Если ваш one, two иthree доступны для Git удаленно, вместо этого вы можете указать их эффективные URL:

git rm --cached one two three
git submodule add server:/path/to/your/main/one
git submodule add server:/path/to/your/main/two
git submodule add server:/path/to/your/main/three

В обоих случаях, так как у вас уже есть суб-репозиторий, git submodule add будет использовать его вместопытается клонировать с указанного пути / URL.

3 голосов
/ 24 мая 2011

Крис ответ не принимайте репо "master" (master - это имя по умолчанию основной ветви в Git, а не репо).

Он объявляет субмодули в репо "parent", что в вашем случае будет "main".

Таким образом, вам нужно три независимых репо "one" "two "и" three "настроить в другом месте , а затем клонировать и добавить их в репозиторий" main "в виде подмодулей:

# first remove the one directory previously added
git rm --cached one
# then declare the external one repo as a submodule in "main" repo)
git submodule add /path/to/one.git one
0 голосов
/ 19 марта 2016

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

например. Подмодуль one будет иметь в качестве основного хранилища местоположение server:/path/to/your/main/one (через git remote -v в этом каталоге).

Таким образом, функциональность submodule (например, git submodule update --recursive) также указывает на правильное расположение, так как URL этого модуля / хранилища указывает на ./one (.gitmodules).

...