代码之家  ›  专栏  ›  技术社区  ›  Otto

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

  •  49
  • Otto  · 技术社区  · 15 年前

    我不想补充 schema.rb .gitignore ,因为我希望能够从该文件加载新的数据库架构。但是,保持它的签入状态会导致各种各样的虚假冲突,这些冲突很容易被新的 db:migrate:reset .

    基本上我想要一种方法:

    1. 在存储库中保留schema.rb以进行部署时数据库设置
    2. 将schema.rb保留在“.gitignore”中以进行常规开发

    会有一两个人负责更新 图RB 知道这是正确的。

    有没有办法让我也吃我的蛋糕?

    8 回复  |  直到 9 年前
        1
  •  2
  •   Tom Harris    11 年前

    对我来说真正有效的是删除和.gitignore schema.rb 然后让每个开发人员在 rake db:migrate .

    您仍然可以实现您想要的,而不必从0迁移,并且只需定期进行迁移的“汇总”,就可以冒着多年前迁移失败的风险。您可以通过以下方式完成此操作:

    1. 运行所有未完成的迁移 RAKDB:迁移
    2. 把你的内容 图RB ActiveRecord::Schema.define
    3. 将它粘贴到您的初始模式迁移中 def up (覆盖已经存在的内容)
    4. 删除所有其他迁移

    现在,您的初始_模式迁移是新系统的起点,您不必担心 图RB 这可能无法正确解决。这不是魔法,但很管用。

        2
  •  21
  •   Adam Alexander    15 年前

    恐怕你要找的魔法解决方案不存在。此文件通常在版本控制中管理,那么对于版本行上的任何冲突,只需选择两个日期中的较迟日期。只要您同时运行所有相关的迁移,就不会有任何东西以这种方式失去同步。如果两个开发人员对schema.rb的类似区域进行了修改,并且除了版本之外还出现了冲突,那么您将面临一个正常的合并冲突解决方案,但在我看来,这些通常很容易理解和解决。我希望这对一些人有帮助!

        3
  •  8
  •   Headshota    12 年前

    你可以做的另一件事是使用:

    git update-index --assume-unchanged /path/schema.rb
    

    这将把文件保存在存储库中,但不会跟踪更改。您可以通过以下方式随时切换跟踪:

    git update-index --no-assume-unchanged /path/schema.rb
    
        4
  •  1
  •   dbrown0708    15 年前

    在预提交Git钩子中执行rake db:dump是否足够?

    下面的内容不一定会修复(1)或(2),但它可能会处理合并问题,然后(1)和(2)可能会消失。

        5
  •  1
  •   Paul    15 年前

    而不是使用 .gitignore ,使用单独的分支: Develop 哪些省略 schema.rb Test Deploy 其中包括 图RB . 只在开发分支中进行代码更改,从不合并 试验 进入之内 发展 . 保持 图RB 在单独的分支中:

    Developer A             
        Develop      --------             
        Local Schema          \           Your Repo
        Test                    --------->    Dev A
                                --------->    Dev B
    Developer B               /               Master
        Develop      --------                 Schema
        Local Schema                          Test
        Test                                  Deploy
    

    在Git中,分支是指向文件内容集合的指针,因此它们可以包括或排除特定文件以及跟踪文件版本。这使得它们成为构建特定工作流的灵活工具。

        6
  •  1
  •   andrea    11 年前

    您可以定义合并策略。 我找到了这个解决方案,但不记得来源

    [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"
    
        7
  •  1
  •   jakeonrails    10 年前

    我做了一块宝石来解决这个问题。

    它对列、索引名和外键进行排序,删除多余的空白,并运行rubocop进行某些格式设置,以统一schema.rb文件的输出。

    https://github.com/jakeonrails/fix-db-schema-conflicts

    把它添加到gemfile之后,你就可以运行了 rake db:migrate rake db:schema:dump 像正常。

        8
  •  0
  •   Chemist    9 年前
    1. 提交 schema.rb 文件。
    2. 运行git pull(或继续执行您正在执行的操作)

    每次迁移数据库时, 图RB 文件更新并显示在 git status . 在做某件事和偶尔做某件事时 git pull 因为你必须承诺 图RB 在拖动前归档以解决冲突。这意味着每次迁移数据库时,都需要提交 图RB 文件。