我正在寻找一种可以分析我的代码并告诉我哪些构造发生了变化的差异工具。
例如,如果我将一个方法从文件开头剪切并粘贴到末尾,但保持该方法不变,则不希望被标记。但是,如果我在该方法中插入一行代码或更改某些内容,则会被标记为已更改。
我使用过各种差异工具,但它们似乎都无法以任何逻辑方式告诉您哪些行已被插入、删除或更改。如果我定期重新排列代码文件的布局,那么差异工具能够跟上就好了。
有人有这样的工具吗?
我正在寻找一种可以分析我的代码并告诉我哪些构造发生了变化的差异工具。
例如,如果我将一个方法从文件开头剪切并粘贴到末尾,但保持该方法不变,则不希望被标记。但是,如果我在该方法中插入一行代码或更改某些内容,则会被标记为已更改。
我使用过各种差异工具,但它们似乎都无法以任何逻辑方式告诉您哪些行已被插入、删除或更改。如果我定期重新排列代码文件的布局,那么差异工具能够跟上就好了。
有人有这样的工具吗?
我使用 http://winmerge.org/。
我认为你无法做到你所要求的,因为这些工具的最长公共子序列算法的工作方式。
即使您的函数被重新排列,您的源文件的功能仍然保持不变,由于LCS的性质,它仍将显示为差异。
编辑:
这有点牵强,但如果你感觉特别有雄心壮志,你可以编写适合你自己需求的代码。
你可以使用正则表达式从源文件中提取每个方法,并根据其名称单独对每个方法进行LCS diff。 您可以将您的代码存储在一个字典(键,值)中,以便键是方法的名称,而值是函数的字符串。 然后,您只需将dictionary_orig ['method']与dictionary_new ['method']进行差异比较即可。
除此之外,我不知道如何实现您所寻找的内容。
请查看我们的Smart Differencer工具,它比较抽象语法树,并以AST所代表的非终结符(“语言构造”)和可能的编辑操作(插入、删除、移动)报告差异,以及发现一致的重命名。
目前,它仅处理Java和COBOL,但它基于DMS,该软件具有广泛的语言解析器,包括C#。
编辑9/8/2009:现在可供beta测试人员使用C# SmartDifferencer。
该工具已将整个文件中的一致重命名视为语义上微不足道的(假设其他文件相应引用了重命名的符号),以及作用域内的重命名。我们计划考虑语义上微不足道的变化,例如在Java和C#类中移动方法声明。
编辑2010年10月:生产版本已经发布。您可以在网站上访问评估下载。
编辑2012年5月:您可以在此页面上查看C#示例。
目前它没有忽略语义上的空编辑。一个特殊的例子是在类主体中移动方法;我们都知道这对于C#的语义没有影响。我们的工具比较语法(通过AST),而不是语义,因此它不理解这个特定的细微差别,将会告诉用户“已经被移动”,而不是保持沉默。我们计划在未来处理这类情况,但嘿,每个产品都必须有一个版本1 :-} [作为微妙的一点,Java类中的方法调换也是语义上空的,但交换字段由于初始值计算顺序不同而不是这样。我不知道这是否也适用于C#,但这并不让人吃惊。]
你愿意比较编译后的程序集吗?如果愿意,.NET Reflector有一个叫做Diff的插件可以让你比较两个程序集。这样做肯定不会关心你的对象在源文件中如何排列。
这也是我一直在思考的问题。我认为目前还没有这样的工具。对于其他情况,有“功能性”(而不仅仅是基于文本)的差异工具可用。例如,Microsoft Word集成了自己的差异/合并功能(可以脚本化,因此可以与TortoiseSVN等集成),还有几个可用于XML的工具,它们解释xml文件而不仅仅将其视为文本。
我不确定这样的工具相比良好的基于文本的差异/合并工具的附加值是否足以证明开发它。另一方面,这可能只是解决我们在处理困难的合并情况时所感受到的“合并痛苦”的缺失环节。
当然,难点在于您必须以与C#编译器相同的方式解释代码。目前来看,最接近的工具确实是NDepend。我认为这篇博客文章解释了它在这方面的一些能力。
对于这个问题,Scooter Software 的Beyond Compare非常好用,而且价格便宜(30美元)。
我知道你正在寻找一种工具。但是既然我不知道有什么工具可用,那么这就是我如何完成它的方法:
我使用KDiff,发现它运行得非常好。而且当然是免费的。
正如许多人所建议的那样,我猜测这种比较可能无法使用现有的差异工具进行。因为它们的目的是判断是否有变化,如果您将一个方法从开头移到结尾,实际上确实发生了变化。
但是我现在想到的是,您可以自己完成它。基本上调用一些差异工具,然后返回新插入的行,基本上是您已将其移动到文件末尾的方法。然后您可以自己进行比较,看看更改的行是否已经存在于以前的文件中。