在git中管理schema.rb的首选方法是什么?

Ott*_*tto 49 git workflow ruby-on-rails schema.rb

我不希望添加schema.rb.gitignore,因为我希望能够从该文件中加载一个新的数据库架构.但是,保持检查会导致各种各样的虚假冲突,这些冲突很容易通过新鲜的方式解决db:migrate:reset.

基本上我想要一种方法:

  1. 将schema.rb保留在存储库中以进行部署时数据库设置
  2. 将schema.rb保留在'.gitignore'中以进行常规开发

将有一两个人负责更新schema.rb并知道它是正确的.

有没有办法我可以吃蛋糕然后吃它?

Ada*_*der 21

我担心你所寻找的神奇解决方案不存在.此文件通常在版本控制中进行管理,然后对于版本行上的任何冲突,只需选择两个日期中的较晚者.只要您还运行所有相关的迁移,任何事情都不会以这种方式失去同步.如果两个开发人员对schema.rb的类似区域进行了修改,并且除了版本之外还会遇到冲突,那么您将面临正常的合并冲突解决方案,但在我看来,这些通常很容易理解和解决.我希望这会有所帮助!

  • `schema.rb`被忽略了.你是对的,没有神奇的解决方案.任何取决于文件的东西有时会被忽略,有时候没有各种各样的问题.我希望以后不会咬我. (2认同)

Hea*_*ota 8

您可以做的另一件事是使用:

git update-index --assume-unchanged /path/schema.rb
Run Code Online (Sandbox Code Playgroud)

这将使文件保留在存储库中,但不会跟踪更改.你可以随时使用以下方式切换跟踪:

git update-index --no-assume-unchanged /path/schema.rb
Run Code Online (Sandbox Code Playgroud)


Tom*_*ris 2

对我来说非常有效的方法是删除 .gitignore schema.rb,然后在每个开发人员 .gitignore 时重新生成它rake db:migrate

您仍然可以实现您想要的目标,而无需从 0 开始迁移,也无需冒着几年前迁移失败的风险,只需定期“汇总”迁移即可。您可以通过以下方式执行此操作:

  1. 运行所有未完成的迁移rake db:migrate
  2. 获取块schema.rb中的内容ActiveRecord::Schema.define
  3. 将其粘贴到您的initial_schema迁移中def up(覆盖已有的内容)
  4. 删除所有其他迁移

现在,您的initial_schema 迁移是您新系统的起点,您不必担心schema.rb可能无法正确解决的冲突。这并不神奇,但确实有效。

  • 我不确定我是否遵循。`schema.rb`(不是 .db)由 Rails 在内部使用,用于设置测试数据库并进行重置。仅仅导出到sql并不能解决任何问题。保留多年的迁移也是不可能的。由于种种原因,经过多年的变革和数百次的迁移,应用程序不会总是从0迁移。 (2认同)