https://git.wiki.kernel.org/index.php/Textconv上textconv
上的文档措词简洁:
~/.gitconfig
必须指示要为textconv驱动程序执行的命令:[diff "<driver_name>"] textconv=<command>
我找不到任何有关如何格式化命令的文档,该命令要求将文件名作为位置参数传递。例如,我想使用下面的pdf formatter命令,该命令要求将破折号作为最后一个参数写入stdout:
[diff "pdf"]
textconv = pdftotext -layout "$1" -
目前,我不得不编写自定义的单行shell脚本作为一种变通方法,但是它们开始积累起来,这有点烦人。
有没有这些脚本的方法吗?
"$1"
或xargs的'{}'
约定似乎无效。
答案 0 :(得分:3)
不幸的是,这些信息只是简单地不可用。 Here是实际实现文本转换的代码:
temp = prepare_temp_file(r, spec->path, spec);
*arg++ = pgm;
*arg++ = temp->name;
*arg = NULL;
child.use_shell = 1;
child.argv = argv;
child.out = -1;
if (start_command(&child)) {
remove_tempfile();
return NULL;
}
这两个参数分别是程序本身的名称(通常为argv [0])和包含从其居住位置提取的位的临时文件的名称(基于spec
参数;请参见链接以获得更多详细信息。
在大多数或所有情况下,规范可能确实带有原始路径名(如果没有,请查看该函数正下方的函数),只是不会将其复制到程序参数中。 textconv过滤器代码可以但不采用Git合并驱动程序使用的%
扩展技术,并且如果这样做(但没有),则可以使用%
-escape传递了原始文件名。但是,当然不是。
(您可以克隆自己的Git并进行研究,也许可以说服Git的人们将您的更改作为对公共Git的贡献...)
答案 1 :(得分:2)
作为缺少参数替换功能的[diff "pdf"]
textconv = sh -c 'pdftotext -layout -enc UTF-8 "$0" -'
的一种解决方法,您可以将命令包装到shell调用中,如
{{1}}