Git存储库的最佳实践,包含传统n层设计中的多个项目

时间:2011-04-01 14:26:07

标签: visual-studio git visual-sourcesafe repository repository-design

我正在从集中式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文件。这是我的推理(我欢迎批评)

  • 在我看来,在Git中你想要追踪'特征'与个别'项目/文件'的历史,即使我们的项目分离,一个'特征'将始终跨越多个项目。
  • 核心网站中编码的“特征”几乎总是对核心网站和“框架”的所有项目(即CoreWebsite,Framework1.Business,Framework1.Data)产生最小影响
  • 一个功能可以轻松跨越多个框架(我说我们实现的功能的10%将跨越框架 - CoreWebsite,Framework1.Business,Framework1.Data,Framework2.Business,Framework2.Data)
  • 以类似的方式,功能可能需要更改一个或多个SharedLib项目和/或“UI网站帮助程序”项目。
  • 对客户端自定义代码的更改几乎总是只对其存储库本地化,并且不需要跟踪对其他组件的更改,以查看“整个功能更改集”的内容。
  • 鉴于某个功能跨越项目以查看整个范围,如果每个项目都是自己的存储库,那么尝试分析存储库中的所有*代码更改会是一件痛苦的事吗?

提前致谢。

1 个答案:

答案 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个项目中这样做。