如何使用git维护一个稍微不同的生产源代码副本?

时间:2011-05-03 19:08:43

标签: ruby-on-rails configuration config environment

我有一个Ruby on Rails应用程序,它发送电子邮件。

在制作中,我想使用一些X SMTP服务器,但在开发中我想使用其他一些SMTP服务器(因此我的开发和生产环境中的SMTP设置配置文件不同)

所以我需要维护2个配置文件(每个用于开发/生产环境的SMTP设置一个文件)。

截至目前,我将Y STMP的设置保存在我的开发机器上的文件中。我从github仓库克隆生产代码,使用Y SMTP的设置修改工作副本并继续。然后,当我必须将更改推送到github时,我会反转该过程。它有效,但我认为应该有更好的方法吗?

在开发代码库和生产代码库之间处理这种“小差异”的“git方式”是什么?


更新

Per @Mike Axiak,这是你的意思:(为了简单起见我假设我没有使用ln,而是使用copy方法)

设置源代码,以便本地计算机上有2个设置文件:

  • smtp.settings.prod
  • smtp.settings.dev

两者都添加到.gitignore

要处理本地副本:

  • 从github中提取代码
  • 将smtp.settings.dev复制到smtp.settings
  • 使用。

将更改推送到服务器:

  • 在推送之前,将文件smtp.settings.prod复制到smtp.settings

如果这是你的意思,有没有办法通过git自动化复制过程?

5 个答案:

答案 0 :(得分:5)

Rails已经使用配置/环境目录中的文件支持这种事情。只需在适当的文件中添加您的设置即可。

答案 1 :(得分:3)

在大多数地方,我通过使用一个小的覆盖配置文件来处理这个问题,通常使用.prod或.dev后缀。然后在实际的签出环境中,使用ln将当前文件符号链接(或在windows复制中)到真实设置文件名。然后告诉git忽略设置文件(使用.gitignore)

答案 2 :(得分:1)

如果配置文件不是一直在变化,我通常会在存储库中保留一个版本化的通用设置文件,比如settings.conf.dist,然后将settings.conf添加到我的.gitignore。现在,当我克隆一个新的存储库时,我只需cp settings.conf.dist settings.conf制作应用程序设置的副本(被git忽略),然后根据需要进行修改。

优点是你在提交/推/拉时不必担心它。缺点是,当您进行更改(如添加新设置)时,您需要记住将其放入.dist版本,并将其单独添加到每个本地settings.conf文件中。就像我说的那样,当你不是一直不添加新设置时效果最好。

修改:我只有在这些本地设置文件中的计算机上进行更改的设置。如果您有其他设置对所有站点都相同,我会有另一个配置文件,然后包含“本地”设置文件。

答案 3 :(得分:1)

执行Gitorious的工作,它使用configuration/environments支持,并在运行脚本时为脚本提供RAILS_ENV环境变量,以便它知道要使用的配置。

一个目录,多个配置。在将版本升级到生产时删除未使用的配置。

我还通过基于部署服务器的主机名配置来完成类似但更自动的操作。 dev.mycompany.com vs test.mycompany.com vs mycompany.com有许多更自动化的方法,而不是处理多个文件,这只是人为错误和痛苦的处方。

答案 4 :(得分:0)

我这样解决了。在.bash_aliases的帮助下。

git clone
git checkout -b production.conf

根据需要修改config.file。

git commit -a
git checkout master

用工作副本做点什么。

git checkout production.conf -- config.file
git commit -a
git push