我有一个大型的代码库,它是从原始项目分叉而来,我正在尝试跟踪所有与原始版本不同的地方。很多文件编辑都包括注释掉的调试代码和其他各种注释。Ubuntu下的GUI diff/merge工具Meld可以忽略注释,但只能忽略单行注释。
是否有其他方便的方法可以找到仅非注释的差异,可以使用GUI工具或Linux命令行工具?如果有差异,代码是PHP和Javascript的混合,因此我主要想忽略//
、/* */
和#
。
我有一个大型的代码库,它是从原始项目分叉而来,我正在尝试跟踪所有与原始版本不同的地方。很多文件编辑都包括注释掉的调试代码和其他各种注释。Ubuntu下的GUI diff/merge工具Meld可以忽略注释,但只能忽略单行注释。
是否有其他方便的方法可以找到仅非注释的差异,可以使用GUI工具或Linux命令行工具?如果有差异,代码是PHP和Javascript的混合,因此我主要想忽略//
、/* */
和#
。
要使用可视化差异工具,您可以尝试 Meld 或 DiffMerge。
它的规则集和选项提供了定制化的行为。
diffutils
从命令行角度来看,您可以使用--ignore-matching-lines=RE
选项进行diff
,例如:
diff -d -I '^#' -I '^ #' file1 file2
diffutils
手册中阅读到:diff
打印其附近的完整更改集,包括可忽略的更改。您可以通过使用多个-I选项来指定要忽略的行的多个正则表达式。 diff
尝试将每行与每个正则表达式进行匹配,从最后一个给定的开始。”另请参阅:
或者,您可以查看其他差异应用程序,例如:
diff <file1> <file2> | grep -v '^[<>]\ #'
您可以先通过stripcmt过滤两个文件,这将删除C和C++注释。要删除#
注释,sed 's/#.*//'
将删除它们。
当然,在删除注释之前,您会失去一些上下文,但另一方面,注释的差异不会造成任何问题。我认为我会像以下这样做(针对单个文件进行描述,根据需要自动化):
A
,复制的代码库的最新版本为B
,则将已删除注释的版本称为A'
和B'
(例如,在处理过程中将其保存到临时文件中)。O'
(或者只是重新使用B'
)。O'
、A'
和B'
执行三方合并,并保存到C'
。KDiff3是一个非常好用的工具。C'
没有注释,所以回到“正常”模式,使用A'
作为基础,对A
和C'
进行新的三方合并。这将把A'
和C'
之间的更改(即你想要的代码更改)合并到带有基于版本A
的注释的正常代码库中。GNU diff 支持忽略与正则表达式匹配的行:
diff --ignore-matching-lines='^#' file1 file2
对于文件夹:
diff -[bB]qr --ignore-matching-lines='^#' folder1/ folder2/
这将忽略所有以 # 开头的行。
我尝试了:diff file1 file2
和 diff -d -I ^#.\* file1 file2
,结果两种情况都包括注释;
然而,diff -u file1 file2 | grep -v '^ \|^.#\|^.$'
给出了我需要的:真正的差异,没有注释,也没有空行。 ;)
尝试:
diff -I REGEXP -I REGEXP2 file1 file 2
请参见维基百科上的正则表达式
以下是一些正则表达式示例,它们会使差异忽略预处理器指令和两种标准注释块类型。
例如:
\#*\n
/***/
//*\n