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

时间:2019-04-09 21:15:07

标签: git diff git-config

https://git.wiki.kernel.org/index.php/Textconvtextconv上的文档措词简洁:

  

~/.gitconfig必须指示要为textconv驱动程序执行的命令:

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

我找不到任何有关如何格式化命令的文档,该命令要求将文件名作为位置参数传递。例如,我想使用下面的pdf formatter命令,该命令要求将破折号作为最后一个参数写入stdout:

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

目前,我不得不编写自定义的单行shell脚本作为一种变通方法,但是它们开始积累起来,这有点烦人。

有没有这些脚本的方法吗? "$1"或xargs的'{}'约定似乎无效。

2 个答案:

答案 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}}

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