Buscando historial de subversión (texto completo)

135

¿Hay alguna manera de realizar una búsqueda de texto completo de un repositorio de subversión, incluido todo el historial?

Por ejemplo, he escrito una característica que usé en algún lugar, pero luego no era necesaria, así que compré los archivos, pero ahora necesito encontrarla nuevamente para usarla en otra cosa. El registro svn probablemente dice algo así como "cosas no utilizadas eliminadas", y hay muchos registros como ese.

Editar 2016-04-15: Tenga en cuenta que lo que se pide aquí por el término "búsqueda de texto completo" es buscar las diferencias reales del historial de confirmación, y no nombres de archivo y / o mensajes de confirmación . Estoy señalando esto porque la frase del autor anterior no refleja muy bien, ya que en su ejemplo también podría estar buscando un nombre de archivo y / o un mensaje de confirmación. De ahí muchas de las svn logrespuestas y comentarios.

rjmunro
fuente
66
Apache Subversion 1.8 acepta --searchargumentos para el svn logcomando. Vea mi respuesta en stackoverflow.com/a/17473516/761095
bahrep el
3
svn log --searchno realiza una búsqueda de texto completo como lo requiere @rjmunro, sino que solo busca el autor, la fecha, el mensaje de registro y la lista de rutas cambiadas.
zb226

Respuestas:

77
git svn clone <svn url>
git log -G<some regex>
luis gutierrez
fuente
1
Buen punto. La GUI de gitk hace este tipo de búsqueda muy bien, y es fácil usar las herramientas de svn de git para acceder a un repositorio de svn. Es cierto que me he movido completamente a usar git desde el momento en que hice esta pregunta, por lo que aceptar esta respuesta podría ser un poco específico para mí.
rjmunro
44
Tenga en cuenta que esto puede llevar un tiempo dependiendo del tamaño de su repositorio. Para mí me llevó más de una hora.
user247702
20
Desestimé esta solución, ya que la conversión de un gran repositorio SVN a GIT a menudo no es factible o tomaría demasiado tiempo. Es como recomendar Java cuando se tiene una pregunta sobre una construcción de lenguaje C #.
ooxi
3
Es posible que deba instalar un paquete adicional para este comando. En Ubuntu, quieres hacerlo apt-get install git-svn.
nedned
55
¿"Svn log --verbose --diff | grep ..." no le compra aproximadamente la misma funcionalidad sin tener que usar git?
lyte
41

svn logen Apache Subversion 1.8 admite una nueva --searchopción . Por lo tanto, puede buscar mensajes de registro del historial del repositorio de Subversion sin usar herramientas y scripts de terceros.

svn log --search busca en autor, fecha, texto del mensaje de registro y lista de rutas cambiadas.

Ver SVNBook | svn logreferencia de línea de comandos .

bahrep
fuente
77
Práctico, pero no búsqueda de texto completo. Me quedo con la respuesta git-svn :-)
rjmunro
44
No es que en este momento svn repos en googlecode todavía se estén ejecutando en svn 1.6 ... ver: code.google.com/p/support/wiki/… ? Pero, actualizar su cliente a 1,8 (y la actualización de svn de cualquier repositorio desprotegido) le permitirá usar svn log --search en el repositorio ...
Mario Ruggier
La copia de trabajo necesita todas las actualizaciones, pero este comando enumera todo el cambio, incluido el número de revisión, los archivos modificados y los comentarios. ¿Cómo no es texto completo?
Bernhard Döbler
24

Si está ejecutando Windows, eche un vistazo a SvnQuery . Mantiene un índice de texto completo de repositorios locales o remotos. Todos los documentos comprometidos con un repositorio se indexan. Puede hacer consultas similares a google desde una interfaz web simple.

Christian Rodemeyer
fuente
Sería genial si SvnQuery aún se mantuviera, pero lamentablemente murió y ahora simplemente no funciona.
Dan Atkinson el
Encontré un clon de trabajo (?) En github.com/kalyptorisk/svnquery/releases
Philip Helger
21

Estoy usando un pequeño shellscript, pero esto solo funciona para un solo archivo. Por supuesto, puede combinar esto con buscar para incluir más archivos.

#!/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

Si realmente desea buscar todo, use el svnadmin dumpcomando y grep a través de eso.

