通过 git diff 理解 xfuncname

问题描述 投票:0回答:2

我想知道

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,我不确定我想要做的事情是否可以通过这种方法实现。有没有办法指定一个自定义程序/脚本来接收差异作为输入,以便我可以自己指定一个大块标头?

regex git git-diff re2
2个回答
0
投票

是的,您可以覆盖内部差异生成器。请参阅

https://git-scm.com/docs/diff-config
diff.external 部分。


0
投票

您面临着一些限制。

  • Diff 是面向行的。
  • 正则表达式的功能不足以全面处理 XML。

Git 确实提供了可能的方法来处理你的情况。

选择 textconv 与外部 diff

如果你想表现出差异 在存储库中的二进制或特殊格式的 blob 之间,您 可以选择使用外部 diff 命令,或使用 textconv 将它们转换为可比较的文本格式。您选择哪种方法 取决于您的具体情况。

使用外部 diff 命令的优点是灵活性。你 不一定要找到面向行的更改,也没有必要 输出类似于统一差异。您可以自由查找并报告 以最适合您的数据格式的方式进行更改。

相比之下,textconv 的限制要大得多。您提供一个 将数据转换为面向行的文本格式,以及 Git 使用其常规差异工具来生成输出。有几个 选择这种方法的优点:

  1. 易于使用。将二进制写入文本通常要简单得多 转换而不是执行您自己的差异。在很多情况下, 现有程序可以用作文本转换过滤器(例如exif
    odt2txt
    )。
  2. Git diff 功能。 仅执行转换步骤 您自己,仍然可以利用 Git 的许多 diff 功能,包括 着色、单词差异和合并的组合差异。
  3. 缓存。 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
因此创建一个包装器可能是必要的。

文本转换

您可以将您关心的 XML 文件片段转换为面向行的格式。假设您的代码位于

layer31only

 中,那么您的驱动程序定义将变为

[diff "layerdiff"] textconv = layer31only cachetextconv = true
使用与上述类似的 

git config

 调用通过命令行添加它们。当转换成本高昂时,
cachetextconv
 非常有用。

使用中

对于任一方法,请修改

.gitattributes

 以应用您的 diff 驱动程序。

为了简单起见,假设您想在存储库中的所有 XML 文件上使用它。

*.xml diff=layerdiff
    
© www.soinside.com 2019 - 2024. All rights reserved.