Ricerca nella cronologia delle sovversioni (testo completo)


135

Esiste un modo per eseguire una ricerca full-text di un repository di sovversione, inclusa tutta la cronologia?

Ad esempio, ho scritto una funzione che ho usato da qualche parte, ma poi non era necessaria, quindi ho svn rm'd i file, ma ora ho bisogno di trovarlo di nuovo per usarlo per qualcos'altro. Il registro svn probabilmente dice qualcosa come "elementi non utilizzati rimossi", e ci sono un sacco di checkin come quello.

Modifica 15-04-2016: Si noti che ciò che viene richiesto qui con il termine "ricerca full-text" è cercare le differenze effettive nella cronologia del commit e non i nomi di file e / o i messaggi di commit . Lo sto sottolineando perché la frase dell'autore sopra non riflette molto bene - dal momento che nel suo esempio potrebbe anche cercare solo un nome file e / o un messaggio di commit. Da qui molte svn logrisposte e commenti.


6
Apache Subversion 1.8 accetta l' --searchargomento per il svn logcomando. Vedere la mia risposta a stackoverflow.com/a/17473516/761095
bahrep

3
svn log --searchnon esegue una ricerca full-text come richiesto da @rjmunro, ma cerca solo l'autore, la data, il messaggio di registro e l'elenco dei percorsi modificati.
zb226,

Risposte:


77
git svn clone <svn url>
git log -G<some regex>

1
Buon punto. La GUI di gitk fa molto bene questo tipo di ricerca ed è facile usare gli strumenti git svn per accedere a un repository svn. Devo ammettere che, dal momento in cui ho posto questa domanda, ho iniziato a utilizzare git, quindi accettare questa risposta potrebbe essere un po 'specifico per me.
rjmunro,

4
Tieni presente che ciò può richiedere del tempo a seconda delle dimensioni del tuo repository. Per me ci sono voluti più di un'ora.
user247702

20
Ho sottovalutato questa soluzione poiché la conversione di un grande repository SVN in GIT spesso non è fattibile o richiederebbe troppo tempo. È come raccomandare Java quando si ha una domanda su un costrutto del linguaggio C #.
ooxi,

3
Potrebbe essere necessario installare un pacchetto aggiuntivo per questo comando. Su Ubuntu, vuoi farlo apt-get install git-svn.
nedned

5
"Svn log --verbose --diff | grep ..." non acquista all'incirca la stessa funzionalità senza dover usare git?
Lyte

41

svn login Apache Subversion 1.8 supporta una nuova --searchopzione . Quindi è possibile cercare i messaggi di registro della cronologia del repository Subversion senza utilizzare gli script e gli strumenti di terze parti.

svn log --search cerca in autore, data, testo del messaggio di registro ed elenco di percorsi modificati.

Vedi SVNBook | svn logriferimento da riga di comando .


7
Ricerca pratica, ma non full-text. Mi
attengo alla

4
Non che al momento i repository svn su googlecode siano ancora in esecuzione su svn 1.6 ... vedi: code.google.com/p/support/wiki/… ? Ma l'aggiornamento del tuo client a 1,8 (e l'aggiornamento svn di qualsiasi repository verificato) ti consentirà di utilizzare svn log - ricerca nel repository ...
Mario Ruggier,

La copia di lavoro necessita di tutti gli aggiornamenti ma questo comando elenca l'intera modifica incluso il numero di revisione, i file modificati e il commento. Come non è full-text?
Bernhard Döbler,

24

Se stai usando Windows dai un'occhiata a SvnQuery . Mantiene un indice di testo completo dei repository locali o remoti. Ogni documento mai impegnato in un repository viene indicizzato. Puoi eseguire query simili a Google da una semplice interfaccia Web.


Sarebbe bello se SvnQuery fosse ancora mantenuto, ma purtroppo è morto e ora non funziona affatto.
Dan Atkinson,

Ho trovato un clone funzionante (?) Su github.com/kalyptorisk/svnquery/releases
Philip Helger

21

Sto usando un piccolo shellscript, ma funziona solo per un singolo file. Puoi ovviamente combinare questo con find per includere più file.

#!/bin/bash
for REV in `svn log $1 | grep ^r[0-9] | awk '{print $1}'`; do 
  svn cat $1 -r $REV | grep -q $2
  if [ $? -eq 0 ]; then 
    echo "$REV"
  fi 
done

Se vuoi davvero cercare tutto, usa il svnadmin dumpcomando e grep attraverso quello.


Ho dovuto rimuovere la "r" dai numeri delle revisioni con: awk '{print substr ($ 1,2, length ($ 1))}' e rimuovere l'opzione grep "-q", per mostrare effettivamente le corrispondenze.
Hugo,

stringhe myDump.txt | grep "turtle fwd 10"
jedierikb

2
Ed è per questo che abbracciamo Git.
Espiazione limitata il

potrebbe voler fare l'ultimo grep -i per ignorare il caso e rilasciare -q per vedere effettivamente la riga corrispondente
Belun

