关于svn:如何实用地控制配置文件的版本?

How to version control config files pragmatically?

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

1
2
database_password=secret
foo=bar

变成

1
2
database_password=*
foo=bar

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

例子:

本地版本:

1
2
database_password=own_secret
foo=bar

VCS中的配置文件:

1
2
database_password=*
foo=bar

然后,配置文件突然更改:

1
2
3
database_password=*
foo=bar
baz=foo

对于每个开发人员,本地版本将变成:

1
2
3
database_password=own_secret
foo=bar
baz=foo

这是我的解决方案。我怎样才能做到这一点?如何存储配置文件?有没有办法,或者我应该黑客什么的?


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

另请看我对类似问题的回答。


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

您有一个主配置,其中包含通用配置加上虚拟用户名/密码(或者将它们全部删除)。然后,每个开发人员使用其特定的用户名/密码创建一个本地override.config(或其他)。主配置受源代码管理,开发人员(或机器)本地重写不受此控制。

我是在.NET中完成的,但不是PHP,所以我不知道这有多简单。


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

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

1
$local_password = 'qUzaEAFK13uK2KHy';

然后在包含数据库密码的文件中执行如下操作

1
2
3
4
5
6
7
8
9
$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!'
}

源代码管理永远不必看到本地重写文件。


那么,使用预提交钩子清除敏感字段呢?当然,这假设您首先可以通过网络舒适地发送文件。

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


有一个单独的文件,其中只包含机密,不受版本控制?

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


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

我已经回答了一个类似的问题,并给出了一个完整的示例,说明如何在Visual Studio中执行此操作:如何使用tortoise hg"作为存储库的一部分"忽略kill/mercurial中的文件


我习惯于用配置文件的结构制作一个txt文件。之后,我将复制并更改扩展名,让我的版本控制系统忽略这个文件。

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


我有类似的东西,虽然我不知道它是否适合你。我有一个目录,其中包含包含密码的文件。此目录不受版本控制。这些文件是以使用它们的应用程序命名的,在配置文件中,我在需要时"获得"了适当的密码文件。这将要求配置分析器能够处理源代码。


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

我看不出有什么办法能做到,而不是那样。如果你发现不同的方法,请分享。