[英]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 將運行它們。
人們很容易認為實際上是這一行: 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.