2010-06-05 87 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转储中重新加载数据 - 这将会重新创建问题,它必须是仅数据转储/加载)。在最糟糕的情况下,您可以创建一个迁移来删除该列,另一个可以重新添加该列。

相关问题