Git-репозиторий в Git-репозитории - PullRequest
28 голосов
/ 12 мая 2011

У меня есть репозиторий Git, включая репозиторий Git.

repo1/
     .git/
     files
     repo2/
          .git/
          files
     files

Можно ли работать с этой архитектурой?

Ответы [ 6 ]

20 голосов
/ 12 мая 2011

Вы можете иметь вложенные репозитории git:
Родительское репо будет просто игнорировать вложенное репо .

jleedev комментирует и иллюстрирует этим основным сценарием , что родительское репо будет отслеживать вложенное состояние репо через a gitlink .
(gitlink = SHA-1 объекта, ссылающегося на коммит в другом репозитории. Ссылки на Git могут указываться только SHA или знаком фиксации.
У gitlink есть специальный режим «160000», который используется для субмодулей, но также присутствует для простых вложенных репозиториев.

Однако обычные команды не подтверждают вложенное репо: add или commit будут применяться только в одном репо, а не в другом.

подмодуль git позволит ссылаться на вложенное репо из родительского репо и хранить точную ссылку на дочернее репо.

Другая альтернатива может включать:

  • два отдельных репозитория Git (не вложенные)
  • символическая ссылка от одной к определенной части другой (и Unix, и Windows Vista + имеют символические ссылки)
8 голосов
/ 12 мая 2011

Вы пытаетесь выполнить то, что называется "подмодулем".

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

3 голосов
/ 03 октября 2012

Я использовал эту структуру довольно давно, с каталогами суб-репо, указанными в .gitignore во внешнем репо.

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

Я выполняю все операции Git из Git bash в любом репо, над которым я работаю.

Подмодули могут быть лучшим подходом. У меня не было времени выяснить, будут ли они работать лучше с PhpStorm.

2 голосов
/ 12 мая 2011

Да, вы можете использовать этот шаблон.Я использовал это в прошлом, чтобы ввести внешние SVN в клон git-svn.Подмодули теперь могут справиться с этим лучше, но в то время это не отвечало моим потребностям.

Вы хотите добавить следующее в repo1 / .git / info / exclude, чтобы изменения в repo2 не смешивалисьс репо1:

repo2
1 голос
/ 07 сентября 2016

Я также согласен с ответом Рональда Уильяма . Основная цель подмодулей Git - обновление кода, взятого из внешнего мира, без необходимости фиксировать изменения, если этот код был изменен обновлением.

Система управления пакетами Composer делает то же самое. На самом деле они не рекомендуют фиксировать эти изменения либо и игнорируют папку vendor в .gitignore в корне проекта.

Это кошмар, если вы попытаетесь зафиксировать эту папку, потому что некоторые из vendor / some_repo могут иметь версию для разработки, и, следовательно, у них есть папка .git, которая приводит ко всем этим пакетам. стать подмодулями, даже если вы не добавите их с помощью git submodule add. Вы можете увидеть что-то подобное, если вы измените some_file во вложенном репозитории .git:

~/project_root $ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#    modified:   vendor/nested_repo (modified content)

Обратите внимание на измененное содержимое в подмодулях , и вы не увидите имя some_file в выходных данных. Вместо этого вы видите уведомление (измененное содержимое) , поскольку root_project .git видит vendor / nested_repo как подмодуль и не отслеживает отдельные файлы в этой папке.

Если вы запустите git add --all, вы не получите никакого результата, пока не внесете изменения в vendor/nested_repo, и только после этого вы сможете зафиксировать изменения в корневом хранилище.

Не делай этого. Вместо этого, если вы хотите сохранить свой проект в качестве целого репозитория .git (любого, не только репозитория, созданного в Composer), что иногда очень удобно, добавьте эту запись в корневой каталог .gitignore BEFORE начальная фиксация:

.git
!/.git

К сожалению, чтобы весь рецепт работал, вам нужно запустить команду git add для каждого из вложенных репозиториев, которые вы позже захотите изменить по отдельности. Обратите внимание, что косая черта в путях репозиториев - это MUST .

~/project_root $ git add vendor/some_repo/ vendor/another_repo/

Затем измените some_file в vendor/some_repo и увидите разницу:

~/project_root $ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#    modified:   vendor/some_repo/some_file

Таким образом, вы можете запустить git add --all и затем git commit "Changes ..." в project_root как обычно.

0 голосов
/ 03 сентября 2014

Существуют также решения для управления пакетами.

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

На мой взгляд, программное обеспечение для управления пакетами является неотъемлемой частью любого сложного проекта. Мне нравится Composer из-за интуитивно понятных рабочих процессов, которые он поддерживает.

К сожалению, подмодули Git не поддерживаются PhpStorm:

Должны поддерживаться подмодули Git (IDEA-64024)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...