2011-09-30 22 views
46

我创建了一个迁移,运行了rake db:migrate,它碰到了我的db/schema.rb版本号。然后我做了一个git fetch origin master,看到我的团队成员发生了变化。所以我做了git stashgit rebase FETCH_HEAD,然后是git stash pop。这会导致db/schema.rb在版本号上发生冲突。管理由Git操作创建的schema.rb中的冲突

Upstream>>> 
ActiveRecord::Schema.define(:version => 20110930179257) do 
=========== 
ActiveRecord::Schema.define(:version => 20110930161932) do 
<<<Stashed 

我认为适当的修复方法是手动将版本号增加到高于上游的东西。

这是明智的还是坏消息?

感谢, 最大

+1

要回答我的问题,手动递增版本号码不是必需的,而且很可能是一个坏主意。从我所知道的情况来看,所需要的只是接受上游版本号。 – maxenglander

回答

81

如果当前数据库具有正确的模式,你应该:

  • 运行未决的迁移(如果有的话)

    rake db:migrate 
    
  • 覆盖你schema.rb从您当前的数据库架构

    rake db:schema:dump 
    
  • ,并承诺

+0

不知道这是否适用于我的情况。我有来自上游的迁移。 – maxenglander

+10

如果您有未决迁移,请运行它们,然后运行它们'rake db:schema:dump' – Xorlev

+0

如果远程版本较高,是否会在schema.rb中创建没有更改版本的请求? –

0

的选择是有一个手动版本脚本这是唯一的添加剂。你想要冲突。架构是一种会让你难以忍受的东西,如果你不保持它的话。所以一旦被咬,两次害羞,我不介意使用添加剂只改变管理方案保留模式和查找信息(客户类型列表)。

6

根据this answer,冲突得到保证。用户必须手动合并,并将版本设置为两者中较高的一个。

16

当我发现自己遇到此冲突时,我只是简单地迁移数据库。无论是否有未决迁移,冲突都会得到纠正。

+0

最佳答案,谢谢 – dowi

0

我觉得最好的方法是使用rake db:drop db:create db:migrate来使用仅存在于当前分支上的迁移重新生成模式。这种方式从其他分支迁移不会泄漏到您的模式文件中,并在稍后给您带来麻烦 - 以防切换分支。

2

这里就是合并掌握到我的特性分支当我做了在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 
1

~/bin/update-schema-rb

#!/usr/bin/env bash 

git co master 
bin/rake db:reset db:seed 
git co - 
bin/rake db:migrate