上下文感知合并?

SF.*_*SF. 32 cvs diff merge semantic-analysis

是否存在用于编程语言的差异/合并工具,它以语法识别的方式工作(如XML Diff Tool),不仅仅是逐行比较(并且可选地忽略空格).

我对实际遵循语言语法和分隔符的程序感兴趣,建议在不破坏语法正确性的情况下进行更改,或者在多行中分隔语句.示例行为是:

*找到一个if(){引入额外嵌套级别的自动捆绑闭合支撑}下面的几行.)

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

 int function_A()
 { 
     int ret;
     ret = something;
     ret += something_else;
Run Code Online (Sandbox Code Playgroud)

      return ret;
  }

  int function_B()
  { 
     if(valid)
     {
         int ret;
         ret = something;
         ret += something_else;
Run Code Online (Sandbox Code Playgroud)

          return ret;
      }
Run Code Online (Sandbox Code Playgroud)

       else return -1;
  }
Run Code Online (Sandbox Code Playgroud)

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

Mys*_*ter 20

语义合并.
网站支持的语言:

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


hlo*_*dal 14

虽然KDiff3不比较语法上下文中的语法元素,但它确实具有比"整行更改"更高的粒度,并且它将突出显示更改的行中的哪些部分.

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

function_A和function_B的比较

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

新旧功能的比较_A

您可以通过将同步标记放在要执行比较的位置来手动覆盖.

备选方案1:

新旧function_A与sync1的比较

备选方案2:

新旧function_A与sync2的比较


typ*_*.pl 11

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

请参阅差异问题已解决,尤其是耐心差异优势:

摘自第二个链接:

耐心差异的另一个优点是它经常不匹配普通不应匹配的行.例如,如果您已完全重写了一段代码,则它不应与每个版本中的空行匹配,如此示例所示.最后,有这个例子:

 void func1() {
     x += 1
 }

+void functhreehalves() {
+    x += 1.5
+}
+
 void func2() {
     x += 2
 }
Run Code Online (Sandbox Code Playgroud)

这很简单明了,但是频繁的diff算法会像这样解释它:

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

 void func2() {
     x += 2
 }
Run Code Online (Sandbox Code Playgroud)


Jos*_*ley 9

Beyond Compare会做一些你要问的事情.它不能保持语法正确性或一次比较语言块,但它可以执行以下操作:

  • 对语言语法的一些理解,因此它可以对比较文件进行语法高亮,并且它还可以识别并可选地忽略不重要的差异(如注释,包括多行注释).
  • 支持使用外部转换程序加载和保存数据.开箱即用,它支持在比较之前使用它来美化XML和HTML.在比较两个C文件之前,您可以设置GNU Indent来标准化语法.
  • 可选的线宽使您可以为匹配提供更高的权重,例如,关闭支撑.我没试过这个功能.
  • 替换,忽略old_variable_name左边的每个地方的单个会话被替换new_variable_name为右边.

它是迄今为止我使用过的最好的差异合并工具.它也是跨平台,便宜(标准30美元,专业50美元),评估期非常慷慨,值得一试.

  • 谢谢.虽然其他人提出了一些有趣的解决方案,但只提出了一种合并工具(它提供了更多的灵活性来告诉它我想要什么,但本身没有更多的"智能",其他答案是严格的差异工具 - 我是比diff工具更需要合并工具.看起来你的建议是最实用的. (2认同)

Ira*_*ter 6

请参阅我们的SmartDifferencer工具.

SmartDifferencers是特定于语言的,由生产质量语言解析器驱动,构建AST并比较树.这使得他们完全独立于文本布局和干预评论; 值得注意的是,如果文字所代表的实际值没有不同,它们不受文字文本(基数,移动小数点+改变指数,不同转义序列)的变化的影响.结果以语言语法术语和合理的编辑操作(移动,复制,插入,删除,重命名标识符在块内)报告.

有C#,Java,C++,Python和各种其他语言的版本.网站上有各自的例子.

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

  • 企业软件:(总是很难看到一个巨大的注册表阻止了下载.在我跳过那个箍之前,我必须非常绝望. (2认同)

小智 6

请看比较++.

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