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 = true
如 the 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,我还没有偶然发现它。
我需要将一些 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 = true
如 the 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,我还没有偶然发现它。