簡體   English   中英

在git中管理schema.rb的首選方法是什么?

[英]What is the preferred way to manage schema.rb in git?

我不想將schema.rb添加到.gitignore ,因為我希望能夠從該文件加載新的數據庫模式。 但是,保持簽入是導致各種虛假沖突,可以通過新的db:migrate:reset輕松解決。

基本上我想要一種方法:

  1. 將schema.rb保留在存儲庫中以進行部署時數據庫設置
  2. 將schema.rb保留在'.gitignore'中以進行常規開發

將有一兩個人負責更新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遷移,並且可能會在幾年前破壞遷移的風險。 你可以這樣做:

  1. 使用rake db:migrate運行所有未完成的rake db:migrate
  2. 獲取ActiveRecord::Schema.define塊中schema.rb的內容
  3. 將其粘貼到def up initial_schema遷移中(覆蓋已存在的內容)
  4. 刪除所有其他遷移

現在,您的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:migraterake db:schema:dump就像正常一樣。

在pre-commit git hook中執行rake db:dump是否足夠?

以下不一定會修復(1)或(2),但它可能會解決合並問題,然后可能(1)和(2)消失。

而不是使用.gitignore ,使用單獨的分支: Develop省略schema.rbTest 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中,分支是指向文件內容集合的指針,因此它們可以包含或排除特定文件以及跟蹤文件版本。 這使它們成為構建特定工作流程的靈活工具。

  1. 提交schema.rb文件。
  2. 運行git pull(或繼續你正在做的事情)

每次遷移數據庫時, schema.rb文件都會更新並顯示為git status 在處理某些事情並偶爾進行git pull ,這可能很煩人,因為你必須提交schema.rb文件才能解決沖突。 這意味着每次遷移數據庫時,都需要提交schema.rb文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM