Повторное использование части репозитория git - PullRequest
10 голосов
/ 24 февраля 2010

У меня есть следующие настройки проекта:

  • 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.

Какие-нибудь советы по этому поводу? Или, может быть, я что-то упустил?

Ответы [ 2 ]

7 голосов
/ 24 февраля 2010

Это определенно связано с подмодулями (см. характер подмодулей )

В вашем случае идеальным решением было бы извлечь 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"
0 голосов
/ 24 февраля 2010

Разделите Project 1 на свой собственный репозиторий и сделайте его подмодулем решений A и Solution B.

...