Если кто-то действительно хочет отслеживать бинарные файлы базы данных в git, есть некоторые проблемы. Поскольку базы данных sqlite могут отличаться без данных, хранящихся в них, с изменением вывода git status
не очень полезно определить, следует ли фиксировать, а git diff
показывает только что-то вроде Binary files a/foo.sql and b/foo.sql differ
. Чтобы получить правильный вывод из git diff
, есть два основных подхода к сравнению соответствующих файлов:
- Используйте
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, но может облегчить рабочий процесс, который, тем не менее, работает.
person
stefanct
schedule
02.02.2020