2010-12-21 87 views
6

我在mercurial中有一个文件,我想让开发计算机来提取文件,但我希望部署服务器不要拉取文件(它有特殊的mods,开发计算机没有) 。这是可能的,或者我应该只是有一个自定义推送到服务器解决方案,而不是仅仅做一个hg拉?有条件的Mercurial忽略文件

回答

6

要做到这一点是做以下的典型方式:

您存储在库中的每个文件的副本,并正确命名。举例来说,如果有问题的文件是web.config,你将存储在仓库中有以下两种:

  • web.server.config
  • web.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 
1

这是可以在版本控制之外解决的问题吗?例如,将文件包含在存储库的所有副本中,但启用或禁用其与环境变量或类似用途的使用。这听起来并不像大多数版本控制系统要处理的东西,除非您在更新后使用令人讨厌的黑客来执行诸如添加/删除/修补程序文件等操作。

+0

我同意,但是这个文件在服务器和开发机器上都是必需的。这是一个设置文件,其中包含通往web urls/db连接字符串/ etc的路径,并且这些值在服务器上与开发机器不同。 – Jan 2010-12-21 18:05:22

1

一种选择是创建一个特殊的hgignore文件部署服务器,这可能会或可能不会包括在库中。然后在服务器的hgrc文件中使用ignore变量指定特殊hgignore文件的路径。

这将确保文件的更新将被部署服务器忽略,但仍可照常为开发机器进行更新。

2

卡尔森的答案的一个变种,我总是使用。

我在项目中有/config/etc目录。该目录通常会包含样CONFIGS:

  • dev.yaml
  • ci_server.yaml

然后我的应用程序从/etc/app.yaml这是一个符号链接取决于它正在运行在主机上的正确配置拉。

最好考虑这样做是因为您没有变体代码路径(批处理脚本分支),其中消除了潜在的bug向量。这使您可以执行将在生产中使用的相同代码路径(直至寻找覆盖文件的位置)。