2010-11-09 145 views
4

出于代码审阅的目的,在修改现有源文件之后,我们只查看那些源文件中已更改的代码行。
在对存储库中的源文件进行更改之后,我们必须在执行我们的同行代码审查之前传达源文件中已更改的代码行。当在Windows中的两个文件上执行差异时,获取两个文件中差异的行数

我能够使用WinMerge看到视觉差异,我很满意它为我做了什么,但我的同事的唯一要求是简单地知道需要的文件名和行号审查。

有没有办法只得到一个更改文件的行号?该类型的文件是文本源文件,例如Javascript,Java和XML,XSL等等

样品files--

富(新版本):

a 
b 
c 
d 
e 
f 
g 
h 
i 
j 
k 

FOO(旧版本):

a 
b 
C 
d 
h 
i 
k 

我在寻找的输出:

foo: 3, 5-7, 10-11 

OR

foo: 
3 
5-7 
10-11 

我敢肯定,一些程序允许这一点。我找不到一个。有什么建议么?我目前使用WinMerge,但任何在Windows上运行的程序都可以。如果软件是开放源代码或免费软件,则会更好。

编辑: GNU DiffUtils接近我想要的,但不完全符合我的需求。查看命令行选项,我将“-q”(或“--brief”)看作简化的diff,但它太简单了。 输出:

C:\Program Files\GnuWin32\bin>diff.exe -q foo1.txt foo2.txt 
Files foo1.txt and foo2.txt differ 

常规差异输出:

C:\Program Files\GnuWin32\bin>diff.exe foo1.txt foo2.txt 
3c3 
<  c 
--- 
>  C 
5,7d4 
<  e 
<  f 
<  g 
10,11c7 
<  j 
<  k 
--- 
>  k 
\ No newline at end of file 

的diff -u输出:

C:\Program Files\GnuWin32\bin>diff.exe -u foo1.txt foo2.txt 
--- foo1.txt 2010-11-09 15:47:12.447916000 -0600 
+++ foo2.txt 2010-11-09 15:47:36.129954700 -0600 
@@ -1,11 +1,7 @@ 
    a 
    b 
- c 
+ C 
    d 
- e 
- f 
- g 
    h 
    i 
- j 
- k 
+ k 
\ No newline at end of file 

我正在寻找的东西比DIFF -q更多的信息,但比信息少diff -u和diff。任何差异ninjas谁知道不同的选择,以允许这?

我会一直在比较一个新的,最近修改过的文件和一个较旧的文件。我只需要那些需要审查新文件的东西。

+0

人们通常使用“统一”差异输出diff -u。您还可以指定包含多少行上下文。此外,它看起来好像从正常输出中过滤出非数字的行将非常接近你想要的。 – 2010-11-10 19:55:58

回答

3

GNU DiffUtils是开放源码,免费的,有a Windows port

+0

我接受这个答案,但我正在寻找更精细的输出控制。 – Zoot 2010-11-12 22:27:56

1

不知道Windows本地方法,但我使用Textpad的“比较文件”功能,这是非常好的。

1

Windows本机。我们的SD Smart Differencer产生的增量不是在行上,而是在程序结构上,对于行/列行/列和被编辑的程序实体的类型是精确的。它通过解析源文本并使用代码结构来推动比较进行比较。 Deltas根据程序员感兴趣的操作进行描述:插入,替换,删除,替换。

下面是一个例子:左

