51

我不想添加schema.rb.gitignore,因为我希望能够从该文件加载新的数据库模式。但是,保持它处于检查状态会导致各种虚假冲突,这些冲突很容易通过新的db:migrate:reset.

基本上我想要一种方法:

  1. 将 schema.rb 保存在存储库中以进行部署时数据库设置
  2. 将 schema.rb 保存在 '.gitignore' 中以进行一般开发

会有一两个人负责更新schema.rb并知道它是正确的。

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

4

8 回答 8

21

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

于 2009-04-10T17:24:36.080 回答
9

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

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

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

git update-index --no-assume-unchanged /path/schema.rb
于 2012-09-02T19:32:11.800 回答
2

对我来说真正有效的是删除和 .gitignore schema.rb,然后在每个开发人员 .gitignore 时为他们重新生成它rake db:migrate

您仍然可以实现您想要的,而无需从 0 迁移并冒着多年前迁移中断的风险,只需定期进行迁移的“汇总”即可。您可以通过以下方式做到这一点:

  1. 运行所有未完成的迁移rake db:migrate
  2. 把你的内容schema.rb放在ActiveRecord::Schema.define块中
  3. 将其粘贴到您的 initial_schema 迁移中def up(覆盖已经存在的内容)
  4. 删除所有其他迁移

现在,您的 initial_schema 迁移是新系统的起点,您不必担心schema.rb可能无法正确解决的冲突。这并不神奇,但它有效。

于 2013-07-29T18:29:47.533 回答
1

在预提交 git 挂钩中执行 rake db:dump 就足够了吗?

以下不一定会解决(1)或(2),但它可能会解决合并问题,然后(1)和(2)可能会消失。

于 2009-04-10T17:22:17.583 回答
1

而不是使用.gitignore,使用单独的分支:Develop哪些省略schema.rb 和哪些包括。仅在 Develop 分支中进行代码更改,从不合并到. 保存在单独的分支中:TestDeployschema.rbTestDevelopschema.rb

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

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

于 2009-04-10T17:38:28.980 回答
1

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

[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"
于 2013-09-26T13:59:31.677 回答
1

我构建了一个 gem 来解决这个问题。

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

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

将其添加到 Gemfile 后,您只需运行rake db:migraterake db:schema:dump正常运行即可。

于 2014-11-20T00:54:44.190 回答
0
  1. 提交schema.rb文件。
  2. 运行 git pull (或继续你正在做的事情)

每次迁移数据库时,schema.rb文件都会更新并出现在git status. 在处理某事并偶尔做某事git pull时,这可能很烦人,因为您必须在拉取文件之前提交schema.rb文件以解决冲突。这意味着每次迁移数据库时,都需要提交schema.rb文件。

于 2015-01-23T22:05:06.060 回答