如何忽略差异中的移动行


11

我目前正在使用源代码生成工具。为确保所做的更改不会引入任何新的错误,diff更改前后的程序输出在理论上将是一个有价值的工具。

但是,事实证明这比人们想象的要难,因为该工具import以半随机排序的方式输出顺序无关紧要的行(如语句,函数声明等)。因此,的输出diff杂乱无章,实际上只有行移到了同一文件中的另一个位置。

有没有办法使diff忽略这些移动,而只输出真正添加或删除的行?


也许更方便地更改您的工具以按特定的顺序(例如,词典,如果可能的话,以您的语言)生成函数并导入声明?
丹尼尔·贝克

@丹尼尔·贝克(Daniel Beck):请参阅下面我对吉尔(Gilles)的回答。
dnadlinger 2010年

这是一个古老的主题,但在下面总结了一下注释diff,由于代码的指令顺序确实很重要,因此该工具如何能够将有效动作与无效动作分开,并且不正确的情况受到限制(导入,函数和类的声明,等)?
2014年

@Joël:答案很简单,我知道我必须测试的生成器更改不会引入任何与更改行顺序有关的错误。当然,您需要基于目标语言的解析器的工具来避免一般情况下的假阳性(或者只是生成器的全面测试套件),但这被认为是一次快速的一次性检查进行代码审查。
dnadlinger 2014年

Answers:


2

您可以做一个简单的比较,将结果存储在某个地方(以避免再次比较),循环浏览任一版本中的行,然后从另一侧删除它们。

这为工作代码产生了一个单独的项目编码。


我不确定这到底应该做什么,但似乎并没有产生想要的结果。据我理解的问题,从代码中的两个示例来看/tmp/old/tmp/new不需要差异结果,因为只有几行已移动。但是,此代码确实会产生结果。
Ilari Kajaste 2011年

修复了代码。
l0b0 2011年

很久以前,当我完成上述合并过程时,还没有测试答案,但是从代码的角度看,它似乎可以工作。
dnadlinger 2014年

4

您可以先尝试对它们进行排序。就像是:

sort file-a > s-file-a
sort file-b > s-file-b
diff s-file-a s-file-b

Bash(和zsh)可以通过进程替换在一行中完成此操作

diff <(sort file-a) <(sort file-b)

这可能是一个选择,但是生成的差异将不是很有用,因为我会丢失所有行号和上下文信息……
dnadlinger 2010年

即使我仍然希望有一个更好的解决方案,我还是采用了这种方法来验证我一直在进行的更改。
dnadlinger 2010年

2
我可以预见这将遗漏一些更改。有时顺序很重要,有时却不重要。您丢弃所有上下文。
Rich Homolka 2012年

对于订购重构,我想确保确实存在的一切仍然存在,这正是我所需要的。
ntrrobng

0

听起来您已经控制了该工具。然后使其输出可预测:不要以半随机顺序发出声明,而应使用(例如)字母顺序作为最后的选择。这不仅具有消除差异中无用的残屑的好处,而且还使工具的输出更易于阅读和验证。


抱歉,这个答案对我没有任何帮助-如果很简单,我会立即更改它。此外,我目前正在合并发电机最初来自其项目的更改,因此添加如此深远的更改会使该过程更加复杂……
dnadlinger 2010年

0

如果文件被组织成部分,它只是是为了出的部分,并且存在一个正则表达式,你可以用它来识别节头,你可以CSPLIT文件到他们的部分,然后比较各部分成对。

例如,我只是对两个MySQL转储进行了此操作,以在某些数据库名称更改大小写之后对其进行比较(因此,转储以不同的顺序列出了它们):

csplit all-07sep2015-11:19:12.sql '/Current Database/-1' '{*}'  # split the dump made before the change, creating files xx00, xx01, ...
csplit -f yy all-07sep2015-12:26:12.sql '/Current Database/-1' '{*}' # split the dump made after the change, creating files yy00, yy01, ...
fgrep 'Current Database' xx?? yy?? | perl -lne 'BEGIN{my %foo}; /(^....).*`(.*)`/ and push(@{$foo{lc($2)}}, $1); END {printf("diff -di %s %s\n", @{$_}) for values %foo}' | sh -x | less  # match the pairs and compare them with diff
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.