Delphi 的 convert.exe 作为 git diff 驱动程序?

Delphi's convert.exe as a git diff driver?

我需要将一些 Delphi 文件 (*.dfm) 以二进制形式检查到 git 存储库中,但仍然希望能够以文本形式查看文件差异。我已经得到了 .gitconfig 和 .gitattributes 文件,这样我就可以 运行 一个任意的 bash 脚本或 exe 来做 diff.. .

但是,我不知道 git 是否希望它就地转换临时文件,是否希望在标准输出上查看文本,或者其他什么。 exe 相当简陋:

Delphi Form Conversion Utility Version 7.0
Copyright (c) 1995,2002 Borland Software Corporation
Usage: convert.exe [-i] [-s] [-t | -b] <filespec(s) | @filelist>
  -i  Convert files in-place (output overwrites input)
  -s  Recurse subdirectories
  -t  Convert to text
  -b  Convert to binary

如果省略 -i,则会在同一文件夹中创建另一个 .txt 文件。

我怎样才能利用它并获得理智的结果?

你没有提到你是在谈论使用 textconv 还是外部差异。

textconv 程序应充当文件过滤器:它必须读取通过单个参数命名的文件,并将文本写入标准输出。 Git 然后将 运行 程序两次,一次用于两个二进制输入中的每一个,并保存程序的输出——可能只是“刚刚”,或者可能持续一段不确定的时间——并将产生,作为 git diff 输出,textconv 程序的两个 运行 输出之间的差异。

为了允许 Git 缓存 textconv 结果(以加速未来的差异),添加 cachetextconv = truethe gitattributes documentation.

如果您谈论的是外部 diff 驱动程序,它们会使用 7 (!) 个参数调用(从技术上讲,最多 7).请参阅相同的文档,然后引用 the top level git command documentation 中的(简短)GIT_EXTERNAL_DIFF 描述。这七个参数包括两个临时文件的名称,其中包含要比较的文件内容。

[编辑]

在全局 git 配置文件中,您将添加如下内容:

[diff "dfm"]
        textconv = U:/dfmconverter.sh
        cachetextconv = true

在您的 git 属性文件中,如下所示:

*.dfm        diff=dfm

然后是脚本本身:

    #!/bin/bash

    conv() {
            x=`basename "" .dfm`
            y=`dirname ""`
            /c/Program\ Files\ \(x86\)/Borland/Delphi7/Bin/convert -t  1>>/dev/null
            cat $y/$x.txt
            rm $y/$x.txt
    }

    conv 

这些肯定需要stdout上的转换输出。 Borland 的 convert.exe 也用一些 credit/copyright 东西来发送垃圾邮件,并且懒得使用 --quiet 选项。也许可以把它留在里面,但我不确定它是否总是一样的。 dirname 在 Windows 上工作很奇怪,路径周围没有双引号,但你需要它,因为当前的更改可能已经到位,但比较版本被假脱机到 $LOCALAPPDATA,并且更容易从$1 中提供的路径并重新使用它。

所有这些在命令行上都存在差异,但如果有办法为 Tortoise 做到这一点Git,我还没有偶然发现它。