[英]What is the preferred way to manage schema.rb in git?
我不想將schema.rb
添加到.gitignore
,因為我希望能夠從該文件加載新的數據庫模式。 但是,保持簽入是導致各種虛假沖突,可以通過新的db:migrate:reset
輕松解決。
基本上我想要一種方法:
將有一兩個人負責更新schema.rb
並知道它是正確的。
有沒有辦法我可以吃蛋糕然后吃它?
我擔心你所尋找的神奇解決方案不存在。 此文件通常在版本控制中進行管理,然后對於版本行上的任何沖突,只需選擇兩個日期中的較晚者。 只要您還運行所有相關的遷移,任何事情都不會以這種方式失去同步。 如果兩個開發人員對schema.rb的類似區域進行了修改,並且除了版本之外還會遇到沖突,那么您將面臨正常的合並沖突解決方案,但在我看來,這些通常很容易理解和解決。 我希望這會有所幫助!
您可以做的另一件事是使用:
git update-index --assume-unchanged /path/schema.rb
這將使文件保留在存儲庫中,但不會跟蹤更改。 你可以隨時使用以下方式切換跟蹤:
git update-index --no-assume-unchanged /path/schema.rb
對我來說非常有用的是刪除和.gitignore schema.rb
,然后在他們使用rake db:migrate
時為每個開發人員重新生成它。
通過簡單地定期“遷移”遷移,您仍然可以實現所需的目標,而無需從0遷移,並且可能會在幾年前破壞遷移的風險。 你可以這樣做:
rake db:migrate
運行所有未完成的rake db:migrate
ActiveRecord::Schema.define
塊中schema.rb
的內容 def up
initial_schema遷移中(覆蓋已存在的內容) 現在,您的initial_schema遷移是新系統的起點,您不必擔心schema.rb
中可能無法正確解決的沖突。 它並不神奇,但它確實有效。
您可以定義合並策略。 我找到了這個解決方案,但不記得來源
[merge "railsschema"]
name = newer Rails schema version
driver = "ruby -e '\n\
system %(git), %(merge-file), %(--marker-size=%L), %(%A), %(%O), %(%B)\n\
b = File.read(%(%A))\n\
b.sub!(/^<+ .*\\nActiveRecord::Schema\\.define.:version => (\\d+). do\\n=+\\nActiveRecord::Schema\\.define.:version => (\\d+). do\\n>+ .*/) do\n\
%(ActiveRecord::Schema.define(:version => #{[$1, $2].max}) do)\n\
end\n\
File.open(%(%A), %(w)) {|f| f.write(b)}\n\
exit 1 if b.include?(%(<)*%L)'"
把這個“放在某處”
git-config --global core.attributesfile "somewhere"
我建造了一個寶石來解決這個問題。
它對列,索引名和外鍵進行排序,刪除多余的空格並運行Rubocop以進行某些格式化以統一schema.rb文件的輸出。
https://github.com/jakeonrails/fix-db-schema-conflicts
將它添加到您的Gemfile后,您只需運行rake db:migrate
或rake db:schema:dump
就像正常一樣。
在pre-commit git hook中執行rake db:dump是否足夠?
以下不一定會修復(1)或(2),但它可能會解決合並問題,然后可能(1)和(2)消失。
而不是使用.gitignore
,使用單獨的分支: Develop
省略schema.rb
和Test
and Deploy
,其中包括schema.rb
。 只在Develop分支中進行代碼更改,永遠不會從Test
合並到Develop
。 將schema.rb
保存在單獨的分支中:
Developer A
Develop --------
Local Schema \ Your Repo
Test ---------> Dev A
---------> Dev B
Developer B / Master
Develop -------- Schema
Local Schema Test
Test Deploy
在Git中,分支是指向文件內容集合的指針,因此它們可以包含或排除特定文件以及跟蹤文件版本。 這使它們成為構建特定工作流程的靈活工具。
schema.rb
文件。 每次遷移數據庫時, schema.rb
文件都會更新並顯示為git status
。 在處理某些事情並偶爾進行git pull
,這可能很煩人,因為你必須提交schema.rb
文件才能解決沖突。 這意味着每次遷移數據庫時,都需要提交schema.rb
文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.