2010-08-09 16 views
6

'svn log' muestra el registro de: 1) archivos cuyo contenido ha cambiado Y/O 2) archivos cuyas propiedades han cambiado.¿Cómo hacer que 'svn log' ignore los cambios de propiedad?

¿Hay alguna manera de mostrar solo los archivos para los que se aplica el caso 1?

+0

posible duplicado de [¿Hay un filtro de exclusión de metadatos para el comando SVN DIFF?] (Http://stackoverflow.com/questions/402522/is-there-a-metadata-exclusion-filter-for-the-svn -diff-command) –

+0

@Pekka I No encontré ninguna solución aplicable aquí. Los problemas pueden parecerse, pero no son duplicados. –

+0

@zr Lo siento. Pasé por alto el aspecto diff de la otra pregunta. Sin embargo, ¿la simple construcción grep introducida allí no va en la dirección correcta? –

Respuesta

4

'svn log' muestra el registro de: 1) Archivos cuyo contenido ha cambiado y/o 2) archivos cuyas propiedades han cambiado.

Como sabe, la salida de svn log está organizada por mensajes de registro de compromiso en lugar de por archivos. Si usa el modo detallado (-v), mostrará los archivos ("rutas") asociados con cada entrada de registro. Sin embargo, algunas de esas rutas pueden estar fuera del objetivo solicitado (predeterminado: su directorio actual). ¿Desea que los resultados también incluyan esas rutas externas? Supongo que tomando su pregunta al pie de la letra, solo está pidiendo el filtrado, entonces sí querría esas rutas externas si representan un cambio de contenido en los archivos.

Aquí hay una solución. Puede ser lento, pero lo probé y funciona en cygwin en Windows 7. (¡No olvide, asegúrese de que sus scripts tengan terminaciones de línea unixy! Con dos2unix si es necesario)

Es realmente solo una línea larga, a excepción de una secuencia de comandos sed externa (la que un hacker de verdad podría poner en la línea de comandos, pero la vida es corta para ser jugar con línea de comandos escape):

#!/bin/sh 

# These paths are set up for cygwin 
SED=/bin/sed 
SORT=/bin/sort 
UNIQ=/bin/uniq 
XARGS=/bin/xargs 
GREP=/bin/grep 
SVN=svn 

# Add desired log options here 
LOG_OPTIONS=-v 
SINCE_REV=10800 
SED_SCRIPT=/cygdrive/c/temp/get-paths.sed 
# Make sure you edit the sed script referenced above 
# to set the base URL of your repository. 

# 1) generate the list of log messages, including affected paths (svn log -v) 
# 2) process out those paths (sed) 
# 3) eliminate duplicates (sort | uniq) 
# 4) get the change history for each of those paths (svn diff) 
# 5) filter out the ones that involve only property changes (sed) 
# 6) eliminate duplicates again (sort | uniq) 
$SVN log $LOG_OPTIONS | $SED -n -f $SED_SCRIPT | $SORT | $UNIQ \ 
| $XARGS -n20 -I PATHS $SVN diff -r $SINCE_REV --summarize PATHS 2> error.log \ 
| $SED -n 's/^[^ ].... *//p' | $SORT | $UNIQ 

Aquí está la secuencia de comandos sed externa. Asegúrese de cambiar la URL base del repositorio svn a la URL base correcta para su repositorio. Es decir. la parte inicial de la URL svn que svn log -v no genera.

# sed script to output all lines between 
# /^Changed paths:$/ and /^$/, exclusive. 
# Also removes first 5 columns (status) and replaces them with svn repository base url. 

/^Changed paths:$/,/^$/ { 
    /^Changed paths:$/b 
    /^$/b 
    s|^.....|https://svn.myrepo.org/prefix| 
    s/ (from .*)$// 
    p 
} 

será la salida algunos mensajes de error a error.log, principalmente "ruta no encontrada" El guión, que creo que es para archivos que utilizan para estar presente en el repositorio, pero se han movido (renombrada) o eliminados.

¿Cumple con estos requisitos?

Gracias a Michael Augustin en this page para obtener ideas sobre cómo agregar la salida de svn diff para eliminar cambios solo de propiedad.

P.S. This other page parece hacer la misma pregunta, pero no hay una respuesta completa allí.

