万一真的想在 git 中跟踪二进制数据库文件,就会出现一些问题。由于 sqlite 数据库可能会有所不同,而其中存储的数据没有更改,因此git status
对于确定是否应该提交并git diff
只显示类似Binary files a/foo.sql and b/foo.sql differ
. 要从中获得正确的输出,git diff
基本上有两种方法来比较各个文件:
- 用于将文件转换为纯文本,如Biran Minton
textconv
的答案所示。
- 设置一个能够直接创建差异的自定义差异应用程序。
我将概述下面使用sqldiff
sqlite 附带的第二种方法。与textconv
方法一样,需要更改属性和配置文件。
属性:
*.sql* diff=sqldiff
配置:
[diff "sqldiff"]
command = gitsqldiff
上面的gitsqldiff
字符串是指一个包装脚本,它需要安排 git 给定的参数以供sqldiff
. 它必须是可执行的并且可以通过PATH
环境变量访问(放入它~/bin
应该没问题)。因为(截至目前)的退出值sqldiff
始终为 0,因此相当无用,我们必须检查它打印的内容以向用户提供反馈 - 特别是在数据库中没有任何更改的情况下,根据sqldiff
它根本不会产生任何输出。为此并向用户显示完整的输出,我们使用了一种技巧,将输出重定向到附加的文件描述符并stdout
通过tee
.
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 存储库中的一等公民,但可能会促进仍然有效的工作流程。