在多个客户的Web项目中使用git

Ach*_*him 14 git project web-deployment

有没有更好的建议来控制Web项目,在几个客户项目中使用git进行小的随机更新?

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

我所有不同的Web项目都是针对不同的客户,基于相同的平台文件,我估计80%的文件是相同的(称为平台),20%是针对不同的客户进行修改以满足他们的需求.这里的问题是,我不知道我们需要客户更新哪些文件 - 详细地说每个客户都不同.

最好的方法是将平台特定文件保存在一个目录中,并将这些文件与客户特定文件重叠在另一个目录中.为了用git来解决这个问题,到目前为止我没有发现什

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

这里最好的方法是什么?

Tod*_*obs 5

TL; DR

这实际上是一个体系结构设计问题,而不是源代码管理问题。尽管如此,这是一个常见且有趣的问题,所以我为您提供一些有关如何解决体系结构问题的一般建议。

并不是一个真正的Git问题

问题不是这里的Git。问题是您没有充分地区分相同的内容以及客户之间将要更改的内容。确定正确的设计模式后,适当的源代码控制模型将变得更加明显。

考虑一下Russ Olsen的这段话:

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

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

一些重构建议

我对您的应用程序不够了解,无法提供具体建议,但是一般而言, Web项目可以从几种不同的设计模式中受益。模板,组合或原型模式都可能适用,但是有时讨论模式会使问题更加困扰。

以下是我个人要做的事情:

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

使用Git的后续步骤

重构应用程序以最大程度地减少客户之间的变化之后,您可能甚至根本不需要将代码分开,除非您试图对每个客户端隐藏多态代码。如果是这种情况,那么您当然可以在那时候研究子模块或单独的分支,而不必承担分支之间繁重的工作。

符号链接也是您的朋友

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

这使所有的开发代码在一个地方,便于比较和重构(如开发分支),但能保证代码真正需要为每个版本不同的是,它需要的地方,当你将其推广到生产中。