2012-04-18 22 views
91

Así que si tengo un archivo llamado foo.rb y es que me da un error de que falta un método llamado barra de, así que quiero buscar la historia de foo .rb para la cadena bar para ver si alguna vez se definió en el pasado.búsqueda de Git para cadena en una sola historia archivos

yo encontramos este Search all of Git history for a string?

Pero esto busca todos los archivos. Solo quiero buscar en un archivo.

+4

Al igual que un FYI, puede agregar '- filename" a un grupo de comandos git si desea limitarlo a un archivo. –

Respuesta

134

Para ello se puede utilizar la opción -S para git log:

git log -S'bar' -- foo.rb 
+20

O 'git log -G'bar '- foo.rb' para buscar diff que contenga 'bar' en lugar de commits que cambiaron el número de ocurrencias de 'bar' (ver la página de manual de git-log). –

+0

No funcionó para mí con las comillas, tuve que usar '-Sbar' para buscar _bar_. Tal vez tiene algo que ver conmigo usando la línea de comandos de Windows. – zbr

+0

en otras palabras, '-G' es para una búsqueda de expresiones regulares ... esta es una gran referencia, también: https://stackoverflow.com/a/4472267/2586761 – ptim

1

Hay un reemplazo para el comando git log (de manual):

$ git log Makefile  # commits that modify Makefile 

lo que podría utilizar:

git log foo.rb | grep "bar" 
+2

Gracias, pero esto solo busca el historial de confirmaciones, no el historial de la fuente del archivo. –

+2

En realidad, hay otra modificación que busca el cambio de datos de cadena: git log -S'foo() '# commits que agrega o elimina cualquier dato de archivo que coincida con la cadena' foo() ' –

+1

También podría intentar usar el parámetro --full-diff . Los registros no solo muestran el historial de confirmaciones, sino también los diffs. –

10

O tal vez puede probar este (de las preguntas relacionadas Search all of git history for string)

git rev-list --all foo.rb | (
    while read revision; do 
     git grep -F 'bar' $revision foo.rb 
    done 
) 

En realidad, buscará el contenido del archivo y no cometer los mensajes/parches para cualquier ocurrencia de la barra.

Cuestiones relacionadas