[英]Managing conflict in schema.rb created by Git operation
我创建了一个迁移,运行rake db:migrate
,这增加了我的 db/schema.rb 版本号。 然后我做了一个git fetch origin master
,看到我的团队成员有变化。 所以我做了一个git stash
和一个git rebase FETCH_HEAD
,然后是一个git stash pop
。 这导致 db/schema.rb 中的版本号冲突。
Upstream>>>
ActiveRecord::Schema.define(:version => 20110930179257) do
===========
ActiveRecord::Schema.define(:version => 20110930161932) do
<<<Stashed
我认为适当的解决方法是手动将版本号增加到高于上游的版本号。
这是明智的,还是坏消息?
谢谢,马克斯
如果您当前的数据库具有正确的架构,您应该:
运行挂起的迁移(如果有)
rake db:migrate
从您当前的数据库架构覆盖您的schema.rb
rake db:schema:dump
并提交
当我发现自己遇到这种冲突时,我只需迁移数据库。 无论是否有待处理的迁移,冲突都会得到纠正。
接受上游版本并像往常一样运行rake db:migrate
。
不要担心您创建的迁移(低于上游版本20110930179257
)。 ActiveRecord 使用表schema_migrations
将所有已运行的迁移放在其中。 如果您的迁移不在列表中,而是在db/migrate
目录中,则 ActiveRecord 将运行它们。
人们很容易认为实际上是这一行: ActiveRecord::Schema.define(:version => 20110930179257)
定义了最新的迁移运行,因此不会运行低于它的版本的迁移。 幸运的是,事实并非如此。 Rails 将运行db/migrate
文件夹中但还没有在schema_migrations
表中的任何迁移。
根据这个答案,冲突是有保证的。 用户必须手动合并,并将版本设置为两者中较高的版本。
以下是我在将 master 合并到我的功能分支时执行的操作,以解决 db/schema.rb 中的冲突:
$ git merge --abort
$ git checkout master
$ rake db:drop db:create db:migrate
$ git checkout -- db/schema.rb
$ git checkout my_feature_branch
$ rake db:migrate
$ git add db/schema.rb
$ git commit -m 'Updated schema'
$ git merge master
~/bin/update-schema-rb
:
#!/usr/bin/env bash
git co master
bin/rake db:reset db:seed
git co -
bin/rake db:migrate
我觉得最好的方法是执行rake db:drop db:create db:migrate
以使用仅存在于当前分支上的rake db:drop db:create db:migrate
来重新生成模式。 这样,从其他分支的迁移就不会泄漏到您的架构文件中,并在以后让您头疼——以防您频繁切换分支。
一个选项是使用手动版本脚本,该脚本仅可添加。 你想要冲突。 如果你不掌握它,Schema 就会让你很难受。 因此,一旦被咬,两次害羞,我不介意将架构和查找信息(客户类型列表)与仅添加的更改管理方案保持一致。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.