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

时间:2011-09-21 17:32:26

标签: comments diff command-line-interface ignore

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

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

7 个答案:

答案 0 :(得分:4)

要使用视觉差异,您可以尝试DiffMerge。其规则集和选项提供了自定义行为。

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

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

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

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

我们可以阅读diffutils手册:

  

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

     

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

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

答案 1 :(得分:1)

请参阅我们的Smart Differencer工具系列,这些工具使用langauge结构比较计算机语言源文件而不是布局作为指南。这尤其意味着它在比较代码时忽略了注释和空格。

SmartDifferencer for PHP

答案 2 :(得分:1)

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

当然,在首先删除注释时会丢失一些上下文,但另一方面,注释中的差异不会产生任何问题。我想我会像下面这样做(针对单个文件进行描述,根据需要自动化):

  1. 如果原始代码库的最新版本为A,则为。{ 最新复制的代码库是B,让我们调用版本 已移除A'B'的评论(例如,在处理时将这些评论保存到临时文件中)。
  2. 查找一些常见的原始版本,并将评论从O'中删除(或者只为此重复使用B'。)
  3. 执行O'A'B'的3向合并,并保存到C'KDiff3是一个很好的工具。
  4. 现在您需要合并代码更改,但C'没有注释,因此请返回“正常”模式,以A'作为基础和{{进行新的3向合并1}}和A。这会将C'A'之间的更改(代码更改为您想要的内容)添加到普通代码库中,并使用基于版本C'的注释。
  5. 强烈建议您在开始之前在纸上绘制版本树,以便清楚地了解您要使用的版本。但是不要限制树的显示内容,如果你只想弄清楚要使用哪个版本,你可以merge any version and in any direction

答案 3 :(得分:0)

尝试:

diff -I REGEXP -I REGEXP2 file1 file 2

请参阅:维基百科上的Regular expression

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

例如:

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

答案 4 :(得分:0)

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

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

和文件夹:

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

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

答案 5 :(得分:0)

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

远非完美但它会给出差异的概念

答案 6 :(得分:0)

我尝试过:diff file1 file2diff -d -I ^#.\* file1 file2 并且两种情况的结果都相同-包括评论;

但是,diff -u file1 file2 | grep -v '^ \|^.#\|^.$'给出 我需要的是:仅实际差异,无注释,无空行。 ;)