Git子模块或子存储库还是远程?

时间:2011-03-25 19:55:14

标签: git module code-organization project-organization

我正在使用GIT来管理内容管理系统(CMS)项目。 CMS可以有多个插件(模块)。

基本上,我想拥有3种类型的存储库:

  • 核心CMS开发(每个新项目都是最后一个稳定和未配置版本的结帐)
  • 每个模块/插件1个存储库。 (每个新项目都会检查他们想要实现的模块的最后一个稳定版本)
  • 每个项目1个存储库(每个客户端将是一个存储库,代表来自核心CMS和模块的个性化)

对于1型和1型; 2,我猜这是简单的基本存储库。 但是当涉及到客户项目时,我感到困惑:

  • 首先,我将克隆CMS,然后进入/ modules /文件夹并再次克隆所有必需的模块?这将在存储库中创建一个存储库!第一个repo会尝试记录每个模块的.git /文件夹吗?
  • 我无法使用子模块,因为每个客户端都需要对其模块进行个性化。
  • 如果我修改模块的核心组件(不是个性化,只是修复错误),我可以将该单个文件推送到原始模块存储库吗?
  • (不谈论将四处传播的模块unitTest)

所以问题是: 我应该如何组织存储库/文件/文件夹以提高效率?

2 个答案:

答案 0 :(得分:13)

您所描述的布局将与git子模块一起使用。我会温和地推荐阅读docs并尝试一些tutorials。您的计划引入的主要区别是每个客户端存储库和客户端插件存储库将具有两个远程控制器而不是一个。而且,当您想要启动一个新的客户项目时,您需要

  1. fork the mainline cms
  2. fork所有将被修改的插件
  3. 从(1)克隆分叉的cms,更新其子模块以指向(2)
  4. 中的新遥控器
  5. 初始化/更新子模块
  6. (可选)将主线cms URL作为远程添加到客户端的分叉cms
  7. (可选)将主线插件URL添加为客户端分叉插件中的遥控器
  8. 更好的选择可能是使用相同的存储库,只需为每个客户端创建一个分支。我就是这样做的。

答案 1 :(得分:8)

关于上一个答案的简短更新/其他信息:如果您不喜欢git submodules方法或认为这太难理解,您可以尝试

不要忘记检查是否可以使用另一个依赖管理器(如Ruby的RubyGems,PHP的Composer ......)而不是子模块,它将更易于使用和维护。