我正在从集中式SCM系统切换到GIT。好的,我承认哪一个,它是Visual SourceSafe。因此,除了克服Git命令和工作流的学习曲线之外,我目前面临的最大问题是如何将我们当前的存储库迁移到Git,关于单个或某些类型的多个存储库。
我已经通过各种方式看到了这个问题,但通常只是基本...“我有应用程序想要共享一些较低级别的库”并且预制响应总是“使用单独的存储库”和/或“使用Git子模块”没有太多解释何时/为什么应该使用这种模式(它克服了什么,它消除了什么?)从我迄今为止对Git的有限知识/阅读,看来子模块可能有自己的恶魔战斗,特别是对于Git的新手。
然而,我还没有看到有人公然提出的问题是,“如果您拥有传统的n层开发(UI,业务,数据,然后是共享工具),其中每个层都是自己的项目,那么您是否应该使用一个或多个存储库?“我不清楚,因为几乎总是,当添加新的“功能”时,代码更改会在每个层中产生影响。
为了使与Git相关的问题复杂化,我们在“框架”中复制了这些层,以便从开发人员的角度制定更易于管理的项目/组件。出于本讨论的目的,我们将这些项目/图层集合称为“Tahiti”,它代表整个“产品”。
我们设置的最后一个“层”是增加了对塔希提岛进行定制/扩展的客户网站/项目。在文件夹结构中表示这可能最像是:
/Clients
/Client1
/Client2
/UI Layer
/CoreWebsite (views/models/etc)
/WebsiteHelper (contains 'web' helpers appropriate for any website)
/Tahiti.WebsiteHelpers (contains 'web' helpers only appropriate for Tahiti sites)
/BusinessLayer (logic projects for different 'frameworks')
/Framework1.Business
/Framework2.Business
/DataLayer
/Framework1.Data
/Framework2.Data
/Core (projects that are shared tools useable by any project/layer)
/SharedLib1
/SharedLib2
在解释了我们如何通过多个项目扩展传统的n层设计之后,我正在寻找关于您在类似情况下做出的决策的任何经验(即使是简单的UI,业务,数据分离也是如此)所有你使用的)以及因你的决定而更容易/更难的事情。在初步阅读中,子模块有多痛苦,我是否正确?比痛苦更有益吗?
我的直觉反应是塔希提岛的一个存储库(所有项目除了'客户项目'),然后是每个客户的一个存储库。我猜的整个大溪地来源必须是< 10k文件。这是我的推理(我欢迎批评)
提前致谢。
答案 0 :(得分:14)
大多数人建议做单独的存储库的原因是因为它分离出更改和更改集。如果有人对客户端项目进行了更改(您说这些更改并不影响其他项目),则没有理由让某人更新整个代码库。他们可以简单地从他们关心的项目中获得变化。
Git子模块就像Subversion中的Externals。您可以设置git存储库,以便每个存储库都是一个单独的层,然后使用子模块包含您拥有的各种层次结构中所需的项目。
所以,例如:
/Core -- It's own git repository that contains it's base files (as you had outlined)
/SharedLib1
/SharedLib2
/UI Layer -- Own git repository
/CoreWebsite
/WebsiteHelper
/Tahiti.WebsiteHelpers
/Core -- Git Submodule to the /Core repository
/SharedLib1
/SharedLib2
这可确保将/ Core存储库的任何更新带入UI Layer存储库。这也意味着如果你必须更新你的共享库,你不必在5-6个项目中这样做。