所以我在工作中建议的是将db / schema.rb放入.gitignore文件中,这样我们就没有(不时)合并问题。
有一些担心,如果发生了可怕的事情(流星在数据库服务器上从天而降,同时所有db / migrete文件都已损坏),我们可能会松开架构,我们将不得不使用rake db:purge (重用schema.rb)。我同意这是可能的,这是一个很好的论据,但它不应该是问题,因为每次我们执行rake db:migrate时都会生成db / schema.rb。因此,即使我们不在服务器上推送schema.rb,我们也在推动迁移添加运行db:migrate每次我们使用数据库更改进行部署时,db:migrate rails将在服务器端自动生成schema.rb,并且schema.rb在服务器上保持不变,直到我们执行另一个db:migrate。
那么你的意见是什么,我们是否应该将db / schema.rb放入git ignore?
谢谢
答案 0 :(得分:31)
我总是建议将schema.rb保留在版本控制中,因为像rake db:schema:load这样的任务取决于它在那里。
关于冲突,您在谈论架构版本冲突吗?使用此处显示的合并算法可以轻松减轻这些问题:http://tbaggery.com/2010/10/24/reduce-your-rails-schema-conflicts.html
通过小心您对存储库的提交,可以轻松避免其他冲突,例如列定义切换位置。
答案 1 :(得分:4)
您应该为VCS提供重现操作环境所需的一切
如果为了重建您的应用程序,您需要拥有正确的schema.rb
(在正确的版本中),然后是,它可以进行版本控制。
但是如果你可以通过另一个进程获得它,那么最好通过其他参考而不是VCS来备份。
答案 2 :(得分:4)
当您在开发不同模型属性集的功能分支之间切换时,如果没有schema.rb,您有时需要:
rake db:migrate:down VERSION=xxx
一段时间前创建的迁移,但未与其他分支合并git checkout branch
rake db:migrate
迁移所有新创建的分支我在以前的项目中遇到了一些问题,其中schema.rb在.gitignore中。每当我看到错误的时候,我就不得不删除数据库并从迁移中重新创建,而使用schema.rb我可以在几分之一的时间内加载模式,然后加载rake db:seed
来加载数据。但这并不重要。
我也很好奇你在使用schema.rb时遇到了什么问题?大多数情况下,您可以使用rake db:dump
覆盖此文件而不必担心更改(我假设您没有手动修改数据库结构),只需将其添加为合并解析。