2012-03-05 10 views
5

Por algunas razones oscuras (pero válidas) necesito averiguar si un archivo alguna vez se ha versionado en nuestro repositorio.¿Cómo puedo saber si un archivo ha existido alguna vez en un svn-repo?

Sólo he encontrado una manera indirecta de obtener el registro para el directorio que contiene y luego analizarlo para las entradas eliminadas:

svn log -v a/b/|grep " D .*a/b/c.xml" 

Funciona, pero se siente "sucio" y algo frágil.

+0

svn log -q -v | nombre de archivo grep | wc -l –

Respuesta

4

Según su pregunta, está implícitamente calificando su solicitud a archivos borrados (porque presumiblemente si no se elimina una simple búsqueda de directorio lo revelaría). El comentario de Lazy Badger es digno: eliminar la calificación sin perder precisión y, por lo tanto, simplificar el comando. Estoy totalmente a favor de la simplificación, pero dado cualquier problema, también me gustaría considerar sacar más provecho de una solución a un pequeño costo adicional.

Así que a partir de la solución propuesta:

svn log -v a/b/ | grep " D .*a/b/c.xml" 

quisiera en primer lugar añadir la opción -q, lo que reduce la producción que se acaba descartando todos modos:

svn log -v -q a/b/ | grep " D .*a/b/c.xml" 

Y entonces me gustaría para saber no solo si hubo un archivo eliminado, sino también cuando se eliminó (es decir, en qué revisión). Dado que también calificado implícitamente su entorno para Unix/Linux, aquí hay una solución con awk (adaptado de esta blog entry):

svn log -q -v a/b/ | awk ' 
    /^r[0-9]* \|/ { REVISION=$1; } 
    /D/ { print REVISION": "$0; } 
' | grep " D .*a/b/c.xml" 

que funciona debido al formato de la salida svn log cuando se utiliza el parámetro –v: se informa una revisión seguida de todos los archivos en esa revisión. He aquí un ejemplo que muestra que el archivo Page.cs fue borrado en la revisión 10506:

r10506 | msorens | 2011-02-14 12:58:56 -0800 (Mon, 14 Feb 2011) | 1 line 
Changed paths: 
    A /Projects/Test/Common 
    A /Projects/Test/Common/Setup.cs 
    A /Projects/Test/Common/Utility.cs 
    D /Projects/Test/Page.cs 

Los comandos awk más que la producción de análisis en este formato que extraen el número de revisión de la línea superior y luego los archivos marcados como eliminados (la “D " líneas). Para Windows, PowerShell proporciona la misma potencia y facilidad de uso como awk mediante el uso de la instrucción switch:

$(switch -Regex (svn log -q -v a/b) { 
    '^(r[0-9]*) \|' { $rev = $Matches[1] } 
    '^ D\s+(.*)' { "{0,-6} {1}" -f $rev, $Matches[1] } 
}) | Select-String "a/b/c.xml" 

Pero hay una manera más fácil con TortoiseSVN --- Sólo tiene que abrir la ventana de registro en la raíz de su trabajo copie y escriba el nombre del archivo en el cuadro de búsqueda. La lista de revisiones se filtra inmediatamente por lo que escribas. Si muestra más de una línea de salida, la última (más alta) revisión siempre será aquella en la que se eliminó el archivo.

0

Gracias a la respuesta @ Michael Sorens, tengo este trabajo

En mi caso necesitaba ver qué archivos donde retirado de una carpeta ./assets/gfx

Aquí está el código para la cáscara del golpe en una sola línea una vez que tenga la configuración de entrada, donde cada línea es una línea de comandos y 'mysearchstr' es un conjunto var en la cáscara

mysearchstr=assets/gfx/ 
svn log -v $mysearchstr | awk '/^r[0-9]* \|/ { REVISION=$1; }/D/ { print REVISION": "$0; }' | grep menu 

sólo quería compartir cómo he organizado esta solución.Es una repetición de la respuesta original ... pero quizás útil para alguien para el bloque de código conciso, fácil de copiar y reitera que la respuesta de la solución real (aunque alguien lo implemente) es correcta

Cuestiones relacionadas