Ottenere i numeri di riga delle differenze in due file durante l'esecuzione di un diff su due file in Windows

StackOverflow https://stackoverflow.com/questions/4139083

  •  30-09-2019
  •  | 
  •  

Domanda

Ai fini della revisione del codice, dopo un file sorgente esistente viene modificato, passiamo in rassegna solo righe di codice che sono state cambiate in quelle file di origine.
Dopo che ho apportare modifiche ai file di origine in un repository, devo comunicare le righe di codice che sono stati modificati in un file di origine prima di noi le nostre revisioni del codice peer.

Sono in grado di vedere un diff visiva utilizzando WinMerge, e sono contento di quello che fa per me, ma l'unico requisito per i miei collaboratori è semplicemente quello di conoscere il nome del file e i numeri di riga che hanno bisogno di essere rivisto .

C'è un modo per ottenere solo i numeri di riga di un file cambiato? I tipi di file sarebbero i file di origine di testo, come JavaScript, Java, XML, XSL, ecc

I file di esempio -

foo (nuova versione):

a
b
c
d
e
f
g
h
i
j
k

foo (vecchia versione):

a
b
C
d
h
i
k

L'output che sto cercando:

foo: 3, 5-7, 10-11

o

foo:
3
5-7
10-11

Sono sicuro che un certo programma consente. Non riesco proprio a trovare uno. Eventuali suggerimenti? Attualmente sto usando WinMerge, ma qualsiasi programma che gira su Windows sarà bene con me. Sarebbe preferibile se il software è open-source o freeware.

EDIT: GNU Diffutils è vicino a quello che voglio, ma non esattamente raccordo mie esigenze. Guardando le opzioni della riga di comando, che vedo "q" (o "--brief") come un diff semplificata, ma è troppo semplice. Uscita:

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

uscita diff normale:

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 uscita:

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

sto cercando qualcosa di più informativo di diff q, ma meno informativo di diff -u e diff. Qualsiasi diff ninja là fuori che sono a conoscenza delle diverse opzioni per permettere questo?

Sarò sempre confrontando un nuovo file recentemente modificato ad uno più vecchio. Ho solo bisogno di cose che devono rivedere il nuovo file.

È stato utile?

Soluzione

GNU Diffutils è open source, libero, e ha un Windows porto .

Altri suggerimenti

Salva il primo file come x.txt e il secondo come y.txt

Quindi eseguire:

diff -i --unchanged-line-format = "¥" --new-line-format = ":% dn:% L" y.txt x.txt | perl -pe 's / ¥ / \ n / g' | perl -pe '$ count ++; if (! $ _ ~ / ^ \ n $ /) {print "$ count \ t";} '

Non è a conoscenza di un metodo di Windows nativo, ma io uso funzione "file confrontare" di Textpad per questo, ed è abbastanza buono.

nativo

di Windows. Il nostro SD intelligente differenziatore produce delta non su linee ma su strutture di programma, ed è preciso come alla linea / colonna linea / colonna e il tipo di entità programma che è stato modificato. Esso mette a confronto analizzando il testo di origine, e utilizzando la struttura del codice per guidare il confronto. Delta sono descritti in termini di azioni di interesse per i programmatori:. Inserisci, Sostituisci, Elimina, Sostituire

Ecco un esempio:

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

L'alto livello di modificare le azioni sono "io", "S", "R" e "D", con i dettagli su ciò che è stato aggiunto, inserito o cancellato sui lati sinistro o destro del I / S / R / D personaggio con precisione line.column. Ad esempio, alla riga 12 della colonna 5, un campo-dichiarazione è stata "I" inserite in modo, solo in linea 12 dalla colonna 5 a colonna 57. Alla linea 272, un blocco di codice è stato "I" inserite in modo da linee 279-280 con lo identificatore lineNum sostituito da endLineNum. In linea 424 nel secondo file, la dichiarazione expresssion è stato "S" ubstituted da quello originariamente dalla linea 514. Maggiori dettagli sul sito.

Si può facilmente striscia fuori dettagli in più (roba seguente ":" i caratteri e dentro []). Se si vuole con qualcosa di simile a Perl

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top