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

Mat*_* V. 16 diff comments ignore command-line-interface

我有一个从原始项目分叉的大型代码库,我正在尝试追踪与原始项目的所有差异.许多文件编辑包括注释掉的调试代码和其他杂项注释.在Ubuntu下名为Meld的GUI差异/合并工具可以忽略注释,但只能忽略单行注释.

有没有其他方便的方法来查找非注释差异,使用GUI工具或Linux命令行工具?如果它有所不同,代码是PHP和Javascript的混合,所以我主要感兴趣忽略//,/* */#.

ken*_*orb 5

要使用视觉差异,您可以尝试MeldDiffMerge

差异合并

它的规则集和选项提供了自定义行为。

GNU diffutils

从命令行的角度来看,您可以使用--ignore-matching-lines=REoption for diff,例如:

diff -d -I '^#' -I '^ #' file1 file2
Run Code Online (Sandbox Code Playgroud)

请注意,正则表达式必须匹配两个文件中的相应行,并且它匹配大块中的每个更改行才能工作,否则它仍然会显示差异。

使用单引号来保护模式免受外壳扩展并转义正则表达式保留的字符(例如括号)。

我们可以在diffutils手册中阅读:

但是,-I如果大块中的每个更改行(每次插入和每次删除)都与正则表达式匹配,则仅忽略包含正则表达式的行的插入或删除。

换句话说,对于每个不可忽略的更改,diff打印其附近的完整更改集,包括可忽略的更改。您可以使用多个-I选项为要忽略的行指定多个正则表达式。diff尝试将每一行与每个正则表达式匹配,从给定的最后一个开始。

armel here也很好地解释了这种行为。


也可以看看:

或者,检查其他差异应用程序,例如:


awi*_*ebe -1

尝试:

diff -I REGEXP -I REGEXP2 file1 file 2
Run Code Online (Sandbox Code Playgroud)

请参阅:维基百科的正则表达式

下面是正则表达式的示例,它们会导致 diff 忽略预处理器指令和两种标准注释块类型。

在示例中:

\#*\n
/***/
//*\n
Run Code Online (Sandbox Code Playgroud)

  • 不,[--ignore-matching-lines](http://www.gnu.org/software/diffutils/manual/html_node/Specified-Lines.html#Specified-Lines)并没有完全清除注释。 (2认同)