Techioz Blog

Rails の孤立した移行を解決する最善の方法は何ですか?

概要

プロジェクト内のブランチ間を切り替えており、それぞれのブランチで異なる移行が行われています…これはシナリオです:

 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:reset または rake db:drop はオプションではありません。他のテーブルからデータを失うことはできません…

解決策

最終的に次のように問題を解決しました。

  1. 移行ファイルがあるブランチに移動し、それらをロールバックします。多数のブランチがあり、それらをマージしようとすると多くの競合が発生する場合、これは簡単ではありません。そこで、このコマンドを使用して、各孤立移行のブランチが属することを確認します。

したがって、最後に移行が変更されたときのコミットを見つける必要があります。

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

コミット ハッシュを取得し、それがどのブランチに属するかを次のように判断します。

git branch --contains <COMMIT_HASH>

次に、そのブランチに戻り、ロールバックを実行し、不足しているすべてのファイルに対してこのプロセスを繰り返します。

  1. 移行を実行します。最終的に作業するブランチをチェックアウトし、移行を実行すれば準備完了です。

トラブルシューティング

また、削除されたブランチ上で孤立した移行が行われる場合もありました。

これを解決するために、不足しているファイルと同じ migration_id を持つダミーの移行ファイルを作成し、ロールバックしました。その後、ダミーの移行を削除し、クリーンな移行ステータスを得ることができました:)

もう 1 つの方法は、不足しているファイルをデータベースから直接削除することです (rails dbconsole)。

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