Почему git diff --textconv использует путь дважды? - PullRequest
0 голосов
/ 03 июня 2019

Так что я пытаюсь заставить работать git diff для sqlite.В основном я хочу, чтобы git сравнивал файлы, как если бы они были текстовыми файлами.В моем хранилище у меня есть файл .gitattributes, содержащий это:

*.db diff=sqlite3

И затем в моем файле .git/config я добавил следующее:

[diff "sqlite3"]
    textconv = sqlite3 "$1" .dump

Но это не работает,Я получаю сообщение об ошибке:

Error: near "/": syntax error
fatal: unable to read files to diff

Так что я попытался изменить конфигурацию, чтобы просто повторить то, что он получает в качестве ввода:

[diff "sqlite3"]
    textconv = echo "$1"

И тогда я вижу, как работает git diff, ноэто выводит это:

-/var/folders/mn/_1zkhxm93dq787rf0n1p_vyr0000gn/T//blFdBa_database.db /var/folders/mn/_1zkhxm93dq787rf0n1p_vyr0000gn/T//blFdBa_database.db
+path/to/the/database/database.db path/to/the/database/database.db

Это путь дважды, но я не могу найти какую-либо информацию о том, почему это так и как я могу это исправить (без использования регулярных выражений для разделения его на пробелы).

Я на MacOS 10.14.3 и git --version дает git version 2.20.1 (Apple Git-117)

1 Ответ

1 голос
/ 03 июня 2019

Вы можете просто механически заменить:

textconv = sqlite3 "$1" .dump

с:

textconv = "f(){ sqlite3 \"$1\" .dump; }; f"

Почему

Документация gitattributes говорит об этом textconv:

Программа должна принять один аргумент - имя файла для преобразования и выдать полученный текст на стандартный вывод.

, а затем приводит это в качестве примера:

    [diff "jpg"]
            textconv = exif

Добавляя $1, вы запускаете команду Git с первым аргументом, а затем с аргументами. Аргументы состоят из одного аргумента, поэтому вы видите один аргумент дважды. Если бы аргументы состояли из двух строк, вы бы видели, как первая повторялась, а затем - вторая.

(Это поведение аналогично псевдонимам Git.)

Если вам нужно запустить sqlite3 с двумя аргументами, как в sqlite3 <em>name-of-file</em> .dump, вы должны изобрести промежуточную команду, которая принимает один аргумент, как в <em>command name-of-file</em>. Затем эта промежуточная команда может просто добавить последний аргумент.

Как и для псевдонимов, вы можете сделать это с помощью функции оболочки:

[diff "odd"]
    textconv = "f(){ echo $1 extra; }; f"

$ git diff
diff --git a/.gitattributes b/.gitattributes
index 9fa72ad450..bf2ef674cb 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,6 +1,6 @@
 * whitespace=!indent,trail,space
 *.[ch] whitespace=indent,trail,space diff=cpp
-*.sh whitespace=indent,trail,space eol=lf
+*.sh whitespace=indent,trail,space eol=lf diff=odd
 *.perl eol=lf diff=perl
 *.pl eof=lf diff=perl
 *.pm eol=lf diff=perl
diff --git a/check-builtins.sh b/check-builtins.sh
index a0aaf3a347..089031a86e 100755
--- a/check-builtins.sh
+++ b/check-builtins.sh
@@ -1 +1 @@
-/tmp/fo3NBV_check-builtins.sh extra
+check-builtins.sh extra
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...