在一个或几个Git回购中处理多个组件?

时间:2013-02-03 14:43:29

标签: .net git continuous-integration

我有一个基于.NET的大型项目> 20个不同的解决方案,每个解决方案代表更大系统中的不同模块在每个解决方案中都有许多项目。

我们目前在一个Git仓库中处理所有解决方案,因为它们属于一起,到目前为止我们的工作正常。然而,现在我们开始使用CI服务器来构建和测试修改。然而,这开始变得毛茸茸。我不能让CI服务器构建完整的解决方案,只能构建已更改的组件。在SVN中,我们可以使用一个repo来实现这一点,并限制CI服务器的不同配置以侦听不同的路径 - 例如,“src / ModuleA”是一个构建和配置,“src / ModuleB”是另一个。

我在Git中有哪些选择?什么是最佳做法?他们的优点和缺点是什么?我希望能够指出一个更大的开源解决方案,并将相似的设置作为答案的一部分。

  1. 我想我可以让每个模块都有自己的回购?但是当涉及到GitHub上的托管等问题时,以及它们通过回购收费时会出现问题...这会不会是最佳选择?
  2. Git子模块会起作用吗?这是否适用于子模块?
  3. 您是否知道CI产品中的其他选项可以帮助您解决这种情况?

3 个答案:

答案 0 :(得分:2)

  

我想我可以将每个模块都放在它自己的回购中吗?但是,当涉及到GitHub上的托管等问题时,以及它们通过回购收费时会出现问题...这会不会是最佳选择?

这仍然是最佳选择,除非这些模块过于依赖,这意味着在管理分支方面存在额外的障碍(因为您需要记住同时分支所有或大部分模块,同样用于合并回)

如果收费是一个问题,请记住您可以在BitBucket repos中提供类似的组织(提供free private repos,尽管是小型团队)

一旦你将每个模块放在他们自己的git仓库中,就可以将它们与子树或子模块结合起来,正如我在“Combine a base project that is growing in child projects in git repository except git submodule or subtree merge methods”中所解释的那样。 git slave也可以是更简单的替代方案。

答案 1 :(得分:1)

虽然 git子模块 git子树都是好的(但不同的)子组件管理解决方案,但它们确实有一些缺点

git submodule:

  • 你最终得到了多个存储库。
  • 您必须单独管理每个存储库。
  • 用户界面有时是outright confusing
git子树(我还没有用过很多,所以我的反对可能没有根据):

  • 您有整个项目的单一历史记录。虽然这种方法很有效,并且始终是一种分离历史记录的方法,但是没有简单的方法可以将任意版本的组件组合到系统中。

我设计了一个名为 git components 的方法,它在单个存储库(如git子树)中工作,并为您提供了独立组件历史记录的灵活性(如git子模块)。

该方法基于路径检查: checkout <branch_name> -- .(注意尾随点)。

该方法使用一个简单的类似清单的bash脚本,并强制使用一些命名约定来促进组件管理。

您可以在此处找到该方法的完整描述和玩具实施:

https://github.com/picrin/git-components

修改

根据VonC的建议,我尝试将其与git 2.5 git worktree提供的新git功能结合使用。虽然2.5尚不可用(除非你将来会来这里),但是最近的大师有这个功能,而且看起来效果很好。

我建议将git worktree与git组件一起使用的方法是检查要掌握的主工作树,并为每个组件和系统的每个版本(clientA,clientB等)创建工作树。 )。这样,您可以同时处理每个组件,而无需在有人中断您对组件2执行快速修补程序时将您的工作存储在组件1上。

答案 2 :(得分:0)

另一种选择是使用 git sparse-checkout。 这使您能够指定您想要在本地工作目录中的 git 存储库中的哪些文件夹(例如“src/ModuleA”)同时过滤掉其他所有内容。

如果您的集成工具了解 git 的稀疏结帐功能,或者您可以设置脚本来为您的集成工具执行稀疏结帐,那么这可能会解决您的问题。