我正在从集中式 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、业务、数据分离都是您的全部)使用)以及由于您的决定而变得更容易/更难的事情。我对子模块如何有点痛苦的初步阅读是正确的吗?痛苦大于好处?
我的直觉反应是为 Tahiti 提供一个存储库(除“客户项目”外的所有项目),然后为每个客户创建一个存储库。我猜的整个大溪地资源必须是 <10k 文件。这是我的推理(我欢迎批评)
- 在我看来,在 Git 中,您想要跟踪“功能”与单个“项目/文件”的历史记录,即使我们的项目分离,一个“功能”也将始终跨越多个项目。
- 核心网站中编码的“功能”几乎总是对核心网站和“框架”的所有项目的影响最小(即 CoreWebsite、Framework1.Business、Framework1.Data)
- 一个特性可以很容易地跨越多个框架(我想说我们实现的特性中有 10% 会跨越框架——CoreWebsite、Framework1.Business、Framework1.Data、Framework2.Business、Framework2.Data)
- 以类似的方式,一项功能可能需要更改 1 个或多个 SharedLib 项目和/或“UI 网站助手”项目。
- 对客户自定义代码的更改几乎总是只在其存储库本地进行,并且不需要跟踪对其他组件的更改以查看“整个功能更改集”是什么。
- 鉴于一个功能跨越项目以查看整个范围,如果每个项目都是它自己的存储库,那么尝试分析存储库之间的*所有*代码更改似乎会很痛苦?
提前致谢。