解决 Rails 孤立迁移的最佳方法是什么? [英] What is the best way to resolve Rails orphaned migrations?

查看:15
本文介绍了解决 Rails 孤立迁移的最佳方法是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have been switching between branches in a project and each of them have different migrations... This is the scenario:

$ rake db:migrate:status

$ 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 由于缺少文件而根本无法工作...

The problem is rake db:rollback don't work at all because of the missing files...

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

What should I do to be able to rollback again and get rid of the NO FILE messages?

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

Btw, rake db:reset or rake db:drop are not an option, I cannot lose data from other tables...

推荐答案

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

I ended up solving the problem like this:

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

(1) Go to the branches that has the migration files and roll them back. This is not trivial when you have many branches which are will result in many conflicts if you try to merge them. So I use this commands to find out the branches of each orphan migration belongs to.

所以,我需要找到上次修改迁移的提交.

So, I need to find commit of the last time the migration was modified.

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

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

I take the commit hash and determine which branch it belongs like this:

git branch --contains <COMMIT_HASH>

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

Then I can go back to that branch, do a rollback and repeat this process for all the missing files.

(2) 运行迁移:检查您最终要处理的分支并运行迁移,您应该一切顺利.

(2) Run migrations: checkout the branch you finally want to work on and run the migrations and you should be good to go.

疑难解答

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

I also ran in some cases where orphaned migrations where on deleted branches.

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

To solve this I created dummy migration files with the same migration_id of the missing files and roll them back. After that, I was able to delete they dummy migrations and have a clean migration status :)

另一种选择是直接从数据库中删除丢失的文件:

Another alternative is deleting the missing files from the database directly:

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

这篇关于解决 Rails 孤立迁移的最佳方法是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