【问题标题】:Getting a diff to properly recognize code blocks that contain similar content获取差异以正确识别包含相似内容的代码块
【发布时间】:2017-10-02 21:09:25
【问题描述】:

我正在比较包含具有相似内容的代码块的文件。问题是这可能会导致差异混淆。我将从一个例子开始,因为这很难用语言来解释。

file1.txt:

text
(
    contents
)
block "block1"
(
    contents
)
block "block2"
(
    contents
)

file2.txt:

block "block1"
(
    contents
)
text
(
    contents
)
block "block2"
(
    contents
)

当我比较这两个文件时,我得到以下输出:

-text
+block "block1"
 (
     contents
 )
-block "block1"
+text
 (
     contents
 )
 block "block2"
 (
     contents
 )

问题是,diff 程序无法识别“块”类型的代码块完全独立于“文本”类型的代码块,应将其视为单独的实体。 (在这种情况下是 Perl 的 Text::Diff,但我也有 git-diff 可用,它做同样的事情。)

如何让 diff 将这些不同类型的代码块识别为单独的实体,以便这两个文件的 diff 会产生以下结果?

-text
-(
-    contents
-)
 block "block1"
 (
     contents
 )
+text
+(
+    contents
+)
 block "block2"
 (
     contents
 )

请注意,与我实际尝试比较的代码相比,这是一个大大简化的示例,我知道很容易弄清楚这个示例在做什么,但是当您处理数百个类似元素时,差异输出变得完全不可读。

我希望 diff 意识到在此修改中只编辑了一个“文本”代码块,而没有触及任何“块”代码块。

【问题讨论】:

    标签: perl text diff git-diff


    【解决方案1】:

    如果你可以直接使用 git,试试git diff --patience

    $ git diff --patience
    diff --git a/foo1.txt b/foo1.txt
    index b474449..30a91bb 100644
    --- a/foo1.txt
    +++ b/foo1.txt
    @@ -1,11 +1,11 @@
    -text
    -(
    -    contents
    -)
     block "block1"
     (
         contents
     )
    +text
    +(
    +    contents
    +)
     block "block2"
     (
         contents
    

    【讨论】:

    • 我可以使用 git diff,但它似乎需要将文本存储在文件中。有没有办法对两个字符串执行 git diff 而不将它们写入文件?
    • 我建议这样做是因为您提到“我也有 git-diff 可用”。您可以使用临时文件,具体取决于您需要的性能。您可以将 ramdisk 视为加快磁盘访问速度的一种方法。
    • 我想我可以只使用临时文件,但它确实需要更多的时间,并且让我的代码看起来相当笨拙。
    • 你用ramdisk试过了吗?我很想知道那会慢多少。当然要编写更多代码,但使用File::TempGit::Sub 的组合应该不会那么糟糕。
    • 不幸的是,我不能轻易地尝试使用像 ramdisk 这样的外部程序,因为在我工作的地方,他们有非常严格的安全策略,我必须通过安全审查过程来请求像 ramdisk 这样的软件目前没有在公司内部使用:(
    【解决方案2】:

    处理此问题的最佳方法是在KDiff3 中使用manual diff alignments。重用一些示例图像,但与示例文件的结果相同:

    【讨论】:

    • 好答案,但我试图从命令行作为脚本的一部分执行此操作,因此手动对齐不是我的选择:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 2021-08-16
    相关资源
    最近更新 更多