web-dev-qa-db-ja.com

Git操作によって作成されたschema.rbの競合を管理する

移行を作成し、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

適切な修正は、バージョン番号をアップストリームよりも高い値に手動でインクリメントすることだと思います。

これは賢明なことですか、それとも悪い知らせですか?

ありがとう、マックス

52
maxenglander

現在のデータベースに正しいスキーマがある場合、次のことを行う必要があります。

  • 保留中の移行を実行します(ある場合)

    rake db:migrate
    
  • 現在のデータベーススキーマからschema.rbを上書きします

    rake db:schema:dump
    
  • そしてコミット

87
Wizard of Ogz

この競合に気付いたときは、単にデータベースを移行します。保留中の移行があるかどうかにかかわらず、競合は修正されます。

19
Sean McMills

この回答 によると、競合が保証されます。ユーザーは手動でマージし、バージョンを2つのうちの高い方に設定する必要があります。

7
lulalala

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
2
Mark Kreyman

tldr

アップストリームバージョンを受け入れ、通常どおりrake db:migrateを実行します。

なぜそれが道なのか

作成した移行(アップストリームバージョン20110930179257の下)について心配する必要はありません。 ActiveRecordは、schema_migrationsテーブルを使用して、実行されたすべての移行を格納します。移行がリストになく、db/migrateディレクトリにある場合、ActiveRecordはそれらを実行します。

視覚化できるように、表を次に示します。 schema_migrations table

最新の移行の実行を定義するのは、実際には次の行であると考えがちです:ActiveRecord::Schema.define(:version => 20110930179257)、それより下のバージョンの移行は実行されません。幸いにもそうではありません。 Railsは、db/migrateフォルダーにあり、schema_migrationsテーブルにない移行を実行します。

1
Adam Sibik

~/bin/update-schema-rb

#!/usr/bin/env bash

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

最善のアプローチはrake db:drop db:create db:migrate現在のブランチにのみ存在する移行を使用してスキーマを再生成します。そうすれば、他のブランチからの移行がスキーマファイルに漏れることはなく、後でブランチを頻繁に切り替える場合に頭痛の種になります。

0
Dr.Strangelove

オプションは、追加のみの手動バージョンスクリプトを持つことです。そこで、あなたは衝突を望みます。スキーマは、その上にとどまらないと苦労するものです。一度噛まれると、恥ずかしがり屋になりますが、スキーマとルックアップ情報(顧客タイプのリスト)を追加のみの変更管理スキームで保持しても構いません。

0
Adam Dymitruk