我正在做一个web应用程序,我需要为一些主要的更改做一个分支,事情是,这些更改需要更改数据库模式,所以我想把整个数据库放在git下。

我怎么做呢?是否有一个特定的文件夹,我可以保存在git存储库下?我怎么知道是哪个?我如何确定我放入了正确的文件夹?

我需要确定,因为这些更改是不向后兼容的;我可不能搞砸。

在我的例子中,数据库是PostgreSQL

编辑:

有人建议进行备份并将备份文件置于版本控制之下,而不是将数据库置于版本控制之下。说实话,我觉得这真的很难接受。

肯定有更好的办法。

更新:

好吧,没有更好的方法了,但我还是不太相信,所以我要稍微改变一下问题:

我想将整个数据库置于版本控制之下,我可以使用什么数据库引擎来将实际数据库置于版本控制之下,而不是转储?

sqlite是git友好的吗?

因为这只是开发环境,所以我可以选择任何我想要的数据库。

Edit2:

我真正想要的不是跟踪我的开发历史,而是能够从我的“新的根本性变化”分支切换到“当前稳定的分支”,并且能够用当前稳定的分支修复一些错误/问题等。这样,当我切换分支时,数据库就会自动地与我当前所在的分支兼容。 我不太关心实际数据。


当前回答

看一下RedGate SQL源代码控制。

http://www.red-gate.com/products/sql-development/sql-source-control/

这个工具是一个SQL Server Management Studio管理单元,它允许你用Git把你的数据库放在源代码控制下。

每个用户495美元的价格有点贵,但有28天的免费试用。

请注意 我和“红门”没有任何关系。

其他回答

采用一个数据库转储,并对其进行版本控制。这样它就是一个平面文本文件。

我个人建议同时保留一个数据转储和一个模式转储。通过使用diff,可以相当容易地看到从一个修订到另一个修订的模式中发生了哪些变化。

如果您正在进行大的更改,那么您应该有一个用于进行新模式更改的辅助数据库,而不会触及旧数据库,因为正如您所说的,您正在进行一个分支。

使用像LiquiBase这样的工具,可以让你保持对LiquiBase文件的修订控制。您可以仅为生产标记更改,并让lb为生产或开发(或任何您想要的方案)使您的DB保持最新。

我说不要。数据在任何时候都可能改变。相反,您应该只提交代码、模式和表定义(创建数据库和创建表语句)中的数据模型以及单元测试的示例数据。这就是Laravel的工作方式,提交数据库迁移和种子。

这个问题基本上已经回答了,但我想用一个小建议来补充X-Istence和Dana the Sane的回答。

如果您需要具有一定粒度的修订控制,比如每天,那么您可以使用rdiff-backup之类的工具将表和模式的文本转储与增量备份结合起来。这样做的好处是,不存储每日备份的快照,而只存储与前一天的差异。

这样你就有了修订控制的优势,也不会浪费太多的空间。

在任何情况下,直接在频繁更改的大平面文件上使用git都不是一个好的解决方案。如果数据库变得太大,git在管理文件时会出现一些问题。

我就是这么做的:

因为你可以自由选择DB类型,使用一个基于文件的DB,如火鸟。

创建一个模板DB,它具有适合您实际分支的模式,并将其存储在存储库中。

当以编程方式执行应用程序时,创建模板DB的副本,将其存储在其他地方并使用该副本。

通过这种方式,您可以在没有数据的情况下将DB模式置于版本控制之下。如果你改变模式,你只需要改变模板DB