我有以下项目设置:
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
属性中指定外部存储库中的目录。
有关于此的任何提示吗?或许,我错过了什么?
答案 0 :(得分:7)
这绝对与子模块有关(参见nature of submodules)
在您的情况下,理想的解决方案是从Project1
Git repo中提取SolutionA
:
请参阅How to extract a git subdirectory and make a submodule out of it?。
但这涉及重写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
注意:如果您计划发布
,请勿在此处使用本地网址SolutionB
!
git commit -m "Add submodules Project1"
答案 1 :(得分:0)
将Project 1拆分为自己的存储库,并将其作为解决方案A和解决方案B的子模块。