在git中pipe理schema.rb的首选方法是什么?
我不想将schema.rb
添加到.gitignore
,因为我希望能够从该文件加载新的数据库模式。 但是,保持login状态会导致各种各样由新鲜的db:migrate:reset
轻易解决的虚假冲突。
基本上我想要一个方法来:
- 将schema.rb保存在部署时数据库设置的存储库中
- 在“.gitignore”中保留schema.rb以进行一般的开发
将有一两个人负责更新schema.rb
并知道这是正确的。
有没有办法让我的蛋糕吃掉呢?
对我来说,真正有用的是删除和.gitignore schema.rb
,然后在每个开发人员使用rake db:migrate
时重新生成它。
您仍然可以实现您所希望的目标,而不需要从0迁移,并且可以冒险从几年前开始破解迁移,只需定期执行迁移“汇总”即可。 你可以这样做:
- 使用
rake db:migrate
运行所有未完成的rake db:migrate
- 在
ActiveRecord::Schema.define
块中ActiveRecord::Schema.define
schema.rb
的内容 - 把它粘贴到你的initial_schema迁移里面(重写已经存在的内容)
- 删除所有其他迁移
现在,您的initial_schema迁移是新系统的起点,您不必担心schema.rb
中可能无法正确parsing的冲突。 这不是神奇的,但它的作品。
恐怕你所寻找的魔法解决scheme不存在。 该文件通常在版本控制中进行pipe理,然后对于版本行上的任何冲突,只需select两个date中较晚的一个。 只要你还运行所有关联的迁移,就不会有这种方式不同步。 如果两个开发人员已经对schema.rb的类似区域进行了修改,并且除了版本之外还有冲突,那么您将遇到正常的合并冲突解决scheme,但在我看来这些通常很容易理解和解决。 我希望这有助于一些!
你可以做的另一件事是使用:
git update-index --assume-unchanged /path/schema.rb
这会将文件保存在存储库中,但不会跟踪更改。 您可以随时使用以下function切换跟踪:
git update-index --no-assume-unchanged /path/schema.rb
是否足够做一个rake数据库:转储在预先提交的git钩子?
以下不一定会解决(1)或(2),但可能会考虑合并问题,然后可能(1)和(2)消失。
而不是使用.gitignore
,使用不同的分支: Develop
省略了schema.rb
和包含schema.rb
Test
和Deploy
。 只在开发分支中进行代码更改,而不是从Test
Develop
到Develop
。 将schema.rb
保存在一个单独的分支中:
Developer A Develop -------- Local Schema \ Your Repo Test ---------> Dev A ---------> Dev B Developer B / Master Develop -------- Schema Local Schema Test Test Deploy
在Git中,分支是指向文件内容集合的指针,所以它们可以包含或排除特定文件以及跟踪文件版本。 这使他们灵活的工具来build立你的特定工作stream程。
你可以定义一个合并策略。 我find了这个解决scheme,但不记得来源
[merge "railsschema"] name = newer Rails schema version driver = "ruby -e '\n\ system %(git), %(merge-file), %(--marker-size=%L), %(%A), %(%O), %(%B)\n\ b = File.read(%(%A))\n\ b.sub!(/^<+ .*\\nActiveRecord::Schema\\.define.:version => (\\d+). do\\n=+\\nActiveRecord::Schema\\.define.:version => (\\d+). do\\n>+ .*/) do\n\ %(ActiveRecord::Schema.define(:version => #{[$1, $2].max}) do)\n\ end\n\ File.open(%(%A), %(w)) {|f| f.write(b)}\n\ exit 1 if b.include?(%(<)*%L)'"
把这个“某个地方”和
git-config --global core.attributesfile "somewhere"
我build立了一个gem来解决这个问题。
它对列,索引名和外键进行sorting,删除多余的空白,并运行Rubocop进行格式化,以统一schema.rb文件的输出。
https://github.com/jakeonrails/fix-db-schema-conflicts
将它添加到你的Gemfile后,你只需运行rake db:migrate
或rake db:schema:dump
就像正常一样。
- 提交
schema.rb
文件。 - 运行git pull(或者继续你正在做的事情)
每次迁移数据库时, schema.rb
文件都会更新并显示为git status
。 当处理某些事情,偶尔做git pull
,这可能会令人讨厌,因为在解决冲突之前必须提交schema.rb
文件。 这意味着每次迁移数据库时,都需要提交schema.rb
文件。