Подтвердить что ты не робот

Вложенные репозитории git без пультов (подканал a.k.a. git без пультов)

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

git add one
git add two
git add three

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

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

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

Есть ли другие предложения?

4b9b3361

Ответ 1

Вы можете делать то, что хотите, но ваши 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 -accessible, тогда вы можете указать их эффективные 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.

Ответ 2

Chris answer не принимают для репо < <20 > "(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

Ответ 3

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

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

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