Повторное использование части репозитория git
У меня есть следующая настройка проекта:
-
Solution A
-
Project 1
(легкий компонент)
-
Project 2
(содержит много файлов и зависит от Project 1
)
Solution A
- это единственный репозиторий git. Затем я создал другое решение и обнаружил, что могу повторно использовать и даже обновлять функциональные возможности Project 1
. Поэтому мое второе решение, вероятно, будет выглядеть следующим образом:
-
Solution B
-
Project 1
(должен быть общим!)
-
Project 3
(зависит от Project 1
).
Теперь я хочу, чтобы Project 1
стал общим компонентом. То есть каждый раз, когда я изменяю исходный код Project 1
из любого решения (A
или B
), мне нужно, чтобы другой обновлялся соответствующим образом.
Может быть, это имеет смысл сделать подмодуль в git. Однако единственный способ, которым я смог его использовать, - указать весь Solution A
как подмодуль для Solution B
. Это не совсем то, что я хочу в идеале из-за огромных размеров Solution A
. Мне нужна только крошечная часть этого подмодуля.
Я знаю, что это возможно в svn и работает точно так, как я описал: вы указываете каталог во внешнем репозитории в свойстве svn:externals
.
Какие-нибудь советы по этому поводу? Или, может быть, я что-то упустил?
Ответы
Ответ 1
Это определенно связано с подмодулями (см. природа подмодулей)
В вашем случае идеальным решением было бы извлечь Project1
из SolutionA
Git repo:
См. Как извлечь подкаталог Git и сделать из него подмодуль?.
Но это связано с переписыванием истории SolutionA, что является проблемой, если вы уже опубликовали ее, и если некоторые люди тянут ее.
Используя filter-branch для процесса извлечения.
Чтобы переписать репозиторий так, как будто Project1/
был его корнем проекта и отбросил всю другую историю:
git filter-branch --subdirectory-filter Project1 -- --all
Таким образом, вы можете, например, превратить подкаталог библиотеки в собственный репозиторий. Обратите внимание на --
, который отделяет опции filter-branch
от параметров ревизии и --all
, чтобы переписать все ветки и теги.
Затем объявите Project1
в качестве подмодуля в SolutionB
:
cd SolutionB
git submodule add /path/to/Project1 Project1
ПРИМЕЧАНИЕ. Не используйте локальные URL-адреса здесь, если вы планируете опубликовать свой SolutionB
!
git commit -m "Add submodules Project1"
Ответ 2
Разделите проект 1 на свой собственный репозиторий и сделайте его подмодулем как для решения A, так и для решения B.