2010-04-29 17 views
33

C'è un modo per trovare una revisione SVN cercando una stringa di testo che è stata rimossa nel file? Conosco il testo esatto da cercare e il file da cercare, ma ci sono centinaia di revisioni.Trova revisione svn rimossa dal testo

+0

Intendi per le modifiche apportate o per un testo contenuto nel messaggio di registro? È possibile utilizzare l'URL/file di log di svn in modo da ottenere l'elenco delle revisioni in cui questo file è stato modificato. Usando svn blame -rRevision: Revision URL/file stamperà la riga che è stata cambiata nella revisione e un grep (unix) su quello darebbe le informazioni necessarie ... – khmarbaise

+0

Intendevo le modifiche effettive del file, non i messaggi del registro. svn blame + grep era _almost_ abbastanza buono, ma il cambiamento stava cancellando il testo invece di aggiungerlo, quindi non è stato visualizzato lì. Ho aggiornato la domanda con dei chiarimenti; grazie khmarbaise. –

+1

svn blame visualizzerà le righe in entrambi i casi se aggiungi una linea o rimuovi una linea. Se si utilizza il modo in cui ho suggerito nella mia risposta (svn blame -r Rev: Rev URL/file). – khmarbaise

risposta

31

Sulla sceneggiatura di khmarbaise, sono arrivato fino a questo:

#!/bin/bash 
file="$1" 
REVISIONS=`svn log $file -q --stop-on-copy |grep "^r" | cut -d"r" -f2 | cut -d" " -f1` 
for rev in $REVISIONS; do 
    prevRev=$(($rev-1)) 
    difftext=`svn diff [email protected]$prevRev [email protected]$rev | tr -s " " | grep -v " -\ \- " | grep -e "$2"` 
    if [ -n "$difftext" ]; then 
     echo "$rev: $difftext" 
    fi 
done 

passare il nome del file e la stringa di ricerca nella linea di comando:

xyz.sh "filename" "text to search" 

svn diff mi dà sia il rev dove è aggiunto e dove è cancellato; Lascerò qui nel caso sia utile a chiunque. C'è un messaggio di errore nell'ultima revisione di cui non so come sbarazzarmi (ho ancora molto da imparare :)) ma i numeri di giri sono corretti.

+1

Questo ha funzionato bene per me, grazie! –

+0

Questo script funziona magnificamente anche per stringa/testo che viene aggiunto perché funziona su svn diff. Grazie per la sceneggiatura. –

+0

In 'grep"^r "| cut -d "r" -f2 | cut -d "" -f1' stai usando tre processi; Vorrei usare qualcosa come "sed -ne"/^ r/{s/^ r //; S/ .*//; p} "invece. – musiphil

9

solo un piccolo script bash che filtra le linee modificate ... Se si cambia pom.xml nel proprio file, con l'URL supplementare si ha ciò di cui si ha bisogno ... (Se si è su un sistema simile a Unix). Metti il ​​seguente in un file di script (xyz.sh) e fai un filtro sull'output.

#!/bin/bash 
REVISIONS=`svn log pom.xml -q|grep "^r" | cut -d"r" -f2 | cut -d" " -f1` 
for rev in $REVISIONS; do 
    svn blame -r$rev:$rev pom.xml | tr -s " " | grep -v " -\ \- " 
done 


xyz.sh | grep "Text you are searching for" 

La stampa sarà qualcosa di simile:

256 ...... 

La 256 è la revisione in cui era stata fatta la modifica.

+0

Questo non stampa le righe cancellate, vero? – musiphil

+0

@musiphil corretto. – khmarbaise

1

mi piace blameall.py.

uscita di esso per un file contiene tutte le linee esistenti e cancellate in modo che possa vedere le linee eliminati nel contesto circostante.

1

fatto una semplice versione di PHP della risposta accettata da eseguire sulla riga di comando:

<?php 
$file = $argv[1]; 
$searchfor = $argv[2]; 

if (!$file) die('Please specify file name to search through as the first argument.'); 
if (!$searchfor) die('Please specify text to search for as the second argument.'); 

echo PHP_EOL .'Searching '. $file .' for: '. $searchfor . PHP_EOL . PHP_EOL; 

$cmd = 'svn log '. $file .' -q'; 
$output = array(); 
exec($cmd, $output); 

// Find all revisions 
$all_revisions = array(); 
foreach ($output as $line) { 
    if (preg_match("/^r(\\d+) /", $line, $match)) { 
     $all_revisions[] = $match[1]; 
    } 
} 

echo 'Checking '. count($all_revisions) .' revisions...'. PHP_EOL . PHP_EOL; 

// Get diff for each revision 
foreach ($all_revisions as $keykey => $rev) { 
    $prev_rev = $all_revisions[$keykey+1]; 

    $cmd = 'svn diff --old='. $file .'@'. $prev_rev .' --new='. $file .'@'. $rev; 
    $output = array(); 
    exec($cmd, $output); 

    // Check if string is present 
    $str = implode(PHP_EOL, $output); 
    if (strpos($str, $searchfor) !== false) { 
     echo 'Found in revision '. $prev_rev .' but removed from '. $rev .'.'. PHP_EOL; 
     break; 
    } else { 
     echo 'Not found in revision '. $rev .'.'. PHP_EOL; 
    } 
} 
echo 'Done.'. PHP_EOL; 

eseguire lo script lo script con il seguente comando:

php scriptname.php "filetosearchthrough.php" "text to search for"

Lo script potrebbe essere ottimizzato ma fa quello che ti serve. Tieni presente che è necessario molto tempo per cercare tra molte revisioni.

0

Se non puoi o non vuoi utilizzare gli script:

svn log --diff [path_to_file] > log.txt 

(il [path_to_file] è facoltativo, se non si specifica che, includerà tutti i file nella cartella corrente e sottocartelle)

Qui puoi trovare tutte le linee aggiunte (iniziano con +), tutte le linee rimosse (iniziano con -) e alcune linee di contesto (iniziano con uno spazio). Le linee modificate appariranno con il + e ripetute con il -

È possibile elaborare il file risultante con qualsiasi editor di testo decente (ad esempio Notepad ++), grep, script o qualsiasi cosa tu voglia.

Problemi correlati