Java~Java1_5 SmartDifferencer Version 1.1.1 
Copyright (C) 2009 Semantic Designs, Inc; All Rights Reserved; SD Confidential 
Powered by DMS (R) Software Reengineering Toolkit 
*** Parsing file C:/DMS/Domains/Java/Java1_5/Analyzers/SmartDifferencer/Tests/diff1_before.java ... 
*** Parsing file C:/DMS/Domains/Java/Java1_5/Analyzers/SmartDifferencer/Tests/diff1_after.java ... 
*** Creating suffix tree ... 
*** Determining maximal pairs ... 
*** Sorting maximal pairs ... 
*** Determining differences ... 
*** Printing edits ... 
a12.5 I s12.5-12.57:field_declaration 
a179.9 I s185.9-185.71:executable_statement 
a193.5 I s201.9-203.9:executable_statement 
a272.13 I t279.13-280.33f267.13-268.30[267.17'lineNum'~>279.17'endLineNum',268.17'columnNum'~>280.17'endColumnNum']:statement_sequence_member,statement_sequence_member 
a340.68 I s352.68-352.68:',' s352.70-352.70:INTEGER s352.71-352.71:',' s352.73-352.73:INTEGER 
a423.13 I t436.13-509.38f450.17-518.35[482.17'hlevel'~>468.13'endLineNum',518.17'hname'~>509.13'endColumnNum']:executable_statement,executable_statement,executable_statement,executable_statement,executable_statement,executable_statement,executable_statement,executable_statement,executable_statement,executable_statement,executable_statement,executable_statement 
a423.84 I s513.84-513.84:',' s513.86-513.95:IDENTIFIER s513.96-513.96:',' s513.98-513.109:IDENTIFIER 
s424.13-424.59:expression_statement S s514.25-514.47:expression_statement 
s429.13-429.64:local_variable_declaration S s515.25-515.87:local_variable_declaration 
s430.13-430.71:executable_statement f431.13-431.69[431.13'lineString'~>79.9'config',431.26'lineString'~>79.18'config',431.47'indexOfSpace'~>79.35'end_index']t79.9-79.56:executable_statement s432.13-432.51:executable_statement D a516.25 
a433.13 I s516.25-519.25:executable_statement n433.13-439.13:executable_statement s433.13-433.14:'if' s433.16-433.16:'(' s433.17-433.30:relational_expression s433.31-433.31:')' s433.33-433.45:executable_statement s434.13-434.16:'else' n434.18-439.13:block s434.18-434.18:'{' n435.17-438.49:statement_sequence f435.17-435.71[435.17'lineString'~>79.9'config',435.28'lineString'~>79.18'config',435.49'indexOfSpace'~>79.35'end_index']t79.9-79.56:executable_statement s436.17-436.28:executable_statement s437.17-437.51:executable_statement s438.17-438.49:executable_statement s439.13-439.13:'}' D a516.25 
a442.13 I s520.25-520.54:executable_statement 

高层编辑动作是“I”,“S”,“R”和“d”,大约有加,插入或删除哪些细节或使用line.column精度的I/S/R/D字符的右侧。例如,在第12行的第5列,字段声明是“I”插入,仅在第5列到第57列的第12行中。在第272行,一行代码是从279-280行插入的“I”标识符lineNum被endLineNum替换。在第二个文件的第424行,expresssion声明已被“S”取代,最初来自514行。更多细节请访问网站。

如果你想用Perl之类的东西,你可以很容易地去除额外的细节(在“:”字符和内部[]之后的东西)。

+0

感谢您的建议,但我不打算写一个Perl脚本来获取行号。 – Zoot 2010-11-10 17:20:27

2

保存所述第一文件作为x.txt和第二为y.txt

然后运行:

DIFF -i --unchanged行格式= “¥” --new设备 - format =“:%dn:%L”y.txt x.txt | perl -pe's /¥/ \ n/g'| perl -pe'$ count ++; if($ _!〜/^\ n $ /){print“$ count \ t”;}'

+1

不错,死灵法师!如果我三年前才知道这一点,我可能会用到它。你应该包括关于如何安装perl for windows的说明,以及;) – Zoot 2014-01-22 19:43:40

+0

谢谢,这实际上是相当有用的有关差异和缺点的信息(真的会有-l或-line-numbers杀了你吗?)惭愧你需要使用这个多的象形文字和电锯perl切成形状..它帮助了我很多寿 – 2014-12-11 17:18:09