9

我有一个config.php假设在不同分支中的内容不同,例如testingmaster

我在另一个问题(防止将来自 master 的文件与 Git 合并)问过如何防止该文件合并。

但我想知道,这是正确的方法吗?

我相信这是一个很常见的用例,在不同的环境中有不同的配置文件,并且您希望跟踪配置,对吗?

4

4 回答 4

6

对于配置文件,一种解决方案是不对其进行版本化(这样,没有合并问题!)

您将使用内容过滤器驱动程序

内容过滤器驱动程序

你会版本:

  • 一个值文件(用于master环境)
  • 一个值文件(用于dev环境)
  • 一个模板文件(带有占位符变量,如@PORT_NUMBER@
  • 一个“ smudge”脚本能够基于当前分支并基于签出文件(此处为模板文件)的内容来生成实际的配置文件(仍然是“私有”,即未版本化)。
  • 一个“ clean”脚本能够检测私有配置文件中的任何值更改,并将这些更改的值存储回(版本化)值文件中。
于 2012-05-30T06:13:09.577 回答
4

执行此操作的经典方法是拥有一个名为config.yml-dist的默认配置文件(假设您的原始文件名为config.yml);您将原始文件添加到 .gitignore 中,并且仅对dist进行版本化。
部署应用程序或重新克隆项目后,只需简单地cp config.yml-dist config.yml更改所需的设置即可。

我在 PHP行业遇到的很多人都使用这种方法。

但是,有一个我更喜欢并且我觉得更干净:使用环境变量。例子:

username: <%= ENV['MONGOID_USERNAME'] %>
password: <%= ENV['MONGOID_PASSWORD'] %>
database: <%= ENV['MONGOID_DATABASE'] %>

这样,您将拥有一个版本化的配置文件,而不必编辑一个。

于 2012-05-30T06:41:23.397 回答
2

您可以让主分支不包含该文件,而只将它放在分支中——这是最简单的方法。

或者,假设主配置相当稳定,否则这将是一个很大的痛苦——config.php在每个分支中提交更改,然后当您从中获取更改时始终使用 rebase 进行拉取,master以便每次重新应用配置更改。

于 2012-05-30T04:59:18.737 回答
1

为什么不将所有特定于环境的配置文件存储在主存储库中?然后,无论是在构建还是部署过程中,您都可以使用任何相关的配置文件。有很多不同的实现方式,具体取决于您的构建/部署工具,但无论您采用哪种方式,我认为它都比在分支中更好。

我的观点是,您肯定希望将配置文件存储在版本控制中并使用部署工具进行部署,这样您就不会因为缺少更新或手动错误而让旧版本闲置。

通常存在一个文件夹结构,如

/configurations/test/properties/
/configurations/prod/properties/

并且部署工具根据要求在每个环境中使用它们。任何机密信息(例如密码)都可以被散列或加密:像 ansible vault 这样的技术直接支持这一点。

于 2012-05-30T06:34:45.367 回答