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文件在该目录中,并且它是为放置项目的服务器配置的。如果有人更改了配置文件,他将更改服务器配置文件,任何更新版本的人都将看到该文件中的更改,并且需要手动更改其本地配置。
我看不出有什么办法能做到,而不是那样。如果你发现不同的方法,请分享。