[英]What is the preferred way to manage schema.rb in git?
我不想将schema.rb
添加到.gitignore
,因为我希望能够从该文件加载新的数据库模式。 但是,保持签入是导致各种虚假冲突,可以通过新的db:migrate:reset
轻松解决。
基本上我想要一种方法:
将有一两个人负责更新schema.rb
并知道它是正确的。
有没有办法我可以吃蛋糕然后吃它?
我担心你所寻找的神奇解决方案不存在。 此文件通常在版本控制中进行管理,然后对于版本行上的任何冲突,只需选择两个日期中的较晚者。 只要您还运行所有相关的迁移,任何事情都不会以这种方式失去同步。 如果两个开发人员对schema.rb的类似区域进行了修改,并且除了版本之外还会遇到冲突,那么您将面临正常的合并冲突解决方案,但在我看来,这些通常很容易理解和解决。 我希望这会有所帮助!
您可以做的另一件事是使用:
git update-index --assume-unchanged /path/schema.rb
这将使文件保留在存储库中,但不会跟踪更改。 你可以随时使用以下方式切换跟踪:
git update-index --no-assume-unchanged /path/schema.rb
对我来说非常有用的是删除和.gitignore schema.rb
,然后在他们使用rake db:migrate
时为每个开发人员重新生成它。
通过简单地定期“迁移”迁移,您仍然可以实现所需的目标,而无需从0迁移,并且可能会在几年前破坏迁移的风险。 你可以这样做:
rake db:migrate
运行所有未完成的rake db:migrate
ActiveRecord::Schema.define
块中schema.rb
的内容 def up
initial_schema迁移中(覆盖已存在的内容) 现在,您的initial_schema迁移是新系统的起点,您不必担心schema.rb
中可能无法正确解决的冲突。 它并不神奇,但它确实有效。
您可以定义合并策略。 我找到了这个解决方案,但不记得来源
[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"
我建造了一个宝石来解决这个问题。
它对列,索引名和外键进行排序,删除多余的空格并运行Rubocop以进行某些格式化以统一schema.rb文件的输出。
https://github.com/jakeonrails/fix-db-schema-conflicts
将它添加到您的Gemfile后,您只需运行rake db:migrate
或rake db:schema:dump
就像正常一样。
在pre-commit git hook中执行rake db:dump是否足够?
以下不一定会修复(1)或(2),但它可能会解决合并问题,然后可能(1)和(2)消失。
而不是使用.gitignore
,使用单独的分支: Develop
省略schema.rb
和Test
and Deploy
,其中包括schema.rb
。 只在Develop分支中进行代码更改,永远不会从Test
合并到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中,分支是指向文件内容集合的指针,因此它们可以包含或排除特定文件以及跟踪文件版本。 这使它们成为构建特定工作流程的灵活工具。
schema.rb
文件。 每次迁移数据库时, schema.rb
文件都会更新并显示为git status
。 在处理某些事情并偶尔进行git pull
,这可能很烦人,因为你必须提交schema.rb
文件才能解决冲突。 这意味着每次迁移数据库时,都需要提交schema.rb
文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.