14

在使用 git 的几个客户项目中,是否有更好的版本控制 Web 项目的建议,其中包含小的随机更新?

我想使用 git 对 web 项目进行版本控制。与几乎所有其他提案的主要区别在于,这是一个使用 HTML、JavaScript 和一些 PHP 文件的 Web 项目——没有一个或多个程序使用的中央库,就像典型的 Linux 包中通常那样。

我所有不同的 Web 项目都是针对基于相同平台文件的不同客户的,我估计 80% 的文件是相同的(称为平台),而 20% 的文件针对不同的客户进行了修改以满足他们的需求。这里的问题是,我不知道我们需要对哪些文件进行客户更新——每个客户的具体情况都不一样。

最好将平台特定文件保存在一个目录中,并将这些文件与另一个目录中的客户特定文件重叠。为了用 git 解决这个问题,到目前为止我还没有发现什么特别好的东西:

  • git 子模块(如建议的here)通常设计为让供应商开发的库的源代码靠近链接它的程序。因此问题是平台和客户文件位于不同的目录中,因此我必须在部署期间混合它们以创建 Web 服务器的文件。此外,我必须手动保持目录树同步,而这对于 10 个目录深度层次结构来说将是大量的工作。一般来说,很多帖子都抱怨使用子模块需要进行大量的管理工作,这看起来有点矫枉过正。
  • git subtree(就像这里建议的那样)似乎比 submodule 更简单,但是在不同的目录下也有同样的问题,所以我还需要在部署期间保持 dir 结构同步并混合文件。此外,很难从客户回购中推回平台更改。
  • GitSlave(就像建议在这里)我不确定这是否对我有好处。它允许保持几个 git repos 同步,也许它有助于同步平台的目录结构,但我不敢相信
  • 在不同目录中的平台和客户文件之间进行重构(如本次讨论的结果)我认为这对于我的客户和 Web 项目使用的技术来说是根本不可能的。对于一个客户,此页面需要更新,对于另一个客户,该页面需要更新。即使在引入 PHP 框架时,客户特定的更改也会分布在整个树上。
  • 出(就像在上一篇文章中的讨论中提出的那样)看起来非常简单和有希望,缺点是所有客户特定的文件都在 git 之外(因此在版本控制之外)。此外,如果文件在平台和客户中更新,git pull 失败 - 它中止,所以这不可用
  • 据我所知,供应商分支(如此处重新开始),分支被合并回来,这不是针对我的客户特定补丁的。这些分支将始终打开,仅在从平台(主要)向客户更新后合并。这将导致一个庞大的存储库保留所有客户和平台信息——而不是 git 处理存储库的方式。
  • 在部署期间混合。因此,将平台文件保存在一个存储库中并将客户文件也保存在专用存储库中是一种非常实用的方法。在将文件部署到 Web 服务器期间,它可以首先写入所有平台文件,然后用平台特定文件覆盖其中的一些文件。混合发生在 Web 服务器目录中的时间很晚。这也有一个缺点,即每个客户的目录结构必须手动与平台结构保持同步——否则部署将过于复杂。

这里最好的方法是什么?

4

2 回答 2

5

TL;博士

这实际上是一个架构设计问题,而不是源代码管理问题。尽管如此,这是一个常见且有趣的问题,因此我提供了一些关于如何解决架构问题的一般性建议。

不是真正的 Git 问题

问题不在于这里的 Git。问题是您没有充分区分客户之间保持不变的内容与将发生变化的内容。一旦确定了正确的设计模式,合适的源代码控制模型就会变得更加明显。

考虑一下 Russ Olsen 的这句话:

[分离] 可能改变的事物与可能保持不变的事物。如果您可以确定系统设计的哪些方面可能会发生变化,则可以将这些位与更稳定的部分隔离开来。

罗斯奥尔森 (2007-12-10)。Ruby 中的设计模式(Kindle 位置 586-588)。培生教育(美国)。Kindle版。

一些重构建议

我不太了解您的应用程序,无法提供具体建议,但总的来说, Web 项目可以从几种不同的设计模式中受益。模板、复合或原型模式可能都适用,但有时讨论模式会混淆问题而不是帮助。

没有特别的顺序,这是我个人会做的:

  1. 在视图层,严重依赖模板。大量使用布局、包含或部分,以便您可以更轻松地组合表示层对象。
  2. 大量使用客户特定的配置文件(为此我更喜欢 YAML),以便在不修改核心代码的情况下更轻松地进行定制。
  3. 在模型和控制器层,选择一些适当的结构模式,以允许您的对象根据您的客户特定配置文件进行多态行为。鸭打字是你的朋友!
  4. 使用基于主机名或域的一些自省,为每个客户端启用多态行为。

Git 的后续步骤

一旦你重构了你的应用程序以最小化客户之间的变化,你可能会发现你甚至不需要将你的代码分开,除非你试图对每个客户隐藏多态代码。如果是这种情况,您当然可以在那时研究子模块或单独的分支,但不会产生分支之间大量重复的负担。

符号链接也是你的朋友

最后,如果您发现可以将更改隔离到几个子目录中,Git 支持符号链接。您可以简单地将所有不同的代码放在开发分支的每个客户端子目录中,并将文件符号链接到每个客户端发布分支上的正确位置。您甚至可以使用一些 shell 脚本或在自动部署期间自动执行此操作。

这将您的所有开发代码保存在一个位置,以便于比较和重构(例如开发分支),但确保每个版本确实需要不同的代码在您将其推出到生产环境时需要在其中。

于 2012-08-11T15:15:41.553 回答
2

由于您为每个供应商定制解决方案的性质,供应商分支最有意义。最好的方法是放弃这个并开发一个多租户应用程序

于 2012-08-11T14:59:28.320 回答