如何传递文件名参数 gitconfig diff textconv?

How to pass a filename argument gitconfig diff textconv?

https://git.wiki.kernel.org/index.php/Textconv 上关于 textconv 的文档措辞简洁:

~/.gitconfig must indicate the command to execute for the the textconv driver:

[diff "<driver_name>"]
    textconv=<command>

我找不到任何关于如何格式化需要将文件名作为位置参数传递的命令的文档。例如,我想使用以下 pdf 格式化程序命令,它需要一个破折号作为写入标准输出的最后一个参数:

[diff "pdf"]
    textconv = pdftotext -layout "" -

目前,我不得不编写自定义单行 shell-脚本作为解决方法,但它们开始累积,变得有点烦人。

有没有办法不用这些脚本? "" 或 xargs 的 '{}' 参数约定似乎不起作用。

不幸的是,该信息显然不可用。 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 参数;跟随link 上面的更多详细信息)。

在大多数或所有情况下,规范可能确实带有原始路径名(如果没有,请查看此函数下方的函数),只是没有复制到程序参数中。 textconv 过滤器代码可以,但没有,使用 Git 合并驱动程序使用的 % 扩展技术,如果它使用了(但没有)它可能有一个 % - 转义,传递原始文件名。但当然不是。

(您可以制作自己的 Git 副本并对其进行处理,或许可以尝试说服 Git 的人将您的更改作为对 public 的贡献 Git...)

作为 gitconfig 缺少参数替换功能的解决方法,您可以将命令包装到 shell 调用中,如

[diff "pdf"]
    textconv = sh -c 'pdftotext -layout -enc UTF-8 "[=10=]" -'

(在此处找到:https://gist.github.com/t-yuki/9348e5d4aa4a75a6acf9