Git hook for diff sqlite table

我的梦境 提交于 2019-12-21 06:18:56

问题


I have a Sqlite db in a Git repository. Today I wanted to do a diff of a view in two different commits. I did it this way:

$ sqlite3 -list file.sqlite "SELECT * FROM contact_list_detailed" >/tmp/newlist
$ git checkout 51c24d13c file.sqlite
$ sqlite3 -list file.sqlite "SELECT * FROM contact_list_detailed" >/tmp/oldlist
$ git checkout -- file.sqlite
$ diff /tmp/oldlist /tmp/newlist

It works and I could script it if I want. But are there any "nice" ways of doing this with hooks?


回答1:


You would use HEAD and HEAD^ to access the previous and current revisions; see git post-commit hook - script on committed files for an example.

Use git show to extract files to a temporary directory without overwriting the working copy.


I wouldn't store binary files in git unless absolutely necessary. You can avoid many hassles if you create a text file of SQL commands with sqlite3 file.sqlite .dump and put that into git, having the binary database only as a generated file. (But then you have to care about regenerating the SQL file when necessary.)




回答2:


Here is how to use git's textconv feature for showing diffs between versions of the sqlite file. It just does a dump, so it may not be super efficient for large databases. No hook necessary.

That link seems to be no longer available, so I'm using the the archived version instead.

The gist of it is, in the git attributes file (.gitattributes, or .git/info/attributes), add a pattern match to force sqlite3 diffs (assuming your database files have the extension .sqlite3):

*.sqlite3 diff=sqlite3

Then in your git config file (~/.gitconfig or .git/config):

[diff "sqlite3"]
    binary = true
    textconv = "echo .dump | sqlite3"

If you just want to track schema changes, use .schema instead of .dump.



来源:https://stackoverflow.com/questions/13271643/git-hook-for-diff-sqlite-table

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!