如何以实用的方式控制配置文件的版本?

时间:2009-12-29 14:29:59

标签: svn version-control configuration-files

假设我们有一个包含敏感密码的配置文件。我想版本控制整个项目,包括配置文件,但我不想分享我的密码 这可能是好的,如果这个配置文件:

database_password=secret
foo=bar

变为

database_password=*
foo=bar

并且vcs的其他用户也可以自己设置密码。忽略文件不是一个好方法,开发人员应该知道,如果配置文件发生了变化。

实施例

本地版本:

database_password=own_secret
foo=bar

vcs中的配置文件:

database_password=*
foo=bar

然后突然,配置文件发生了变化:

database_password=*
foo=bar
baz=foo

本地版本将适用于每个开发人员:

database_password=own_secret
foo=bar
baz=foo

这是我的解决方案。我怎么能实现这种行为?你如何存储你的配置文件?有没有办法做到这一点,或者我应该破解什么?

9 个答案:

答案 0 :(得分:26)

您可以在版本控制中放置模板或默认文件,而不是版本控制实际配置文件,以及要求数据库信息和凭据生成真实配置文件的脚本,该文件将被排除在外(即忽略了版本控制。在结账时,开发人员可以运行此脚本以获得工作环境。也可以在应用程序使用的任何安装过程中调用此脚本。

see my answer同样问题。

答案 1 :(得分:9)

不确定您的配置是如何实现的,但是具有分层覆盖是我如何处理它。

你有一个主配置,包含公共配置和虚拟用户名/密码(或完全保留这些)。然后,每个开发人员使用其特定的用户名/密码创建本地override.config(或其他)。主配置在源代码管理下,开发人员(或机器)本地覆盖不在。

我已经在.NET中完成了这项工作但不是PHP,所以我不知道这有多容易,我担心。

答案 2 :(得分:4)

创建一个本地覆盖文件,其中包含用户特定信息作为PHP变量。

例如,创建一个名为local_overrides.php的文件,其中包含以下内容:

$local_password = 'qUzaEAFK13uK2KHy';

然后在包含您的数据库密码的文件中执行类似这样的操作

$overrides = 'local_overrides.php';

if (file_exists($overrides)) {
   #include_once($overrides);
   $db_password = $local_password;
} else {
   // perform appropriate action: set default? echo error message? log error?    
   $db_password = 'l1m1t3d!'
}

源控件永远不会看到本地覆盖文件。

答案 3 :(得分:2)

有一个单独的文件,只有秘密,不受版本控制?

或者理想情况下,完全使用openssh或类似密码,并为每个用户执行公钥/私钥验证。

答案 4 :(得分:2)

用于清空敏感字段的预提交挂钩怎么样?当然,这假设您首先通过网络发送文件很舒服。

问题另一端的更新:
要处理更新,您要么强制手动合并敏感文件,要么修改本地构建过程以使用本地/私有/忽略文件中的内容覆盖敏感行。

答案 5 :(得分:1)

我习惯用configfile的结构制作它的txt文件。 然后,我将复制并更改扩展名,让我的版本控制系统忽略此文件。

因此,当您在配置文件中进行更改时,只需更新它的txt版本即可。 这是我能想到的唯一选择,也是逻辑(在我看来)

答案 6 :(得分:1)

我在这里已经提到了我的首选答案:检入一个虚拟文件,通过在运行时复制虚拟文件生成“真实”文件,并忽略VCS中的“真实”文件。

我已经回答了一个类似的问题,并在Visual Studio中完成了一个如何执行此操作的示例:
how to ignore files in kiln/mercurial using tortoise hg "that are part of the repository"

答案 7 :(得分:0)

在我的项目中,我使用一个包含这些类型文件的目录,但它没有上传到服务器,因此我的db配置文件位于该目录中,并且配置为放置项目的服务器。 如果有人更改配置文件,他将更改服务器配置文件,任何更新版本的人都会看到该文件中的更改,并需要手动更改其本地配置。

我没有看到这样做的方式而不是那样。如果您找到不同的方法,请分享。

答案 8 :(得分:0)

我有类似的东西虽然我不知道它是否适合你。我有一个目录,其中包含包含密码的文件。此目录不受版本控制。这些文件是在使用它们的应用程序之后命名的,在配置文件中,我在需要的时候“找到”了相应的密码文件。这将要求您的配置解析器可以处理采购。