ruby-on-rails - 解决 Rails 孤立迁移的最佳方法是什么?

标签 ruby-on-rails ruby-on-rails-3 git migration rails-migrations

我一直在一个项目的分支之间切换,每个分支都有不同的迁移......这是场景:

$ rake db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   ...
   up     20130307154128  Change columns in traffic capture
   up     20130311155109  Remove log settings
   up     20130311160901  Remove log alarm table
   up     20130320144219  ********** NO FILE **********
   up     20130320161939  ********** NO FILE **********
   up     20130320184628  ********** NO FILE **********
   up     20130322004817  Add replicate to root settings
   up     20130403190042  ********** NO FILE **********
   up     20130403195300  ********** NO FILE **********
   up     20130403214000  ********** NO FILE **********
   up     20130405164752  Fix ap hostnames
   up     20130410194222  ********** NO FILE **********

问题是 rake db:rollback 根本不工作,因为缺少文件...

我应该怎么做才能再次回滚并摆脱 NO FILE 消息?

顺便说一句,rake db:resetrake db:drop 不是一个选项,我不能丢失其他表中的数据...

最佳答案

我最终是这样解决问题的:

(1) 转到有迁移文件的分支并回滚它们。当您有许多分支时,这不是微不足道的,如果您尝试 merge 它们会导致许多冲突。所以我使用这个命令来找出每个孤立迁移所属的分支。

因此,我需要找到上次修改迁移的提交。

git log --all --reverse --stat | grep <LASTEST_ORPHAN_MIGRATION_ID> -C 10

我采用提交哈希并确定它属于哪个分支,如下所示:

git branch --contains <COMMIT_HASH>

然后我可以回到那个分支,进行回滚并对所有丢失的文件重复这个过程。

(2) 运行迁移:检查您最终要处理的分支并运行迁移,您应该可以开始了。

疑难解答

在某些情况下,我还在已删除的分支上运行孤立迁移。

为了解决这个问题,我创建了与丢失文件具有相同 migration_id 的虚拟迁移文件,并将它们回滚。在那之后,我能够删除他们的虚拟迁移并拥有干净的迁移状态:)

另一种方法是直接从数据库中删除丢失的文件(rails dbconsole):

delete from schema_migrations where version='<MIGRATION_ID>';

关于ruby-on-rails - 解决 Rails 孤立迁移的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16041790/

相关文章:

visual-studio-2010 - 在 Git Branch-A 中添加的文件在 Branch-B 中可见

ruby-on-rails - 在 .each 循环中获取下一个项目而不结束当前项目的迭代

css - 错误 : File to import not found or unreadable: bootstrap-sprockets

ruby-on-rails - :through association 的 Rails where 子句

ruby-on-rails - 如何在 Ruby 中将以下代码缩减为一行?

ruby-on-rails - Gem libxml-ruby (1.1.4) 安装但在运行时失败

ruby-on-rails - 使用 ruby​​ on Rails 仅从 github api 中提取 Unresolved 问题,而不进行任何 pull 请求

java - Git:将文件自动 merge 为冲突文件

ruby-on-rails - Ruby ActiveRecord : validate format of an integer field

ruby-on-rails - Rails测试默认请求主机