svn - subir - ¿Cómo busco todas las revisiones de un archivo en un repositorio de SubVersion?
tortoise svn server (7)
Me gustaría grep
todas las revisiones de un archivo de una cadena. por ejemplo, para encontrar cuándo se agregó o eliminó una función.
¿Hay una manera "simple" de hacer esto? (es decir, una sola línea de comandos bash
sería agradable.) Hacer una búsqueda binaria manual revisando revisiones y pruebas individualmente parece demasiado tedioso y propenso a errores.
Si fui lo suficientemente inteligente como para comprometer el cambio con una descripción útil, entonces puedo grep
el registro con algo como:
svn log myfile.c | grep my_func
Sin embargo, esto no proporciona un número de revisión, así que sospecho que hay una mejor manera de hacerlo también.
Con un servidor Subversion 1.6 y su mod_dav_svn
, puede especificar el número de revisión a través de un parámetro GET:
http://host/repos/path?r=20
De modo que puede wget
fácilmente sus archivos en todas las revisiones y luego diff
.
Fuente: SVN 1.6 changelog
El comando "anotar / culpar" no hace exactamente lo que quiere, pero podría ayudar:
svn culpa - Mostrar información de autor y revisión en línea para los archivos o URL especificados.
$ svn blame http://svn.red-bean.com/repos/test/readme.txt
3 sally This is a README file.
5 harry You should read this.
Entonces, debería poder averiguar quién agregó una función. En cuanto a averiguar quién borró una función, no tengo idea.
Escribí un guión para hacerlo
Uso típico:
perl searchrev.pl Import.php setImportStatus
----------------------------------------------------------------------
r19565 | johnf | 2009-06-24 14:33:00 +0100 (Wed, 24 Jun 2009) | 1 line
----------------------------------------------------------------------
line 60 $this->setImportStatus($entity_id, $entity_attr_id);
---------------------------------------------------------------------
r13722 | john | 2008-03-10 17:06:14 +0000 (Mon, 10 Mar 2008) | 1 line
---------------------------------------------------------------------
line 70 $this->setImportStatus($entity_id, $entity_attr_id);
---------------------------------------------------------------------
r11692 | paul | 2007-05-23 10:55:45 +0100 (Wed, 23 May 2007) | 1 line
---------------------------------------------------------------------
Not found
---------------------------------------------------------------------
r11691 | paul | 2007-05-23 10:36:26 +0100 (Wed, 23 May 2007) | 1 line
---------------------------------------------------------------------
Not found
---------------------------------------------------------------------
r11683 | paul | 2007-05-23 09:04:29 +0100 (Wed, 23 May 2007) | 1 line
---------------------------------------------------------------------
Not found
Aquí está el guión, fácil de hackear para sus propios fines
#!/usr/bin/perl -w
my $file=$ARGV[0];
my $pattern=$ARGV[1];
my @history=`svn log $file`;
foreach (@history)
{
chomp;
if (m/^r(/d+)/)
{
my $revision=$1;
my $sep=''-'' x length($_);
print "$sep/n$_/n$sep/n";
my @code=`svn cat -r $revision $file`;
my $lineno=0;
my $found=0;
foreach my $line (@code)
{
$lineno++;
if ($line=~m/$pattern/)
{
$line=~s/^/s+//;
print "line $lineno $line";
$found=1;
}
}
print "Not found/n" unless ($found);
}
}
Este es un comando para buscar revisiones de un archivo que contiene una cadena:
svn log -l 30 -q FILENAME | grep ^r | cut -d '' '' -f 1 | while read rev; do
svn cat -$rev FILENAME | grep -c PATTERN && svn info FILENAME@$rev
done
Hasta donde sé, eso no es fácilmente posible. Escribía un pequeño script que recuperaba cada conjunto de cambios para el archivo en cuestión y luego grep a través del diff para la cadena. Entonces es tan simple como imprimir el número de revisión actual :)
Lo primero que quieres hacer será difícil. Normalmente sugeriría usar svn diff o svn cat, pero no hay (hasta donde yo sé) ninguna forma de obtener el número de revisión en línea con la salida del código.
En la segunda pregunta, si está buscando un usuario específico, puede usar
svn log | grep -A 2 username
que le dará dos líneas adicionales después de cada línea coincidente (-A = "después"). Si no tiene mensajes de registro muy largos, puede usar
svn log | grep -B 2 search_string
que de manera similar imprimirá dos líneas antes (-B) cada línea coincidente. (Lo cual debería ser suficiente para darle el número de revisión.) Estoy absolutamente seguro de que hay una manera mejor con AWK de darle los números de revisión en línea con los mensajes de registro, pero estoy cansado y no puedo pensar de eso ahora mismo :RE
Puede usar las pySVN + the python diff para hacer esto, mientras que no es bash, tal vez valga la pena considerarlo si usa esta función de forma más regular. Es una versión de la solución wget pero tendría una interfaz más agradable, bueno si la compila :)