Повторное использование части репозитория 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.