Git服务于服务器上的不同分支

时间:2016-03-03 18:54:36

标签: git server webserver

我考虑过在网络服务器上进行一些高级的A / B测试,我希望我可以使用git轻松实现这一点。

简单示例

让我用一个简单的例子进一步解释自己,让我说我有以下3个分支:

  • 蓝按钮
  • 红色按钮

这些分支包含所有HTML文件,不同之处在于按钮颜色。

通常主分支机构会被提供给访问者,但是我想测试其他分支机构的10%访问者,看看哪个分支机构提供了最佳转换率(点击按钮)。

这将需要一些脚本,它将用户分组,然后为该用户提供正确的分支。

问题的范围

我正在进行的项目:

  • 在PHP上运行> 5.5并且可以使用Java代码扩展它。
  • (目前)包含2.84千兆字节的存储空间,不包括作曲家依赖关系,缓存和数据库存储
  • 应该能够同时提供100个实验
  • 优选地,如果需要,也应该能够提供较旧的实验

任何实验都必须能够在git分支中包含任何替代文件。在这种情况下,A / B测试不仅限于用户界面,但它应该(除其他外)也支持不同:

  • 内容(需要数据库和缓存修改)
  • 基本代码(用于测试速度差异)
  • 更多将关注

其中一些要点需要更改底层框架,使用方式或其他文件。因此,必须可以更改分支中的任何文件。

现在我想知道让服务器同时访问所有分支的选项。

我想到的选项:

  • 每次请求切换分支(checkout),显然会很慢
  • 将每个分支克隆到子文件夹中,该文件夹将复制文件

我希望有一个更强大的解决方案来解决这个问题:

  • 哪个不重复文件。
  • 哪个快。最理想的是,它应该与访问任何普通文件一样快。
  • 哪种程序化方法最好用Java或PHP

如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

您可以使用智能部署系统实施架构。您需要以下步骤:

  • 将每个3个分支(主,蓝色和红色)克隆到单独的文件夹
  • 主分支是规范的,我们不接触它
  • 进入蓝色分支,将文件与根目录进行比较,将文件放入master分支的根目录。如果文件的哈希值相等,则将“blue”文件替换为“master”文件的硬链接(可能是符号链接,这是性能问题)。递归地将文件放到嵌套目录中。
  • 进入红色分支并重复与蓝色分支相同的操作

您可以使用capistrano和Ruby语言的自定义任务实现此类部署策略。

我添加说明图 enter image description here

更新的算法

这种方法比较复杂,但我们不克隆3个分支:

  • 克隆主分支并为蓝色和红色版本创建文件夹
  • 主分支是规范的,我们不接触它
  • 进入蓝色版文件夹
  • 使用命令git diff --name-status blue..master
  • 获取更改的文件

假设我们得到diff命令的输出

A       test_added.txt
D       test_deleted.txt
M       text_modified.txt
D       test/test.txt
  • 所以我们可以为diff命令输出中没有提到的每个文件/文件夹创建链接
  • 如果文件标有AM个字母(例如test_added.txttext_modified.txt),我们应该git cat-file blob blue:test_added.txt > test_added.txt
  • 如果文件标有D(例如test_deleted.txt),我们应该忽略此文件
  • 对于嵌套折叠(例如test/)我们需要递归地继续执行上述步骤
  • 进入红色版本文件夹并重复与蓝色文件夹相同的操作