【问题标题】:Context-aware merge?上下文感知合并?
【发布时间】:2011-02-21 15:32:36
【问题描述】:

是否有任何用于编程语言的 diff/merge 工具,它以语法感知方式工作(如 XML Diff Tool),不仅仅是逐行比较(并且可以选择忽略空格)。

我对一个实际上遵循语言语法和分隔符的程序感兴趣,它可以在不破坏语法正确性的情况下提出更改建议,或者将分隔多行的语句捆绑在一起。示例行为是:

*在找到一个引入额外嵌套级别的if(){ 时,会自动将右括号} 与其下方几行捆绑在一起。)

*将匹配的语法元素保持在一起,避免像删除块容易创建的愚蠢:

 int function_A()
 { 
     int ret;
     ret = something;
     ret += something_else;

罢工>

      return ret;
  }

  int function_B()
  { 
     if(valid)
     {
         int ret;
         ret = something;
         ret += something_else;

          return ret;
      }

罢工>

       else return -1;
  }

就个人而言,我很想找到能够处理 C++ 语法的软件,但了解其他语言的解决方案也会很有趣。

【问题讨论】:

    标签: merge diff cvs semantic-analysis


    【解决方案1】:

    Semantic Merge.
    支持的语言,来自网站:

    我们从 C# 和 Vb.net 开始,然后添加了 Java。现在已经支持 C,然后我们将专注于 C++、Objective-C 和 JavaScript,具体取决于您的 反馈

    【讨论】:

      【解决方案2】:

      虽然KDiff3 不比较语法上下文中的语法元素,但它确实比“整行更改”具有更高的粒度,并且它会准确突出显示一行中发生更改的部分。

      根据我的经验,它有一个非常好的算法来检测变化。鉴于上面的示例,它正确地比较了 function_A 和 function_B 开箱即用:

      即使如此,如果算法无法匹配您想要的,例如如下:

      您始终可以通过将同步标记放置在您希望它执行比较的位置来手动覆盖。

      备选方案 1:

      备选方案 2:

      【讨论】:

        【解决方案3】:

        听起来您会对 Bram Cohen(BitTorrent 创建者)的 Patience Diff 算法(用于集市版本控制系统)感兴趣。

        The diff problem has been solved,尤其是Patience Diff Advantages

        摘自第二个链接:

        耐心差异的另一个优点是它经常不匹配那些简单不应该匹配的行。例如,如果您完全重写了一段代码,则它不应该匹配每个版本中的空白行,正如example 所示。最后,还有这个例子:

         void func1() {
             x += 1
         }
        
        +void functhreehalves() {
        +    x += 1.5
        +}
        +
         void func2() {
             x += 2
         }
        

        这很简单明了,但通常 diff 算法会这样解释:

         void func1() {
             x += 1
        +}
        +
        +void functhreehalves() {
        +    x += 1.5
         }
        
         void func2() {
             x += 2
         }
        

        【讨论】:

          【解决方案4】:

          Beyond Compare 可以满足您的要求。它不会一次保持句法正确性或比较语言块,但它可以执行以下操作:

          • 对语言语法有一定的了解,因此它可以对比较文件进行语法高亮显示,还可以识别并选择性地忽略不重要的差异(如 cmets,包括多行 cmets)。
          • 支持使用外部转换程序加载和保存数据。开箱即用,它支持在比较之前使用它来美化 XML 和 HTML。在比较两个 C 文件之前,您可以设置 GNU Indent 以标准化语法。
          • 可选的线宽,让您为匹配赋予更高的权重,例如闭合大括号。我没试过这个功能。
          • 替换,在单个会话中忽略左侧old_variable_name 被右侧new_variable_name 替换的所有位置。

          它是迄今为止我用过的最好的 diff-and-merge 工具。它也是跨平台的,价格便宜(标准版 30 美元,专业版 50 美元),并且评估期非常宽松,因此值得一试。

          【讨论】:

          • 谢谢。虽然其他人提出了一些有趣的解决方案,但只建议了一个合并工具(它提供了更多的灵活性来告诉它我想要什么,但它本身并没有更多的“智能”,其他答案是严格的差异工具 - 我是比起差异工具,更需要合并工具。看来你的建议是最实用的。
          • @SF.:Beyond Compare 还可以让您告诉它您想要什么(在“编辑”菜单下,使用“对齐”和“隔离”选项),尽管我从未使用过这些功能。 (我不知道它可以做到这一点,直到我看到 hlovdal 关于 KDiff3 的回答并查看 Beyond Compare 是否可以做到这一点。)
          • 我已经使用 Araxis Merge 多年了。我使用中心的链接来清理困难的比较并使适当的项目对齐。我使用 BC2 和 BC3 作为企业标准,我发现 Araxis Merge 是一个出色的工具(尽管 BC3 是一项重大改进)。
          【解决方案5】:

          查看我们的SmartDifferencer 工具。

          SmartDifferencers 是特定于语言的,由生产质量语言解析器驱动、构建 AST 并比较树。这使得它们完全独立于文本布局和干预 cmets;值得注意的是,如果由文字表示的实际值没有不同,它们不受文字文本的更改(基数、移动小数点+更改指数、不同的转义序列)的影响。结果以语言语法术语和合理的编辑操作(移动、复制、插入、删除、rename-identifier-within-block)报告。

          有 C#、Java、C++、Python 和各种其他语言的版本。网站上都有这些示例。

          存在用于 C 的 SmartDifferencer,但在没有完整编译器命令行的情况下解析 C 文件有时会出现问题,因此有时它会失败,您必须回退到更原始的比较工具,例如 diff。我们正在努力改善这种情况。

          【讨论】:

          • 一些截图和几个例子不会有什么坏处。
          • 它不是一个合并工具。它是一个差异工具。
          • 企业软件 :( 看到一个巨大的注册表阻止下载总是很伤心。在我跳过那个箍之前我必须非常绝望。
          • @boxed:巨大?它可能有 5 个字段需要填写。我总是对人们做出的权衡感到惊讶,现在几个框与每天节省一些时间的潜力。
          • 试过了。没有忽略简单的更改,例如在一行中添加大括号。
          【解决方案6】:

          请看Compare++

          它可以对 C/C++、Java、C#、Javascript、CSS 等进行语言感知的结构化比较 并且可以选择忽略注释、纯格式、空白和大小写更改,并具有对齐移动部分的独特能力,例如 C++ 函数、Java 命名空间、C# 方法、CSS 选择器……

          【讨论】:

          • Compare++ 还优化了用户界面。
          【解决方案7】:

          如果您使用 Eclipse,则集成的比较编辑器提供语法感知差异/合并,至少对于 Java。勾选“General/Compare/Patch”首选项下的“Open Structure Compare automatically”,然后在比较编辑器中选择“Java Structure Compare”。

          【讨论】:

          • OTOH 对于其他语言来说真的很糟糕。我看到它从左侧删除了 1000 行,并在相隔 1000 行的两个空白差异处重新插入了相同的 1000 行作为“新”行。
          【解决方案8】:

          查看https://en.wikipedia.org/wiki/Comparison_of_file_comparison_tools,尤其是列结构化比较。

          目前只有两种工具能够理解语言结构。

          • 比较++(适用于 C++)
          • Pretty Diff(多种基于 Web 的语言的语言感知代码比较工具。它还可以美化、缩小和其他一些功能。)

          很遗憾,许多工具的此列仍然为空。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-04-12
            • 2018-12-22
            • 2010-12-21
            • 2016-03-13
            • 1970-01-01
            • 2016-06-16
            • 1970-01-01
            • 2013-12-01
            相关资源
            最近更新 更多