Git:应用程序配置和不同环境

13
我们在我们的工作室中为大多数Web应用程序使用git,虽然这些应用程序本身使用各种技术(PHP、Rails等),但我们通常为每个站点维护一个暂存和生产服务器。通常,这些服务器具有不同的数据库凭据集以及不同的基于环境的配置设置(例如缓存)。我们的工作流程通常涉及每个项目维护两个git分支:master反映生产服务器,staging反映暂存。新功能在staging(或子分支)上开发,并在完成和部署后合并回master。

我的问题是关于维护分支和环境特定的配置文件的最佳方法。我看到了类似问题的答案herehere,但都不太令人满意。主要的两种方法似乎是a)使用.gitignore排除将配置文件留在git之外,或b)编写反映环境感知代码,例如根据主机名确定要使用的数据库凭据。我对a)的问题在于它只允许一个配置文件集存在于代码库中(与当前分支无关),因此其他环境的配置文件会丢失。另一方面,b)似乎只需要以一种与应用程序功能无关的方式修改代码库。

理想情况下,我希望有一种方法可以“锁定”某个分支内的配置文件,这样每当我切换到主分支时,我就会得到主配置文件,每当我切换到暂存分支时,我就会得到暂存配置文件。此外,将暂存合并到主分支不应以任何方式影响主配置文件。到目前为止,我们通过在 git 根目录之外包含特定于环境的配置文件的文件夹,并在部署时手动将适当的文件移动到代码库中来处理此问题,但这显然是不必要的 hackish(而且可能很危险)。
是否有任何使用 git 完成此操作的方法?
感谢您的考虑!

这里是否可以使用https://dev59.com/mHI95IYBdhLWcg3wyBGc#2155355和https://dev59.com/vnA75IYBdhLWcg3wm6Qj#3207608的方法来帮助解决问题? - VonC
4个回答

15

不确定为什么有些人认为他们可以不使用任何安装工具。Git 是用于追踪源代码的,而不是用于部署的。你应该仍然需要一个“make install”类型的工具,从你的 Git 存储库到实际部署中,这个工具可能会执行各种操作,例如模板扩展或选择备选文件。

例如,你可能在 Git 中检入了“config.staging”和“config.production”文件,在部署到暂存环境时,安装工具将选择将“config.staging”复制到“config”中。或者你可能只有一个“config.template”文件,在部署时它将被拓展生成“config”文件。


1
没错,这通常是我的做法。我使用部署工具(我主要使用Django,所以我使用Fabric,或者在我处理Rails应用程序的罕见情况下使用Capistrano),它会在部署时自动移动或设置符号链接到正确的配置文件。 - mipadi

3
你可以尝试使用post-merge或post-checkout钩子来验证所有内容是否符合要求,并进行必要的修复。这实际上似乎是ProGit书中建议的做法
基本概念是编写这些钩子,使其作为迷你的“make install”脚本,通过分支、主机、其他文件的存在或内容等方式确保正确的配置。这些钩子甚至可以通过填充模板来重写或重新创建配置文件。

0

试用https://microconfig.io

它专门设计用于管理具有多个环境的微服务配置。

您可以拥有基本配置文件和特定环境的覆盖。然后使用它生成特定环境的最终结果。


0

我假设通常情况下,master 分支只包含已经在 staging 分支中的提交。如果你在 master 分支上添加了一个额外的提交,其中包含两个分支之间配置的差异,那么将这个提交在从 staging 拉取的内容之上进行变基操作应该可以保持配置不变。虽然这并不像“将 staging 合并到 master 中不会以任何方式影响 master 的配置文件”那样简单,但是由于在这种情况下会出现合并冲突,因此它可能已经足够接近了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接