我想知道
git diff
如何准确地将提供给 xfuncname 的表达式应用于结果,以及是否可以将对 hunk 标题文本的搜索委托给另一个程序。
上下文:我想更改
git diff
的 xfuncname 设置以显示 xml 文件的可用输出。示例 xml 如下所示:
<layer1-1>
</layer1-1>
<layer1-2>
<layer2-1>
</layer2-1>
<layer2-2>
</layer2-2>
<layer2-3>
<layer3-1>
[...]
changes
[...]
</layer3-1>
<layer3-2>
</layer3-2>
<layer3-2>
</layer3-2>
</layer2-3>
</layer1-2>
<layer1-3>
</layer1-3>
理想情况下,修改后的 hunk 标头的输出将如下所示
@@ -15 +15 @@ <layer1-2><layer2-3><layer3-1>
[...]
-notchanged
+changed
[...]
我的观察表明,
git diff
将正则表达式应用于文件中之前差异的部分,获取最后一个匹配,并从中获取第一个捕获组;它使用 m
标志。这样的描述合适吗?
由于 RE2 显然既不支持 backreferences 也不支持 lookaheads,我不确定我想要做的事情是否可以通过这种方法实现。有没有办法指定一个自定义程序/脚本来接收差异作为输入,以便我可以自己指定一个大块标头?
您面临着一些限制。
Git 确实提供了可能的方法来处理你的情况。
外部差异选择 textconv 与外部 diff
如果你想表现出差异 在存储库中的二进制或特殊格式的 blob 之间,您 可以选择使用外部 diff 命令,或使用 textconv 将它们转换为可比较的文本格式。您选择哪种方法 取决于您的具体情况。
使用外部 diff 命令的优点是灵活性。你 不一定要找到面向行的更改,也没有必要 输出类似于统一差异。您可以自由查找并报告 以最适合您的数据格式的方式进行更改。
相比之下,textconv 的限制要大得多。您提供一个 将数据转换为面向行的文本格式,以及 Git 使用其常规差异工具来生成输出。有几个 选择这种方法的优点:
- 易于使用。将二进制写入文本通常要简单得多 转换而不是执行您自己的差异。在很多情况下, 现有程序可以用作文本转换过滤器(例如,
exif
,odt2txt
)。- Git diff 功能。 仅执行转换步骤 您自己,仍然可以利用 Git 的许多 diff 功能,包括 着色、单词差异和合并的组合差异。
- 缓存。 Textconv 缓存可以加速重复的差异,例如那些 您可以通过运行
git log -p
来触发。
regex让我怀疑你是否有想要使用的工具。假设有人开发了 layerdiff
并且你想使用它。在
$GIT_DIR/config
(特定于项目)或
$HOME/.gitconfig
(全局)中,添加
[diff "layerdiff"]
command = layerdiff
您可以使用以下任一种方式从命令行添加此内容
git config diff.layerdiff.command layerdiff
或
git config --global diff.layerdiff.command layerdiff
请注意,该命令将被调用为
layerdiff old-file old-hex old-mode new-file new-hex new-mode
因此创建一个包装器可能是必要的。文本转换
layer31only
中,那么您的驱动程序定义将变为
[diff "layerdiff"]
textconv = layer31only
cachetextconv = true
使用与上述类似的 git config
调用通过命令行添加它们。当转换成本高昂时,
cachetextconv
非常有用。使用中
.gitattributes
以应用您的 diff 驱动程序。为了简单起见,假设您想在存储库中的所有 XML 文件上使用它。
*.xml diff=layerdiff