2009-03-01 9 views
10

Es una buena práctica eliminar el código anterior en lugar de simplemente comentarlo. A menudo se afirma que las partes antiguas del código siempre se pueden encontrar de nuevo en la revisión del repositorio SVN anterior, si es necesario.Problema SVN: ¿Cuál es la última revisión que aún contenía este fragmento de código?

Pero, en la práctica, no es tan fácil, ¿no? Si el código anterior está en alguna unknown antigua revisión SVN, entonces puede ser bastante difícil de encontrar.

Estoy exactamente en esa situación ahora mismo: hay una función que ya no necesito, y debería descartarla, ya que está en SVN, pero dudo porque podría necesitarla de nuevo, y yo ' Me temo que va a ser difícil encontrarlo en el repositorio.

Por supuesto, siempre se puede hacer un mensaje de confirmación, diciendo "función eliminada myFunction", pero a veces no se puede observar cada pequeña eliminación de código en el mensaje de confirmación, y también puede ser tedioso revisar todos los mensajes de confirmación para encontrar algo de nuevo

una herramienta automática sería mejor, algo así como

svn find "void myFunction\(" my-file.cc 

la que me decía los diferentes resultados de diferentes revisiones. Algo como eso existe?

EDIT: ¿Existen otros sistemas de control de versiones? Git tal vez? (Eso sería una razón para cambiar, diría yo.)

ACTUALIZACIÓN: Así que no hay una respuesta real, salvo la pequeña secuencia de comandos frágiles shell encontré más o menos por accidente (véase mi respuesta a continuación). Creo que es una pena para SVN. Encontrar algo en revisiones anteriores debería ser una de las funciones centrales del control de versiones. Alguien tiene mas informacion?

+0

¡Gran pregunta! Al hacer uso de la función de búsqueda de registro de compromiso en tortoiseSVN, a menudo he deseado que también indexe la revisión diffs –

Respuesta

6

Busqué en Google un poco más y encontré el siguiente script (vea here). He probado brevemente y parece estar funcionando bien:

rev_grep.sh 
===================== 
#!/bin/ksh 

URL=$1 
REGEX=$2 

LAST_REV="n/a" 

svn log -q $URL | perl -ne 'print "$1\n" if /^r(\d+)/' | 
while read r 
do 
    ##svn cat -r $r $URL | grep "$REGEX" > /dev/null 
    BUFFER=`svn cat -r $r $URL | grep "$REGEX"` 
    RET=$? 
    if [ $RET -eq 0 ] 
    then 
     echo "Match in revision: $r. Removed in $LAST_REV." 
     echo $BUFFER 

     exit 0 

    elif [ $RET -ne 1 ] 
    then 
     ## grep hit an error 
     exit 2 
    fi 

    LAST_REV=$r 
done 
exit 1 

El único problema es que, si su repositorio requiere una contraseña, se le tiene que introducir muchas veces.

3

Como resultado, Git tiene exactamente esta característica. Puede usar Git para clonar su repositorio de Subversion (usando git svn), y luego usar las herramientas de Git (en particular gitk lo hace fácil) para buscar cualquier texto agregado o eliminado en cualquier parte del historial del repositorio.

Para encontrar la revisión más reciente que aún contenía un texto específico, puede utilizar git bisect para buscar de manera eficiente la historia de revisión, donde alguna condición cambió.

+0

Ha, acabo de agregar esa pregunta (ver EDITAR). Gracias por la info! – Frank

+0

¿Puedes agregar un ejemplo de cómo buscar un fragmento de código fuente? No está inmediatamente claro para mí desde la página man vinculada de "gitk". –

2

supongo que va a conseguir un par de votos negativos para este ...

Hay algunas cosas que se resuelven más fácilmente por motivos no técnicos. Escriba en el mensaje de registro que está eliminando la función. La búsqueda de eliminaciones será solo analizar el registro svn:

$ svn commit file.c -m "Removal of void deprecated_function()" 

Ahora puede buscar en el registro. Los compromisos siempre deben identificar de una manera legible para los humanos cuáles son los cambios.

+0

No te votaré, pero creo que surgen situaciones de OMG que no pueden preverse en los comentarios ... –

+0

A veces quieres encontrar un código específico en una revisión anterior. Ayer mismo me preguntaba: ¿no incluyó este encabezado XYZ.h en algún momento? No puede registrar toda la información detallada como esta en un mensaje de confirmación. Y la búsqueda debería ser fácil, técnicamente. Entonces, ¿por qué estás desalentándolo? – Frank

+0

Además, ¿realmente puede confiar en que sus compañeros de trabajo siempre anoten exactamente todo lo que cambian en el mensaje de registro de confirmación? – Frank

3

Esto es similar al guión de shell de la respuesta de dehman pero está escrito en python. De esta forma, solo necesita Python para ejecutar el script y tal vez sea más amigable con los diferentes sistemas operativos.

import os 
import re 

filename = 'CustomROIMarker.cpp' 
stringToFind = 'ImageMarker::outOfDataSet;' 

log = os.popen('svn log ' + filename).read() 
versions = re.findall('r\d+',log) 
for v in versions: 
    numVer = int(v.strip('r')) 
    cmdString = 'svn cat -r ' + str(numVer) + ' ' + filename 
    contents = os.popen(cmdString).read() 
    if re.search(stringToFind,contents) != None: 
     print "Present in " + str(numVer) 
    else: 
     print "Not Present in " + str(numVer) 

Deberá editar el nombre de archivo y las variables stringToFind.

+0

Gracias por publicar esto. Puede usar sys.argv para obtener argumentos de línea de comando. –

Cuestiones relacionadas