2011-03-25 98 views
21

我正在使用GIT来管理内容管理系统(CMS)项目。 CMS可以有多个插件(模块)。Git子模块或子存储库或远程?

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

  • 核心CMS开发(每个新项目是去年稳定&未配置的版本结帐)每个模块/插件
  • 1库。 (每个新项目将签出他们想要实现模块的最新稳定版本)每个项目
  • 1库(每个客户端将是表示从核心CMS和模块的个性化信息库)

对于类型1 & 2,我想这是简单的基本知识库。 但是,当它来到客户项目,我会感到困惑:

  • 首先我会克隆CMS,然后再在/模块/文件夹,然后再克隆所有需要的模块?这将在存储库中创建一个存储库!第一个回购会尝试记录每个模块的.git /文件夹吗?
  • 我无法使用子模块,因为每个客户端都需要对其模块进行个性化设置。
  • 如果我修改模块的核心组件(而不是个性化,只是一个错误修复),我可以将单个文件推送到原始模块存储库吗?
  • (不说话的模块单元测试是将各地分散的)

所以,问题是: 我应该如何组织库(S)/文件/文件夹,以提高效率?

回答

12

你所描述的布局将很好的与git子模块配合使用。我会轻轻推荐阅读docs并尝试几个tutorials。您的计划引入的主要区别是每个客户端存储库和客户端插件存储库都有两个远程控制器,而不是一个。而且,当你要开始一个新的客户端项目,您将需要

  1. 叉主线CMS
  2. 叉都将被修改
  3. 克隆分叉从(1),更新CMS的插件其子模块的指向从(2)
  4. 初始化新的遥控器/更新子模块
  5. (可选)添加主线CMS网址为您的客户端分叉CMS远程
  6. (可选)添加主线插件的网址作为你的cli中的遥控器ent的分叉插件

一个更好的选择可能是使用相同的存储库,并简单地为每个客户端分支。我就是这么做的。

+0

嗯,我读过了git help submodule,他们说:“它们不能与遥控器相混淆,遥控器主要用于同一项目的分支机构;子模块用于您想要参与的不同项目的源代码树,而两个项目的历史仍保持完全独立,并且不能从主项目内修改子模块的内容。“ ...在我的情况下,我想要修改客户端项目中的子模块,以防需要个性化插件。现在你告诉我,我们可以修改子模块? – FMaz008 2011-03-27 11:39:58

+1

是的。修改客户端的插件代码,提交并将更改推送到(2),然后转到客户端的CMS代码,并提交并将更改推送到插件(更新SHA哈希)为(1)。 – 2011-03-27 23:19:11

+0

好吧,听起来像一个很好的答案,但我仍然有一个关于文件夹组织/结构的补充问题:http://stackoverflow.com/questions/5461617/using-git-and-submodule-whats-a-good-folder -结构体 – FMaz008 2011-03-28 15:50:31

4

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

  • git subtrees(检查this article on medium
  • git subrepo (更容易替代子模块,在Github
  • 或者甚至在子模块中更深入地用“掌握Git子模块”在上medium.com

不要忘记检查,如果你可以使用另一个depency管理器(比如RubyGems的Ruby的,作曲家PHP ...),而不是子模块,它会更容易使用和维护。

相关问题