P.P.S. Edité el script bash anterior para agregar un | sort | uniq extra al final de la canalización, ya que he visto duplicados que salen. Aunque no veo por qué ocurrirían.

+0

P.S. Soy nuevo en SO, y estoy interesado en la recompensa, por lo que si crees que esto responde a tu pregunta, por favor haz un seguimiento. Y si alguien más piensa que responde bien a la pregunta, vota por ello ... en las próximas horas. :-) – LarsH

+0

+1! @LarsH: esa es una de las cosas desagradables de SO: el sistema de recompensas. La idea es buena, y muchos se han quejado de la función de descarte automático, pero todavía está allí. A menudo he visto mis respuestas ignoradas o comprobadas como respuestas después de que el período de recompensa había terminado. Y vea, también aquí, los votos por adelantado llegan demasiado tarde para que se gane la recompensa ... (PD: vea algunas discusiones en meta.stackoverflow.com) – Abel

+0

@Abel, Sí ... Pasé un poco de tiempo en eso y publicado varias horas antes de la fecha límite. Además, @zr estaba en línea. Pero probablemente ocupado con otra pregunta. Así que gracias por votarlo. Ahora estoy a un umbral razonable para la reputación, por lo que perder la recompensa no es tan crítico. – LarsH

2

no se parece a ella: SVN log in the Subversion manual

Tal filtrarlos después, por ejemplo, usando un script de shell? ¿En qué sistema estás?

+0

Sí. Creo que esto requiere escribir algo de script de postprocesamiento. Esperaba que alguien estuviera dispuesto a compartir una solución existente, en lugar de tener que reinventar la rueda. –

+0

@zr que es extremadamente difícil de hacer cuando ni siquiera revela el sistema operativo en el que necesita que esto funcione. Debe agregar esa información. –

+0

Uso tanto Windows como Linux. En Windows tengo Cygwin integrado en mi caparazón, por lo que una solución de estilo Unix debería funcionar en ambas plataformas. –

1

Incluso antes de buscar, llegué a la conclusión de que esto requeriría tomar cada revisión en el registro y pasarla a `svn diff 'para ver exactamente qué cambió en la revisión. Luego encontré esta otra pregunta: how to detect modified properties using SVN log

Hay svnlog.py que incluye opciones de filtrado para autores y rutas, pero no incluye ninguna integración de diferencias. Es posible que puedas hackear eso.

Espero que esto ayude.

Gracias,
Zachary

0

Aquí está una manera de mostrar los registros de cambios en los archivos reales solamente, haciendo caso omiso de los cambios de propiedad:

#!/bin/sh 

for i in $(svn log --xml --with-no-revprops | xml sel -t -m "/log/logentry" -v "@revision" -o " "); do 
    j=$(svn diff -c $i --summarize | grep -v "^ ") 
    if [ -n "$j" ]; then 
     svn log -c $i 
    fi 
done 

Lo anterior requiere xmlstarlet para ser instalado.

1

Al igual que usted, me sorprendió que no se pudiera decir a 'svn log' que solo enumerara las revisiones en las que el contenido de un archivo había cambiado.

Cada una de las otras sugerencias requirió algo que no tenía instalado, así que creé una versión que funciona bien para mis necesidades (consultar sobre un solo archivo) y que requiere solo sh + awk. Ponga lo siguiente en "svn-log-contents.sh":

#!/bin/sh 

while [ ! -z "$1" ]; do 
    file="$1" 
    base=`basename "$file"` 
    echo "$base ($file)" 
    shift 
    svn log -v $file | \ 
     awk "/^r([1-9]+)/ { r=\$1 } /^ *[MAD] .*$base$/ { \ 
      system(\"svn log -l 1 -r \" r \" $file\") }" 
done 

hacerlo ejecutable utilizando 'chmod a + x svn-log-contents.sh', y luego suministrar el nombre del archivo (s) en el mandato line:

./svn-log-contents.sh file.txt 

La primera expresión regular (/^r [1-9] /) agarra cada número de revisión en un r variable. La siguiente expresión regular ('/^* [MAD] ... /') se activa solo cuando el archivo ha sido modificado de manera significativa, en cuyo momento se ejecutará 'svn log' en esa única revisión. Soy un novato de awk, así que las sugerencias son bienvenidas.

Cuestiones relacionadas