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

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

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

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

编辑:

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

肯定有更好的办法。

更新:

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

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

sqlite是git友好的吗?

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

Edit2:

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


当前回答

我开始想一个非常简单的解决方案,不知道为什么我以前没有想到!!

复制数据库(包括模式和数据)。 在new-major-changes的分支中,只需更改项目配置以使用新的重复数据库。

这样我就可以切换分支,而不用担心数据库模式更改。

编辑:

复制,我的意思是用不同的名称创建另一个数据库(如my_db_2);不是去倾倒之类的东西。

其他回答

我开始想一个非常简单的解决方案,不知道为什么我以前没有想到!!

复制数据库(包括模式和数据)。 在new-major-changes的分支中,只需更改项目配置以使用新的重复数据库。

这样我就可以切换分支,而不用担心数据库模式更改。

编辑:

复制,我的意思是用不同的名称创建另一个数据库(如my_db_2);不是去倾倒之类的东西。

在git版本控制下存储每个级别的数据库更改就像每次提交时推送整个数据库,每次拉取时恢复整个数据库。 如果您的数据库很容易发生重大更改,并且您无法承担丢失它们的代价,那么您可以更新pre_commit和post_merge钩子。 我对我的一个项目也做了同样的事情,你可以在这里找到方向。

没有原子性就无法做到这一点,如果不使用pg_dump或快照文件系统,就无法获得原子性。

我的postgres实例在zfs上,我偶尔会对它进行快照。它几乎是即时和一致的。

我已经发布了一个sqlite工具,它可以满足您的要求。它使用一个自定义的差异驱动程序,利用sqlite项目工具'sqldiff', uuid作为主键,并去掉sqlite rowid。它仍然处于alpha阶段,所以反馈是非常感谢的。

Postgres和mysql比较棘手,因为二进制数据保存在多个文件中,即使您能够对其进行快照,也可能无效。

https://github.com/cannadayr/git-sqlite

我在我的个人项目中做的是,我把我的整个数据库存储到dropbox,然后点MAMP, WAMP工作流,从那里使用它。这样,数据库总是最新的,无论我需要做一些开发。但这只是针对开发!现场是使用自己的服务器,当然!:)