¿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?
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
}
}
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.
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:
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.
¿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.
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.
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.
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
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.
Respuestas:
No hay un comando incorporado para él, por lo que generalmente hago algo como esto:
Luego, puede llamarlo con:
fuente
svn: '.' is not a working copy svn: Syntax error in revision argument '@HEAD' svn: Syntax error in revision argument '@HEAD'
svn log --diff [path_to_file]
funciona exactamente así! stackoverflow.com/a/24938573/3185510Ligeramente diferente de lo que describiste, pero creo que esto podría ser lo que realmente necesitas:
Imprimirá el archivo con cada línea prefijada por la hora y el autor de la confirmación que la cambió por última vez.
fuente
Si desea ver el historial completo de un archivo con cambios de código:
fuente
--diff
ya que tiene pruebas para la opción, mientras que 1.7.3 no tiene ningunasubversion/tests/cmdline/log_tests.py
.--limit <number>
opción. Como así:svn log --diff --limit 5 [path_to_file]
Puede usar
git-svn
para importar el repositorio en un repositorio Git, luego usargit log -p filename
. Esto muestra cada entrada de registro para el archivo seguido de la diferencia correspondiente.fuente
git log X..Y -o filename
Empezar con
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
.fuente
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.txt
un pequeño y agradableEl 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.
fuente
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.
fuente
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.
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.
fuente
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:
Para facilitar su búsqueda, puede escribir el resultado en un archivo y grep para lo que está buscando.
fuente