首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于比较sqlite表的Git钩子

用于比较sqlite表的Git钩子
EN

Stack Overflow用户
提问于 2012-11-07 22:22:05
回答 3查看 2.5K关注 0票数 8

我在Git存储库中有一个Sqlite数据库。今天我想在两个不同的提交中做一个不同的视图。我是这样做的:

代码语言:javascript
运行
复制
$ 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

它可以工作,如果我想的话我可以编写脚本。但是有没有什么“好”的钩子方法呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-08 00:18:28

您可以使用HEADHEAD^来访问以前和当前的修订版本;有关示例,请参阅git post-commit hook - script on committed files

使用git show将文件提取到临时目录,而不覆盖工作副本。

除非绝对必要,否则我不会在git中存储二进制文件。如果使用sqlite3 file.sqlite .dump创建SQL命令的文本文件并将其放入git中,则可以避免许多麻烦,只将二进制数据库作为生成的文件。(但是,您必须在必要时重新生成SQL文件。)

票数 4
EN

Stack Overflow用户

发布于 2014-02-15 04:42:57

Here介绍了如何使用git的textconv特性来显示不同版本的sqlite文件之间的差异。它只是执行转储,因此对于大型数据库来说,它可能不是非常有效。不需要钩子。

该链接似乎不再可用,因此我使用存档版本代替。

它的要点是,在git属性文件(.gitattributes.git/info/attributes)中,添加一个模式匹配以强制sqlite3差异(假设数据库文件的扩展名为.sqlite3):

代码语言:javascript
运行
复制
*.sqlite3 diff=sqlite3

然后在git配置文件(~/.gitconfig.git/config)中:

代码语言:javascript
运行
复制
[diff "sqlite3"]
    binary = true
    textconv = "echo .dump | sqlite3"

如果您只想跟踪模式更改,请使用.schema而不是.dump

票数 26
EN

Stack Overflow用户

发布于 2020-02-02 22:57:31

如果有人真的想要跟踪git中的二进制数据库文件,那么有一些问题。由于sqlite数据库可能在没有存储在其中的数据的情况下有所不同,因此更改了git status的输出对确定是否应该提交没有什么帮助,而git diff只显示类似Binary files a/foo.sql and b/foo.sql differ的内容。为了从git diff获得正确的输出,基本上有两种方法来比较各自的文件:

  1. 使用textconv将文件转换为纯文本,如答案中所示,这是一个自定义比较应用程序,可以直接创建差异。

下面我将使用sqlite附带的sqldiff概述第二种方法。与textconv方法一样,需要更改属性和配置文件。

属性:

代码语言:javascript
运行
复制
*.sql* diff=sqldiff

配置:

代码语言:javascript
运行
复制
[diff "sqldiff"]
    command = gitsqldiff

上面的gitsqldiff字符串引用了一个包装器脚本,该脚本需要安排git给出的参数以供sqldiff使用。它必须是可执行的,并且可以通过PATH环境变量访问(将它放在~/bin中就可以了)。因为(到目前为止) sqldiff的退出值始终是0,因此我们必须检查它打印的内容来给用户反馈--特别是在数据库中没有任何东西根据sqldiff进行更改的情况下,它根本不会产生任何输出。为了做到这一点并向用户显示完整的输出,我们使用了一个trick,它通过tee将输出重定向到另一个文件描述符和stdout

gitsqldiff

代码语言:javascript
运行
复制
#!/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存储库中的一等公民,但可能会促进工作流程的正常运行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13271643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档