Сохранение репозитория git внутри другого репозитория git

125

Вот чего бы мне хотелось:

REPO-A
  /.git
  /otherFiles
  /REPO-B
    /.git
    /moreFiles

Я хочу иметь возможность отправлять все содержимое REPO-A на REMOTE-A и только REPO-B на REMOTE-B.

Возможно?

adamyonk
источник

Ответы:

104

Похоже, вы хотите использовать подмодули Git .

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

mipadi
источник
19
Не совсем так: он не подтолкнет все содержимое репоА: только A плюс ссылка на B. Но я не критикую ваш ответ, я торопился писать почти то же самое, когда перечитывал вопрос OP;)
VonC
1
Это в значительной степени вариант использования подмодулей. REPO-A и REPO-B рассматриваются как репозитории git сами по себе, со своими собственными коммитами, происхождением, историей и т. Д.
Дэмиен Уилсон
2
так что, если я правильно понимаю, могу ли я независимо проверить репозиторий submodule-d, полностью отличный от того, в котором я его нахожу? Как мне взять уже существующее репо и ссылаться на него как на подмодуль в другом проекте?
JohnO
я не искал точно такое же решение, как OP, и я считаю, что в среднем это, вероятно, больше искали ответа на аналогичный вопрос: «помещает ли git REPO-B в git REPO-A, вставляет ли ссылку или полную копию git REPO-B? ".
джайа
64

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

Johno
источник
8
Для того, насколько запутанными кажутся подмодули git и поддерево git, это правильный ответ.
Trevor Hickey
Это также очень полезно для сборки одного приложения из нескольких удаленных репозиториев
Джеральд Скотт
22
Чтобы поддерживать два отдельных и разных репо, разве не нормально сохранить репо B в репо A и просто добавить репо B к репо A .gitignore?
Фабьен Снауверт,
1
Я думал о том, чтобы сделать то, что предлагает Фабьен, есть ли проблема в том, чтобы делать это таким образом?
theonlygusti
1
Я храню репозитории git отдельно и копирую изменения, внесенные в REPO-B, в копию REPO-B (без .git), которая вложена в REPO-A. Я делаю это с помощью rsync. Я бегу rsync -avh --delete --exclude='.git' REPO-B/ REPO-A/REPO-B-copy/за изменениями в РЕПО-Б
Шай
29

Да, вы можете делать именно то, что просите, с нарисованной вами иерархией файлов. Репо-Б будет независимым и не будет знать о Репо-А. Repo-A будет отслеживать все изменения в своих файлах и файлах Repo-B.

Однако я бы не рекомендовал это делать. Каждый раз, когда вы меняете файлы и делаете коммит в Repo-B, вам придется делать коммит в Repo-A. Ветвление в Repo-B будет мешать с Repo-A, а ветвление в Repo-A будет нестабильным (проблемы с удалением папок и т. Д.). Подмодули определенно подходят.

куби
источник
53
Разве нельзя просто добавить REPO-B в /REPO-A/.gitignore?
mikkelbreum
2
@mikkelbreum У меня была точно такая же идея. В настоящее время мы используем subverion для нашего основного проекта и используем репозиторий git в одной из подпапок. С SVN я просто добавил папку с репозиторием git в свойство svn: ignore и спрашивал себя, могу ли я сделать то же самое с git.
2ndkauboy
3
Что ж, я не понимаю, почему добавление вложенного репозитория git в список игнорирования родительского репо не должно работать .. Но в то же время у меня есть чувство, что должен быть какой-то улов, о котором я не подумал, поскольку этот подход редко встречается, и многие люди не одобряют вложенные репозитории git.
mikkelbreum
18
Я только что реализовал именно этот сценарий. У меня есть несжатые файлы CSS в подпапке, которые я не хочу помещать в удаленное репо, поэтому они находятся в моем .gitignore. Но я хочу отслеживать изменения в этих файлах локально. Я создал репо внутри папки с несжатыми файлами и добавил в него все файлы. Он по-прежнему игнорируется родительским репо, но я могу отслеживать изменения внутри вспомогательного репо. Рекомендуется или нет, это решение является ключевым в определенных ситуациях, подобных этой.
BrianVPS
1
Я понимаю, что всякий раз, когда вы переключаете ветки в одном репозитории, другой будет видеть целую кучу изменений, но почему «ветвление в Repo-A будет неустойчивым (проблемы с удалением папок и т. Д.)»? Спасибо!
user2688151 01
2

Вы можете добиться того, чего хотите (репозиторий REPO-A содержит все файлы, включая файлы в папке REPO-B, а не только ссылку), используя "git-subrepo":

https://github.com/ingydotnet/git-subrepo

Он по-прежнему работает, если у некоторых из ваших участников не установлена ​​команда subrepo; они увидят полную структуру папок, но не смогут фиксировать изменения во вложенных репозиториях.

клей
источник