2010-02-24 129 views
10

我有以下项目设置:重用一个Git仓库的部分

  • Solution A
    • Project 1(轻量级组件)
    • Project 2(包含很多文件,并取决于Project 1

Solution A是一个单独的git存储库。然后我创建了另一个解决方案,并发现我可以重新使用并更新Project 1的功能。所以,我的第二个解决方案可能会是这样的:

  • Solution B
    • Project 1(必须是共享的!)
    • Project 3(取决于Project 1)。

现在我想Project 1成为一个共享的组件。也就是说,每次我从任一解决方案(AB)更改Project 1的源代码时,我都需要另一个相应地进行更新。

也许这有点事子模块功能git。但是,我能够使用它的唯一方法是将整个Solution A指定为Solution B的子模块。这并不是我想要的理想,因为Solution A的巨大尺寸。我只需要它的一小部分是一个子模块。

我知道这是可能的svn和完全按照我所描述的:您在svn:externals属性中的外部存储库中指定一个目录。

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

回答

7

这肯定是关系到子模块(见nature of submodules

在你的情况下,理想的解决方案是从SolutionA提取Project1 Git repo:
请参阅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重写为所有分支和标记。

然后在SolutionB声明Project1作为子模块:

cd SolutionB 
git submodule add /path/to/Project1 Project1 

注意:这里如果你计划发布SolutionB不要使用本地URL!

git commit -m "Add submodules Project1" 
0

拆分项目1出自己的资源库,并使其解决方案A和方案B两者的子模块