我在Git存储库中有一个Sqlite数据库。今天我想在两个不同的提交中做一个不同的视图。我是这样做的:
$ 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
它可以工作,如果我想的话我可以编写脚本。但是有没有什么“好”的钩子方法呢?
发布于 2012-11-08 00:18:28
您可以使用HEAD
和HEAD^
来访问以前和当前的修订版本;有关示例,请参阅git post-commit hook - script on committed files。
使用git show
将文件提取到临时目录,而不覆盖工作副本。
除非绝对必要,否则我不会在git
中存储二进制文件。如果使用sqlite3 file.sqlite .dump
创建SQL命令的文本文件并将其放入git中,则可以避免许多麻烦,只将二进制数据库作为生成的文件。(但是,您必须在必要时重新生成SQL文件。)
发布于 2014-02-15 04:42:57
Here介绍了如何使用git的textconv
特性来显示不同版本的sqlite文件之间的差异。它只是执行转储,因此对于大型数据库来说,它可能不是非常有效。不需要钩子。
该链接似乎不再可用,因此我使用存档版本代替。
它的要点是,在git属性文件(.gitattributes
或.git/info/attributes
)中,添加一个模式匹配以强制sqlite3差异(假设数据库文件的扩展名为.sqlite3
):
*.sqlite3 diff=sqlite3
然后在git配置文件(~/.gitconfig
或.git/config
)中:
[diff "sqlite3"]
binary = true
textconv = "echo .dump | sqlite3"
如果您只想跟踪模式更改,请使用.schema
而不是.dump
。
发布于 2020-02-02 22:57:31
如果有人真的想要跟踪git中的二进制数据库文件,那么有一些问题。由于sqlite数据库可能在没有存储在其中的数据的情况下有所不同,因此更改了git status
的输出对确定是否应该提交没有什么帮助,而git diff
只显示类似Binary files a/foo.sql and b/foo.sql differ
的内容。为了从git diff
获得正确的输出,基本上有两种方法来比较各自的文件:
textconv
将文件转换为纯文本,如答案中所示,这是一个自定义比较应用程序,可以直接创建差异。下面我将使用sqlite附带的sqldiff
概述第二种方法。与textconv
方法一样,需要更改属性和配置文件。
属性:
*.sql* diff=sqldiff
配置:
[diff "sqldiff"]
command = gitsqldiff
上面的gitsqldiff
字符串引用了一个包装器脚本,该脚本需要安排git给出的参数以供sqldiff
使用。它必须是可执行的,并且可以通过PATH
环境变量访问(将它放在~/bin
中就可以了)。因为(到目前为止) sqldiff
的退出值始终是0,因此我们必须检查它打印的内容来给用户反馈--特别是在数据库中没有任何东西根据sqldiff
进行更改的情况下,它根本不会产生任何输出。为了做到这一点并向用户显示完整的输出,我们使用了一个trick,它通过tee
将输出重定向到另一个文件描述符和stdout
。
gitsqldiff
#!/bin/sh
echo "$1:"
# Duplicate sqldiff's output for consumption by wc and stdout.
# This enables us to check for an empty output but still see
# sqldiffs messages if there are any.
sqldiff "$2" "$5" 2>&1 | {
tee /dev/fd/3 |
if [ $(wc -c) -eq 0 ]; then
echo " nothing changed according to sqldiff"
fi
} 3>&1
当然,这并不能使sql文件成为git存储库中的一等公民,但可能会促进工作流程的正常运行。
https://stackoverflow.com/questions/13271643
复制相似问题