¿Cómo puedo ver todos los cambios históricos en un archivo en SVN?


169

Sé que puedo svn diff -r a:b repo ver los cambios entre las dos revisiones especificadas. Lo que me gustaría es una diferencia para cada revisión que cambió el archivo. ¿Está disponible ese comando?


16
Está oculto en el extraño comando "culpar".
goosemanjack

66
Pensé que @goosemanjack estaba bromeando, hasta que lo intenté.
SSH Este

Respuestas:


181

No hay un comando incorporado para él, por lo que generalmente hago algo como esto:

#!/bin/bash

# history_of_file
#
# Outputs the full history of a given file as a sequence of
# logentry/diff pairs.  The first revision of the file is emitted as
# full text since there's not previous version to compare it to.

function history_of_file() {
    url=$1 # current url of file
    svn log -q $url | grep -E -e "^r[[:digit:]]+" -o | cut -c2- | sort -n | {

#       first revision as full text
        echo
        read r
        svn log -r$r $url@HEAD
        svn cat -r$r $url@HEAD
        echo

#       remaining revisions as differences to previous revision
        while read r
        do
            echo
            svn log -r$r $url@HEAD
            svn diff -c$r $url@HEAD
            echo
        done
    }
}

Luego, puede llamarlo con:

history_of_file $1

35
Nunca antes había visto ese truco de "conectar el bloque arriostrado". Ordenado.

55
Versión de archivo por lotes de este script, fwiw.
ladenedge

Agregué esto a mi archivo .bashrc. Cuando empiezo me sale svn: '.' is not a working copy svn: Syntax error in revision argument '@HEAD' svn: Syntax error in revision argument '@HEAD'
Francisc0

1
@ Francisco0: no incluya la línea final en su bashrc. no es parte de la definición de la función, es una llamada a la función porque el ejemplo dado está destinado a usarse como un script independiente.
bendin

26
svn log --diff [path_to_file]funciona exactamente así! stackoverflow.com/a/24938573/3185510
webster

143

Ligeramente diferente de lo que describiste, pero creo que esto podría ser lo que realmente necesitas:

svn blame filename

Imprimirá el archivo con cada línea prefijada por la hora y el autor de la confirmación que la cambió por última vez.


44
Whoa esto es genial! He estado usando SVN durante años y nunca supe de esto: O
Sí Barry

44
Es posible que necesite la opción detallada / -v para ver la marca de tiempo (lo hago con mi compilación predeterminada de svn 1.7.9).
Weston C

mi profesor escribió el complemento de culpa inicial a svn. Tenía que buscar esto todavía. Él está haciendo un autocompletar totalmente en esta tarea. : P
Joseph Dailey

93

Si desea ver el historial completo de un archivo con cambios de código:

svn log --diff [path_to_file] > log.txt

3
No sé cuándo se agregó la opción --diff, pero funciona con svn 1.8.10, por lo que no es necesario un script bash
Guillaume Gros

1
Creo que svn 1.7.4 introdujo la opción --diffya que tiene pruebas para la opción, mientras que 1.7.3 no tiene ninguna subversion/tests/cmdline/log_tests.py.
válido el

Solo una pequeña nota: dependiendo de la longitud del historial, esto puede tomar bastante tiempo antes de que el archivo log.txt se procese por completo (aunque será legible de inmediato).
Ivan Durst

1
¿Cómo se limita esto a las revisiones X más recientes?
Enigma

@Enigma: con la --limit <number>opción. Como así:svn log --diff --limit 5 [path_to_file]
Reid

37

Puede usar git-svnpara importar el repositorio en un repositorio Git, luego usar git log -p filename. Esto muestra cada entrada de registro para el archivo seguido de la diferencia correspondiente.


27
¿Instalar git, crear un repositorio git, usar un comando git? La pregunta fue etiquetada y se le preguntó sobre Subversion.
Ken Gentle

21
Uso git como cliente de Subversion con git-svn. Así es como haría la operación log + diff en un repositorio Subversion. Git tiene algunas herramientas realmente excelentes para la visualización del repositorio, no es una idea tan extravagante.
Greg Hewgill

