在Git中处理数据库的正确方法是什么?

时间:2013-07-24 10:05:38

标签: database git sqlite heroku version-control

我正在Heroku上托管一个网站,并使用SQLite数据库。

问题是我希望能够从存储库中提取数据库(主要用于备份),但每当我提交时都会这样做。将更改推送到存储库,永远不应更改数据库。这是因为我本地计算机上的数据库中可能包含完全不同(且不相关)的数据;这是一个测试数据库。

最好的方法是什么?我已经尝试将我的数据库添加到.gitignore文件中,但这会导致数据库完全无法解析,无法在需要时将其拉出来。

3 个答案:

答案 0 :(得分:1)

虽然git(就像大多数其他版本控制系统一样)支持跟踪数据库之类的二进制文件,但它最适合文本文件。换句话说,你永远不应该使用版本控制系统来跟踪不断变化的二进制数据库文件(除非它们被创建一次,几乎从不改变)。

在git中仍然跟踪数据库的一种流行方法是跟踪文本数据库转储。例如,可以使用sqlite3实用程序(子命令.dump)将SQLite数据库转储到* .sql文件中。但是,即使使用转储,也只适用于跟踪不经常更改的模板数据库,并使用脚本作为标准部署的一部分从这些转储创建二进制数据库。

答案 1 :(得分:0)

您可以向本地存储库添加pre-commit挂钩,这将取消您不想推送的任何文件。

e.g。将以下内容添加到.git/hooks/pre-commit

git reset ./file/to/database.db

在处理您的代码时(可能会修改您的数据库),您最终将会结束:

$ git status --porcelain
 M file/to/database.db
 M src/foo.cc
$ git add .
$ git commit -m "fixing BUG in foo.cc"
M  file/to/database.db
.
[master 12345] fixing BUG in foo.cc
 1 file changed, 1 deletion(-)
$ git status --porcelain
 M file/to/database.db

因此您永远不会意外地提交对database.db

所做的更改

答案 2 :(得分:0)

您对数据库的架构是否感兴趣?但是确保你没有对其中的数据进行版本化?

我会从git中排除您的数据库(使用.gitignore file)。

如果您正在使用ORM和迁移(例如Active Record),那么您的架构已经在您的代码中被跟踪并且可以重新创建。

但是,如果您不是,那么您可能需要获取数据库的副本,然后保存创建语句并对其进行版本化。

Heroku不建议在生产中使用SQLite,而是使用他们的Postgres系统。这使您可以向远程数据库执行许多任务。

如果您想从Heroku提取实时数据库,Postgres备份的说明可能会有所帮助。