繁体   English   中英

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

[英]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 将运行它们。

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

人们很容易认为实际上是这一行: 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM