如何执行忽略所有注释的diff?

20

我有一个大型的代码库,它是从原始项目分叉而来,我正在尝试跟踪所有与原始版本不同的地方。很多文件编辑都包括注释掉的调试代码和其他各种注释。Ubuntu下的GUI diff/merge工具Meld可以忽略注释,但只能忽略单行注释。

是否有其他方便的方法可以找到仅非注释的差异,可以使用GUI工具或Linux命令行工具?如果有差异,代码是PHP和Javascript的混合,因此我主要想忽略///* */#

7个回答

5

要使用可视化差异工具,您可以尝试 MeldDiffMerge

DiffMerge

它的规则集和选项提供了定制化的行为。

GNU diffutils

从命令行角度来看,您可以使用--ignore-matching-lines=RE选项进行diff,例如:

diff -d -I '^#' -I '^ #' file1 file2

请注意,正则表达式必须匹配两个文件中相应的行,并且它会匹配修补程序中每个更改的行以使其起作用,否则它仍将显示差异。
使用单引号来保护模式免受shell扩展并转义正则表达式保留字符(例如括号)。
我们可以在diffutils手册中阅读到:
“但是,-I仅在包含正则表达式的行的插入或删除被忽略时才忽略。换句话说,对于每个不可忽略的更改,diff打印其附近的完整更改集,包括可忽略的更改。您可以通过使用多个-I选项来指定要忽略的行的多个正则表达式。 diff尝试将每行与每个正则表达式进行匹配,从最后一个给定的开始。”
这种行为也在armel here中得到了很好的解释。

另请参阅:

或者,您可以查看其他差异应用程序,例如:


我想知道如何设置DiffMerge以忽略C/C++代码的注释行,特别是在比较文件夹时。 - Anton Kukoba

1
diff <file1> <file2> | grep -v '^[<>]\ #'

远非完美,但可以让你了解其中的差异。

1
请查看我们的智能差异工具系列,它使用语言结构而不是布局作为指南来比较计算机语言源文件。这意味着它会忽略注释和空格来比较代码。
我们还有一个专门用于PHP的智能差异工具

PS: Matt,我们也在奥斯汀。 - Ira Baxter
@TomasTintera:嗯,我们认为SmartDiff相当聪明。您能否更清楚地说明您尝试的是哪种语言(PHP?Java?...),以及未能产生您期望的情况/实际情况是什么,确切地说您期望什么?(您可以将示例发送至“support@semanticdesigns.com”,我们会查看它)。 - Ira Baxter
@TomasTintera:我注意到原帖作者正在寻找一种可以忽略注释(更改)的工具。SmartDiff可以满足原帖需求。 - Ira Baxter
好的。谢谢您的提醒。我已经删除了我的评论,因为它属于另一个问题和答案。 - Tomas Tintera

1

您可以先通过stripcmt过滤两个文件,这将删除C和C++注释。要删除#注释,sed 's/#.*//'将删除它们。

当然,在删除注释之前,您会失去一些上下文,但另一方面,注释的差异不会造成任何问题。我认为我会像以下这样做(针对单个文件进行描述,根据需要自动化):

  1. 如果原始代码库的最新版本为A,复制的代码库的最新版本为B,则将已删除注释的版本称为A'B'(例如,在处理过程中将其保存到临时文件中)。
  2. 找到一些共同的起源版本,并从中剥离注释到O'(或者只是重新使用B')。
  3. O'A'B'执行三方合并,并保存到C'KDiff3是一个非常好用的工具。
  4. 现在你已经有了要合并的代码更改,但是C'没有注释,所以回到“正常”模式,使用A'作为基础,对AC'进行新的三方合并。这将把A'C'之间的更改(即你想要的代码更改)合并到带有基于版本A的注释的正常代码库中。
在开始编程之前,强烈建议您在纸上绘制版本树,以清楚地了解要处理的版本。但不要受限于树所显示的内容,如果您确定要使用哪些版本,可以合并任何版本和任何方向

0

GNU diff 支持忽略与正则表达式匹配的行:

diff --ignore-matching-lines='^#' file1 file2

对于文件夹:

diff -[bB]qr --ignore-matching-lines='^#' folder1/ folder2/

这将忽略所有以 # 开头的行。


2
这将忽略所有以#开头的行。但事实并非如此。--ignore-matching-lines 的行为是不同的。 - Avio

0

我尝试了:diff file1 file2diff -d -I ^#.\* file1 file2,结果两种情况都包括注释;

然而,diff -u file1 file2 | grep -v '^ \|^.#\|^.$' 给出了我需要的:真正的差异,没有注释,也没有空行。 ;)


-1

尝试:

diff -I REGEXP -I REGEXP2 file1 file 2

请参见维基百科上的正则表达式

以下是一些正则表达式示例,它们会使差异忽略预处理器指令和两种标准注释块类型。

例如:

\#*\n
/***/
//*\n

2
不,--ignore-matching-lines并不能完全清除注释。 - Avio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接