13

Il modo migliore che ho trovato per farlo è con meno:

svn log --verbose | Di meno

Una volta che viene fuori con meno output, puoi premere /per cercare, come VIM.

Modificare:

Secondo l'autore, vuole cercare oltre ai messaggi e ai nomi dei file. Nel qual caso ti verrà richiesto di hackerarlo con qualcosa come:

svn diff -r0:HEAD | less

Puoi anche sostituire grepo qualcos'altro per fare la ricerca per te. Se si desidera utilizzarlo in una sottodirectory del repository, sarà necessario utilizzare svn logper discernere la prima revisione in cui era presente quella directory e utilizzare quella revisione anziché 0.


5
Non si tratta di ricerca a testo integrale, ma di ricerca nei registri e nei nomi dei file.
rjmunro,

In tal caso, è necessario utilizzare registri di commit più espressivi. Se vuoi cogliere la differenza tra le revisioni, questa è tutta un'altra sfera di cera. E personalmente non conosco un modo per farlo.
Jack M.

> svn diff -r0: HEAD> log> less log è la mia scelta su Windows. Grazie
Kingoleg l'


7
svn log -v [repository] > somefile.log

per diff puoi usare l' --diffopzione

svn log -v --diff [repository] > somefile.log

quindi usa vim o nano o quello che ti piace usare e fai una ricerca per quello che stai cercando. Lo troverai abbastanza rapidamente.

Non è uno script di fantasia o qualcosa di automatizzato. Ma funziona


AFAICS, che cercherà i messaggi di commit, non le differenze effettive.
rjmunro,

Quindi usa svn log -v --diff [repository]> somefile.log
JREN



4

Ho appena incontrato questo problema e

svnadmin dump <repo location> |grep -i <search term>

ha fatto il lavoro per me. Restituito la revisione della prima occorrenza e citato la riga che stavo cercando.


1
Funziona solo localmente e richiederà molto tempo se un repository è grande.
bahrep,

2

Non ho alcuna esperienza con esso, ma SupoSE (open source, scritto in Java) è uno strumento progettato per fare esattamente questo.


2

svn log -l<commit limit> | grep -C<5 or more lines> <search message>


1

Di solito faccio quello che dice Jack M (uso svn log --verbose) ma eseguo pipe per grep invece di meno.


5
Non si tratta di ricerca a testo integrale, ma di ricerca nei registri e nei nomi dei file.
rjmunro,

Questo è ciò che di solito finisco per fare, ma ho scoperto che con lesste puoi effettivamente vedere la revisione, la data, ecc. Anziché la riga nel commento. Di solito è quello che cerco comunque.
Jack M.

1

Ho scritto questo come uno script cygwin bash per risolvere questo problema.

Tuttavia richiede che il termine di ricerca sia attualmente all'interno del file system. Per tutti i file che corrispondono al filesystem grep, viene quindi eseguita una grep di tutte le differenze svn per quel file. Non perfetto, ma dovrebbe essere abbastanza buono per la maggior parte dell'utilizzo. Spero che questo ti aiuti.

/ Usr / local / bin / svngrep

#!/bin/bash
# Usage: svngrep $regex @grep_args

regex="$@"
pattern=`echo $regex | perl -p -e 's/--?\S+//g; s/^\\s+//;'` # strip --args
if [[ ! $regex ]]; then
    echo "Usage: svngrep \$regex @grep_args"
else 
    for file in `grep -irl --no-messages --exclude=\*.tmp --exclude=\.svn $regex ./`;     do 
        revs="`svnrevisions $file`";
        for rev in $revs; do
            diff=`svn diff $file -r$[rev-1]:$rev \
                 --diff-cmd /usr/bin/diff -x "-Ew -U5 --strip-trailing-cr" 2> /dev/null`
            context=`echo "$diff" \
                 | grep -i --color=none   -U5 "^\(+\|-\).*$pattern" \
                 | grep -i --color=always -U5             $pattern  \
                 | grep -v '^+++\|^---\|^===\|^Index: ' \
                 `
            if [[ $context ]]; then
                info=`echo "$diff" | grep '^+++\|^---'`
                log=`svn log $file -r$rev`
                #author=`svn info -r$rev | awk '/Last Changed Author:/ { print $4 }'`; 

                echo "========================================================================"
                echo "========================================================================"
                echo "$log"
                echo "$info"
                echo "$context"
                echo
            fi;
        done;
    done;
fi

/ usr / local / bin / svnrevisions

#!/bin/sh
# Usage:  svnrevisions $file
# Output: list of fully numeric svn revisions (without the r), one per line

file="$@"
    svn log "$file" 2> /dev/null | awk '/^r[[:digit:]]+ \|/ { sub(/^r/,"",$1); print  $1 }'

'A' per sforzo! (basta usare git :))
Espiazione limitata il

-1

Nel caso in cui si stia tentando di determinare quale revisione è responsabile di una specifica riga di codice, probabilmente si sta cercando:

svn blame

Credito: risposta originale


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.