管理由Git操作创建的schema.rb中的冲突

时间:2011-09-30 17:57:13

标签: ruby-on-rails git migration

我创建了一个迁移,运行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

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

这是明智的还是坏消息?

谢谢, 最大

8 个答案:

答案 0 :(得分:87)

如果您当前的数据库具有正确的架构,您应该:

  • 运行待定迁移(如果有)

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

    rake db:schema:dump
    
  • 并提交

答案 1 :(得分:19)

当我发现自己遇到这种冲突时,我只是迁移数据库。无论是否有未决的迁移,冲突都将得到纠正。

答案 2 :(得分:7)

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

答案 3 :(得分:2)

以下是将master合并到我的功能分支时对db / schema.rb中的冲突进行故障排除时的操作:

{{1}}

答案 4 :(得分:1)

~/bin/update-schema-rb

#!/usr/bin/env bash

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

答案 5 :(得分:1)

tldr

接受上游版本并像往常一样运行rake db:migrate

为什么要走

不用担心您创建的迁移(这些迁移在上游版本20110930179257下)。 ActiveRecord使用表schema_migrations放置所有已运行的迁移。如果您的迁移不在列表中,而是在db/migrate目录中,则ActiveRecord将运行它们。

这是表格,您可以更好地对其进行可视化处理: schema_migrations table

很容易以为实际上就是这一行: ActiveRecord::Schema.define(:version => 20110930179257) 定义了最新的迁移运行,因此不会运行低于该版本的迁移。幸运的是,这不是事实。 Rails将运行db/migrate文件夹中但尚未在schema_migrations表中的所有迁移。

答案 6 :(得分:0)

一个选项是拥有一个只有添加剂的手动版本脚本。你想要冲突。如果你没有掌握它,那么Schema会让你很难受。因此,一旦被咬,两次害羞,我不介意保持架构和查询信息(客户类型列表)只有添加剂的变更管理方案。

答案 7 :(得分:0)

我认为最好的方法是使用仅存在于当前分支上的迁移来rake db:drop db:create db:migrate重新生成模式。这样,来自其他分支的迁移不会泄漏到您的模式文件中,以后会让您头疼 - 如果您经常切换分支。