Bas Grolleman
fuente
Tuve que eliminar la "r" de los números de revisiones con: awk '{print substr ($ 1,2, length ($ 1))}' y eliminar la opción grep "-q", para mostrar las coincidencias.
Hugo
cadenas myDump.txt | grep "turtle fwd 10"
jedierikb
2
Y es por eso que aceptamos git.
Expiación limitada el
podría querer hacer la última -i grep para ignorar caso y dejar caer la -q para ver realmente la fila que corresponde
Belun
13

La mejor forma en que he encontrado para hacer esto es con menos:

svn log --verbose | Menos

Una vez que se obtiene menos resultados, puede presionar /para buscar, como VIM.

Editar:

Según el autor, quiere buscar más que solo los mensajes y los nombres de los archivos. En cuyo caso, se te pedirá que hackees el ghetto junto con algo como:

svn diff -r0:HEAD | less

También puede sustituirlo grepu otra cosa para buscarlo. Si desea usar esto en un subdirectorio del repositorio, deberá usarlo svn logpara discernir la primera revisión en la que existió ese directorio y usar esa revisión en lugar de 0.

Jack M.
fuente
55
Eso no es búsqueda de texto completo, está buscando registros y nombres de archivos.
rjmunro
Si ese es el caso, entonces necesita usar registros de confirmación más expresivos. Si quieres aprovechar la diferencia entre las revisiones, esa es otra bola de cera. Y yo personalmente no sé una manera de hacerlo.
Jack M.
> svn diff -r0: HEAD> log> menos log es mi elección en windows. Gracias
kingoleg
9

He estado buscando algo similar. Lo mejor que se me ocurrió es OpenGrok . Todavía no he intentado implementarlo, pero parece prometedor.

Mike Schall
fuente
He estado usando OpenGrok durante varios meses, es genial.
Mauricio Scheffer
7
svn log -v [repository] > somefile.log

para diff puedes usar la --diffopción

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

luego use vim o nano o lo que quiera usar, y haga una búsqueda de lo que está buscando. Lo encontrarás bastante rápido.

No es un script sofisticado ni nada automatizado. Pero funciona.

Jren
fuente
AFAICS, que buscará mensajes de confirmación, no los diferenciales reales.
rjmunro
Luego use svn log -v --diff [repositorio]> somefile.log
JREN
6

Si bien no es gratis, puedes echar un vistazo a Fisheye de Atlassian, la misma gente que te trae JIRA. Realiza búsquedas de texto completo contra SVN con muchas otras características útiles.

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

mrjabba
fuente
1
Ojo de pez es bastante bueno. Como usted dice, no es gratis, pero la licencia de confirmación <= 10 es de solo $ 10 / año.
Jason S
Actualmente, 5 usuarios cuesta $ 10, ¡pero con solo 10 usuarios salta a $ 1,000!
Mawg dice que reinstalar a Monica el
4

Me encontré con este problema y

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

hizo el trabajo por mí Devolvió la revisión de la primera aparición y citó la línea que estaba buscando.

pfyon
fuente
1
Funciona solo localmente y tomará mucho tiempo si un repositorio es grande.
bahrep
2

No tengo ninguna experiencia con él, pero SupoSE (código abierto, escrito en Java) es una herramienta diseñada para hacer exactamente esto.

dF.
fuente
2

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

zednight
fuente
1

Por lo general, hago lo que dice Jack M (uso svn log --verbose) pero me dirijo a grep en lugar de menos.

Mark Biek
fuente
55
Eso no es búsqueda de texto completo, está buscando registros y nombres de archivos.
rjmunro
Eso es lo que generalmente termino haciendo, pero he descubierto que con lessusted realmente puedo ver la revisión, la fecha, etc. en lugar de solo la línea en el comentario. Eso es generalmente lo que estoy buscando de todos modos.
Jack M.
1

Escribí esto como un script cygwin bash para resolver este problema.

Sin embargo, requiere que el término de búsqueda esté actualmente dentro del archivo del sistema de archivos. Para todos los archivos que coinciden con el sistema de archivos grep, se realiza un grep de todos los svn diffs para ese archivo. No es perfecto, pero debería ser lo suficientemente bueno para la mayoría de los usos. Espero que esto ayude.

/ 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 }'
James McGuigan
fuente
'A' por esfuerzo! (solo use git :))
Expiación limitada del
-1

En caso de que esté tratando de determinar qué revisión es responsable de una línea de código específica, probablemente esté buscando:

svn blame

Crédito: respuesta original

DustWolf
fuente