10
Por encima de alguien se felicita (correctamente) por escribir un buen script, para proporcionar una funcionalidad que no está presente en SVN. Al ver que git es local a menos que presione, podría llamar a esta herramienta, no hay necesidad de enojarse por las cosas.
Adam Tolley

También es la única respuesta que le permite usar una GUI (de elección) para ver el historial del archivo. Las otras respuestas tampoco han explicado cómo limitar a las últimas X revisiones (¿es posible?), Lo cual es fácil en git. git log X..Y -o filename
TamaMcGlinn

21

Empezar con

svn log -q file | grep '^r' | cut -f1 -d' '

Eso le dará una lista de revisiones en las que cambió el archivo, que luego puede usar para realizar scripts de llamadas repetidas svn diff.


44
o ... sigue adelante! svn log -q some_file.xxx | grep ^r | awk '{print $1}' | sed -e 's/^r//' | xargs -i svn diff -rHEAD:{} some_file.xxx > ~/file_history.txtun pequeño y agradable
trazo

8

El comando "culpar" curiosamente llamado hace esto. Si usa Tortoise, aparece un cuadro de diálogo "desde la revisión", luego una lista de archivos con un indicador línea por línea del número de revisión y el autor al lado.

Si hace clic con el botón derecho en la información de revisión, puede abrir un cuadro de diálogo "Mostrar registro" que proporciona información completa sobre el registro, junto con otros archivos que formaron parte del registro.


1
Eso es muy útil, pero no es lo que estaba buscando el OP, que es un historial completo del archivo, no solo las contribuciones históricas del archivo actual. Ese historial completo es útil cuando se mira hacia atrás para descubrir por qué se eliminó o cambió cierto código, y cuándo.
Adam Tolley

Por el contrario, el nombre es bastante correcto. Le dice a quién culpar por un fragmento de código particular (malo / con errores / incomprensible).
ivan_pozdeev

¿No sería bueno si el nombre obvio del comando fuera "crédito" en lugar de "culpa"? :)
Nick

1
El elogio de @Nick svn es un alias para culpar a svn, dependiendo de cómo se sienta uno.
stefgosselin

@stefgosselin - Gracias por esa nota. ¡Me alegra saber que hay una opción! :)
Nick

3

Hasta donde sé, no hay un comando svn integrado para lograr esto. Debería escribir un script para ejecutar varios comandos para construir todos los diffs. Un enfoque más simple sería usar un cliente de interfaz gráfica de usuario si esa es una opción. Muchos de ellos, como el complemento subversivo para Eclipse, enumerarán el historial de un archivo y le permitirán ver la diferencia de cada revisión.


3

Gracias Bendin. Me gusta mucho tu solución.

Lo cambié para que funcione en orden inverso, mostrando primero los cambios más recientes. Lo cual es importante con el código de larga data, mantenido durante varios años. Por lo general, lo canalizo en más.

svnhistory elements.py |more

Agregué -r al género. Eliminé las especificaciones. manejo para 'primer registro'. Es un error en la última entrada, ya que no hay nada con lo que diferir. Aunque estoy viviendo con eso porque nunca llego tan lejos.

#!/bin/bash                                                                    

# history_of_file                                                              
#                                                                              
# Bendin on Stack Overflow: http://stackoverflow.com/questions/282802          
#   Outputs the full history of a given file as a sequence of                  
#   logentry/diff pairs.  The first revision of the file is emitted as         
#   full text since there's not previous version to compare it to.             
#                                                                              
# Dlink                                                                        
#   Made to work in reverse order                                              

function history_of_file() {
    url=$1 # current url of file                                               
    svn log -q $url | grep -E -e "^r[[:digit:]]+" -o | cut -c2- | sort -nr | {
        while read r
    do
            echo
            svn log -r$r $url@HEAD
            svn diff -c$r $url@HEAD
            echo
    done
    }
}

history_of_file $1

0

He visto un montón de respuestas parciales mientras investigaba este tema. Esto es lo que funcionó para mí y espero que ayude a otros. Este comando mostrará la salida en la línea de comando, mostrando el número de revisión, el autor, la marca de tiempo de revisión y los cambios realizados:

svn blame -v <filename>

Para facilitar su búsqueda, puede escribir el resultado en un archivo y grep para lo que está buscando.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.