2010-11-09 133 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