'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.
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) –
@Pekka I No encontré ninguna solución aplicable aquí. Los problemas pueden parecerse, pero no son duplicados. –
@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? –