2008-11-12 9 views

Respuesta

166

no hay comando integrado por él, así que por lo general sólo hacer 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 [email protected] 
     svn cat -r$r [email protected] 
     echo 

#  remaining revisions as differences to previous revision 
     while read r 
     do 
      echo 
      svn log -r$r [email protected] 
      svn diff -c$r [email protected] 
      echo 
     done 
    } 
} 

A continuación, se le puede llamar con:

history_of_file $1 
+32

Nunca antes había visto ese truco de "tubería en el bloque arriostrado". Ordenado. –

+5

[Versión de archivo por lotes] (http://stackoverflow.com/questions/5622367/generate-history-of-changes-on-a-file-in-svn/5721533#5721533) de este script, fwiw. – ladenedge

+0

Agregué esto a mi archivo .bashrc. Cuando inicio, obtengo 'svn: '.' no es una copia de trabajo svn: Error de sintaxis en el argumento de revisión '@HEAD' svn: Error de sintaxis en el argumento de revisión '@ HEAD'' – Francisc0

36

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

+22

Instalar git, crear un repositorio git, usar un comando git? La pregunta fue etiquetada y se le preguntó acerca de Subversion. –

+17

Uso git como cliente de Subversion con git-svn. Así es como haría la operación log + diff contra un repositorio de Subversion. Git tiene algunas herramientas realmente excelentes para ver el repositorio, no es una idea tan descabellada. –

+6

Por encima de alguien se le felicita (correctamente) por escribir un buen script: para proporcionar funciones que no están presentes en SVN. Al ver que el git es local a menos que presionas, puedes llamar a este herramental, no es necesario que te enojes por nada. –

3

Por lo que sé, no existe un comando svn incorporado para lograr esto. Debería escribir un script para ejecutar varios comandos para compilar todos los diffs. Un enfoque más simple sería usar un cliente svn GUI 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.

17

de inicio con

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

que le dará una lista de revisiones en las que cambia el archivo, que luego se puede utilizar para llamadas de guión repetido a svn diff.

+4

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.txt'' nice little one-liner (awk hace lo mismo que cortar) – Kasapo

128

ligeramente diferente de lo que usted describió , pero creo que esto podría ser lo que realmente necesita:

svn blame filename 

Imprimirá el archivo con cada línea pre fijado por el tiempo y autor del compromiso que lo cambió por última vez.

+4

Whoa esto es increíble! He estado usando SVN durante años y nunca supe esto: O –

+2

Puede que necesite la opción verbosa/-v para ver la marca de tiempo (lo hago con mi versión predeterminada de svn 1.7.9). –

+0

mi profesor escribió el plugin de culpa inicial a svn. Tenía que buscar esto todavía. Él se está autocompletando completamente en esta tarea. : P –

8

El comando extrañamente llamado "culpa" hace esto. Si usa Tortoise, le ofrece un cuadro de diálogo "a partir de la revisión", luego un listado de archivo con un indicador de línea por línea del número de revisión y el autor al lado.

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

+1

Eso es muy útil, pero no lo que el OP estaba buscando, 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. –

+0

Por el contrario, el nombre es bastante correcto. Te dice a quién culpar por un trozo de código en particular (chungo/error/incomprensible). –

+0

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

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 

He añadido -r al género. Eliminé las especificaciones manejo para 'primer registro'. Es 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 [email protected] 
      svn diff -c$r [email protected] 
      echo 
    done 
    } 
} 

history_of_file $1 
74

Si quieres ver la historia entera de un archivo con los cambios de código:

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

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

+1

Creo que svn 1.7.4 introdujo la opción '--diff' desde tiene pruebas para la opción, mientras que 1.7.3 no tiene ninguna - 'subversion/tests/cmdline/log_tests.py'. – valid

+0

Solo una pequeña nota: dependiendo de la duración del historial, esto puede llevar bastante tiempo antes de que el archivo log.txt se represente por completo (aunque se podrá leer de inmediato). –

Cuestiones relacionadas