重用git存储库的一部分

Ker*_*ido 10 git version-control git-submodules

我有以下项目设置:

  • 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从任一解决方案(AB)更改源代码时,我都需要另一个相应的更新.

也许这有点像git子模块功能.但是,我能够使用它的唯一方法是将整体指定为子模块.由于体积庞大,这并不是我想要的理想选择.我只需要它的一小部分就是一个子模块.Solution ASolution BSolution A

我知道它可以在svn中完全按照我的描述工作:在svn:externals属性中指定外部存储库中的目录.

有什么提示吗?或许,我错过了什么?

Von*_*onC 7

这肯定与子模块有关(参见子模块的性质)

在您的情况下,理想的解决方案是Project1SolutionAGit repo中提取:
请参阅如何提取git子目录并从中创建子模块?.

但这涉及重写SolutionA历史记录,如果您已经发布它并且有些人正在从中提取它,这是一个问题.

使用filter-branch进行提取过程.

要重写存储库,使其看起来像是Project1/ 项目的根目录,并丢弃所有其他历史记录:

git filter-branch --subdirectory-filter Project1 -- --all
Run Code Online (Sandbox Code Playgroud)

因此,您可以将库子目录转换为自己的存储库.请注意--,它将filter-branch选项与修订选项分开,并--all重写所有分支和标记.

然后声明Project1为子模块SolutionB:

cd SolutionB
git submodule add /path/to/Project1 Project1
Run Code Online (Sandbox Code Playgroud)

注意:如果您打算发布您的本地URL,请不要在此处使用SolutionB!

git commit -m "Add submodules Project1"
Run Code Online (Sandbox Code Playgroud)