【发布时间】:2010-12-21 17:26:58
【问题描述】:
我有一个 mercurial 文件,我希望开发机器提取该文件,但我希望部署服务器不提取该文件(它具有开发机器没有的特殊模块)。这可能吗,还是我应该只使用自定义推送到服务器解决方案而不是只进行 hg 拉取?
【问题讨论】:
标签: deployment mercurial hgignore
我有一个 mercurial 文件,我希望开发机器提取该文件,但我希望部署服务器不提取该文件(它具有开发机器没有的特殊模块)。这可能吗,还是我应该只使用自定义推送到服务器解决方案而不是只进行 hg 拉取?
【问题讨论】:
标签: deployment mercurial hgignore
执行此操作的典型方法是执行以下操作:
您将每个文件的副本存储在存储库中,并正确命名它们。例如,如果有问题的文件是web.config,您将在存储库中存储以下两个:
web.server.configweb.dev.config然后您将添加一个构建步骤以确保将正确的文件复制到实际的 web.config 文件中,您可以使用批处理文件:
if "%COMPUTERNAME%" == "SERVER" copy web.server.config web.config
if not "%COMPUTERNAME%" == "SERVER" copy web.dev.config web.config
然后你会通过 .hgignore 忽略 web.config 本身:
glob:web.config
【讨论】:
我一直使用的 Karlsen 答案的变体。
我在项目中有/config 或/etc 目录。该目录通常包含示例配置,例如:
dev.yamlci_server.yaml然后我的应用程序从 /etc/app.yaml 中提取,这是一个指向正确配置的符号链接,具体取决于它正在运行的主机。
这样做的最佳想法是您没有变体代码路径(批处理脚本分支),这消除了潜在的错误向量。这允许您使用将在生产中使用的相同代码路径(直至查找覆盖文件的位置)。
【讨论】:
这是可以在版本控制之外解决的问题吗?例如,将文件包含在存储库的所有副本中,但启用或禁用它与环境变量或类似的东西的使用。这听起来不像大多数版本控制系统都是为了处理而构建的,除非你在更新后使用讨厌的黑客来执行诸如添加/删除/修补文件之类的事情。
【讨论】: