重用git存储库的一部分

时间:2010-02-24 13:29:22

标签: 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 1A)更改B的源代码时,我都需要另一个相应的更新。

这可能与 git 子模块功能有关。但是,我能够使用它的唯一方法是将整个Solution A指定为Solution B的子模块。由于Solution A的巨大规模,这实际上并不是我想要的。我只需要它的一小部分就是一个子模块。

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

有关于此的任何提示吗?或许,我错过了什么?

2 个答案:

答案 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的子模块。