2010-06-05 81 views
9

這是一個我知道的小將軍,但它一直在竊聽我。我一直在用Git遠程處理大量的rails項目,每次我做了git pull,看到有某種數據更改(遷移或schema.rb更改),我做了一個rake db:migrate爲什麼在剛運行rake db時遷移schema.rb(在Git的眼中):migrate?

這些通常運行良好,我可以繼續工作。但是,如果你執行了git pull然後git status,那麼你的工作目錄是乾淨的(顯然),然後執行rake db:migrate(顯然當發生更改時)和另一個git status,並且突然你的db/schema.rb發生了改變。我一直在做一個git checkout立即重置回schema.rb文件的最新承諾版本,但爲什麼這是必要的?!鐵軌在做什麼?更新時間戳?我似乎無法弄清差異是什麼,但也許我只是錯過了一些東西?

+1

運行'git diff db/schema.rb'時diff是什麼? – 2010-06-05 20:27:58

+0

感謝所有的評論傢伙!現在有更多的意義......這是一個小小的煩惱,但嘿總是想方設法讓生活更輕鬆。 – erskingardner 2010-06-06 10:34:46

回答

10

該模式使計算機在第一次安裝時運行rake db:schema:load,而不必運行遷移,如果模型被重命名或刪除等,遷移可能會過時。遷移後它應該更新,並且您總是希望最新版本簽入源代碼管理。

+0

,但僅僅提交在模式文件中看到的更改是否好呢? – locoboy 2014-07-01 05:50:53

+0

您還將如何保持最新? – x1a4 2014-07-18 20:07:23

2

schema.rb反映了你的數據庫模式,所以當你遷移時(隨着變化),你的模式也會改變,以反映你的數據庫變化。我通常將schema.rb與database.yml一起添加到我們的gitignore中(可能是因爲不是使用schema:加載如下所示,我通常在克隆現有應用時執行sql dump - 但這只是我)

-1

db:migrate的結尾是轉儲架構。它會有不同的時間戳(git應該告訴你),不同版本的rails /數據庫寶石會給你稍微不同的格式。這一直都是一個小小的煩惱。

我建議您將schema.rb添加到您的.gitignore文件中。

+2

在Rails 2+中,'schema.rb'中有以下注釋:'強烈建議您將此文件檢入到您的版本控制系統中.'我建議**不要**添加'schema.rb' '.gitignore' – 2016-09-22 01:01:18

+0

我會修改/更新/收回我的回答:是的,現在建議您檢查它,這對於大多數項目來說可能是個好主意。如果沒有其他變化,可能會有一些邏輯不會隨意更新時間戳 - 看起來它不會在你的底下變化太多,所以可能是這樣。 有些情況下您可能不想檢查架構,但現在通常最好檢查它。 – ndp 2016-10-30 01:43:07

5

轉儲中的屬性順序反映了數據庫中屬性的順序,如果一個人在本地進行了遷移,手動向前和向後運行它們以及編輯內容到讓他們如此。可以創建一個狀態,其中推送者的schema.rb中的屬性順序與其他人在運行遷移時看到的順序不同。

如果很容易重新創建開發數據,只需從schema.rb重建數據庫 - 然後每個人都恢復同步(但是請記住,您無法從創建表的SQL轉儲中重新加載數據 - 這將會重新創建問題,它必須是僅數據轉儲/加載)。在最糟糕的情況下,您可以創建一個遷移來刪除該列,另一個可以重新添加該列。

相關問題