Domanda

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

Ad esempio, ho scritto una funzionalità che ho usato da qualche parte, ma poi non era necessaria, quindi ho svn rm'd i file, ma ora devo ritrovarla per usarla per qualcos'altro.Il registro svn probabilmente dice qualcosa come "rimosso materiale inutilizzato" e ci sono un sacco di check-in del genere.

Modifica 15-04-2016: Tieni presente che ciò che viene chiesto qui con il termine "ricerca full-text" è to cerca le differenze effettive della cronologia dei commit e non i nomi dei file e/o i messaggi di commit.Lo faccio notare perché la frase dell'autore sopra non lo riflette molto bene, poiché nel suo esempio potrebbe anche cercare solo un nome file e/o un messaggio di commit.Quindi molti dei svn log risposte e commenti.

È stato utile?

Soluzione

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

Altri suggerimenti

svn log in Apache Subversion 1.8 supporta un nuovo --search opzione.In questo modo puoi cercare i messaggi di registro della cronologia del repository Subversion senza utilizzare strumenti e script di terze parti.

svn log --search ricerche per autore, data, testo del messaggio di registro ed elenco dei percorsi modificati.

Vedere SVNBook | svn log riferimento alla riga di comando.

Se utilizzi Windows, dai un'occhiata a SvnQuery.Mantiene un indice di testo completo di repository locali o remoti.Ogni documento mai inserito in un repository viene indicizzato.Puoi eseguire query simili a Google da una semplice interfaccia web.

Sto usando un piccolo script di shell, ma funziona solo per un singolo file.Ovviamente puoi combinarlo 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 file svnadmin dump comando e grep attraverso quello.

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

SVN Log --verbose | meno

Una volta che less esce con l'output, puoi colpire / per cercare, come VIM.

Modificare:

Secondo l'autore la ricerca non si limita soltanto ai messaggi e ai nomi dei file.In tal caso ti verrà richiesto di ghetto-hackerarlo insieme a qualcosa del tipo:

svn diff -r0:HEAD | less

Puoi anche sostituire grep o qualcos'altro per cercarti.Se vuoi usarlo su una sottodirectory del repository, dovrai usare svn log per discernere la prima revisione in cui esisteva quella directory e utilizzare quella revisione invece di 0.

Ho cercato qualcosa di simileIl meglio che mi è venuto in mente è OpenGrok.Non ho ancora provato a implementarlo, ma sembra promettente.

svn log -v [repository] > somefile.log

per il differenziale puoi usare il file --diff opzione

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

quindi usa vim o nano o qualunque cosa ti piaccia usare e fai una ricerca per quello che stai cercando.Lo troverai abbastanza velocemente.

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

Anche se non è gratuito, potresti dare un'occhiata a Fisheye di Atlassian, le stesse persone che ti offrono JIRA.Esegue la ricerca full-text rispetto a SVN con molte altre utili funzionalità.

http://www.atlassian.com/software/fisheye/

Cercavo la stessa cosa e ho trovato questo:

http://svn-search.sourceforge.net/

Ho appena riscontrato questo problema e

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

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

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

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

L'ho scritto come script bash Cygwin per risolvere questo problema.

Tuttavia è necessario che il termine di ricerca sia attualmente all'interno del file system.Per tutti i file che corrispondono al grep del filesystem, viene quindi eseguito un grep di tutti i diff 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 }'

Di solito faccio cosa Jack M dice (usa svn log --verbose) ma mi rivolgo a grep invece che meno.

Se stai cercando di determinare quale revisione è responsabile di una specifica riga di codice, probabilmente stai cercando:

svn blame

Credito: risposta originale

Mi sono imbattuto in questo script bash, ma non l'ho provato.

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