2011-09-30 21 views
46

我創建了一個遷移,運行了rake db:migrate,它碰到了我的db/schema.rb版本號。然後我做了一個git fetch origin master,看到我的團隊成員發生了變化。所以我做了git stashgit rebase FETCH_HEAD,然後是git stash pop。這會導致db/schema.rb在版本號上發生衝突。管理由Git操作創建的schema.rb中的衝突

Upstream>>> 
ActiveRecord::Schema.define(:version => 20110930179257) do 
=========== 
ActiveRecord::Schema.define(:version => 20110930161932) do 
<<<Stashed 

我認爲適當的修復方法是手動將版本號增加到高於上游的東西。

這是明智的還是壞消息?

感謝, 最大

+1

要回答我的問題,手動遞增版本號碼不是必需的,而且很可能是一個壞主意。從我所知道的情況來看,所需要的只是接受上游版本號。 – maxenglander

回答

81

如果當前數據庫具有正確的模式,你應該:

  • 運行未決的遷移(如果有的話)

    rake db:migrate 
    
  • 覆蓋你schema.rb從您當前的數據庫架構

    rake db:schema:dump 
    
  • ,並承諾

+0

不知道這是否適用於我的情況。我有來自上游的遷移。 – maxenglander

+10

如果您有未決遷移,請運行它們,然後運行它們'rake db:schema:dump' – Xorlev

+0

如果遠程版本較高,是否會在schema.rb中創建沒有更改版本的請求? –

0

的選擇是有一個手動版本腳本這是唯一的添加劑。你想要衝突。架構是一種會讓你難以忍受的東西,如果你不保持它的話。所以一旦被咬,兩次害羞,我不介意使用添加劑只改變管理方案保留模式和查找信息(客戶類型列表)。

6

根據this answer,衝突得到保證。用戶必須手動合併,並將版本設置爲兩者中較高的一個。

16

當我發現自己遇到此衝突時,我只是簡單地遷移數據庫。無論是否有未決遷移,衝突都會得到糾正。

+0

最佳答案,謝謝 – dowi

0

我覺得最好的方法是使用rake db:drop db:create db:migrate來使用僅存在於當前分支上的遷移重新生成模式。這種方式從其他分支遷移不會泄漏到您的模式文件中,並在稍後給您帶來麻煩 - 以防切換分支。

2

這裏就是合併掌握到我的特性分支當我做了在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 
1

~/bin/update-schema-rb

#!/usr/bin/env bash 

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