【问题标题】:What's the best way to track private files in a public Mercurial repository?在公共 Mercurial 存储库中跟踪私人文件的最佳方式是什么?
【发布时间】:2011-08-17 15:26:23
【问题描述】:
“如果它不在源代码管理中,则它不存在。”
此问题已在此处针对 Git 解决:Techniques to handle a private and public repository?。 Mercurial 呢?
我有几个公共 Bitbucket 存储库(有多个提交者),我希望将源公开,但它们会从未跟踪的文件中加载 API、SSH 密钥和其他敏感信息。但是,如果我们添加新的 Mailchimp 或 Hunch 或 Twilio API 密钥,这会导致有人围绕新的配置文件发送电子邮件。有没有办法以某种方式保护这些文件不被公众看到并仍然跟踪它们?每个人都在通过 Bitbucket 同步他们的 repo。
【问题讨论】:
标签:
mercurial
private
config
public
【解决方案1】:
有两种很好的方法来处理这个问题(除了 zerkms 的解决方案,它不能提供您想要的简单同步,但无论如何我都会这样做):
-
使用Mercurial Queues。当您使用 hg qinit --create-repo 创建一个 mercurial 队列时,它会创建一个覆盖系统,该系统可以在现有 repo 之上使用 qpushed。所以你把你的秘密放在队列中,当你需要它们时qpush它们,当你不需要它们时qpop它们。使用--create-repo,一组覆盖(补丁)在其自己的存储库中处理。因此,知情人士可以推送/拉取秘密覆盖回购,而无法访问它的人可以使用基本回购。补丁仓库可以是 bitbucket 上的私有仓库或托管在其他地方。
或
完全按照 git 解决方案中的描述使用 subrepo。
【解决方案2】:
创建带有模板的filename.ext.sample文件(可能填充了虚拟数据),需要复制并填充特定工作目录中的实际数据。
这是我通常做的;-)
【解决方案3】:
Zerkms 的解决方案快速、简单且干净,可能是防止安全内容被跟踪/发布的最佳选择;但是正如您所说,“如果它不在源代码管理中,它就不存在。”我发现我试图避免源代码控制的更多时候不是安全问题,而只是配置设置。我相信这些应该被跟踪,我现在的雇主有一个相当聪明的设置来处理这个问题,我将在这里尝试简化/概括/总结。
REPOSITORY
code/
...
scripts/
configparse.sh
...
config/
common.conf
env/
development.conf
testing.conf
production.conf
users/
dimo414.conf
mycoworker.conf
...
hosts/
dimo414-laptop.conf
dimo414-server.conf
mycoworker-laptop.conf
...
local.conf*
makefile
.conf*
* untracked file
希望这里的想法非常清晰,我们在每个适当的级别定义设置,从而以合乎逻辑且一致的方式对代码库的行为进行高度精细的控制。
scripts/configparse.sh 脚本依次读取所有必要的配置文件,并从它找到的所有设置中构建.conf。
-
config/common.conf 是起点,包含每个设置的逻辑默认值。许多可能会被覆盖,但这里指定了 something。在未在 common.conf 中首先设置的另一个文件中找到设置是错误的。
-
config/env/ 控制不同环境中的行为,例如指向正确的数据库服务器。
-
config/users/ 查找 $USER.conf 文件,该文件可用于设置我关心的内容,例如提高我的团队工作方面的日志记录级别,或自定义我喜欢在所有机器上使用的行为。
-
config/hosts 对机器做同样的事情,寻找 $HOSTNAME.conf。对于应用程序路径或数据目录等特定于机器的设置很有用。
-
config/local.conf 是一个未跟踪的文件,可让您设置特定于结帐的值和/或版本控制中不需要的内容。
所有这些设置的汇总输出到.conf,这是代码库的其余部分在加载设置时所查找的内容。