Git buscar cadena en el historial de un solo archivo


173

Entonces, si tengo un archivo llamado foo.rb y me está dando un error por un método faltante llamado bar , entonces quiero buscar en el historial de foo.rb la cadena barpara ver si alguna vez se definió en el pasado.

Encontré esto ¿ Buscar en todo el historial de Git una cadena?

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


66
Al igual que para su información, puede agregar -- filenameun montón de comandos git si desea limitarlo a un archivo.
Karl Bielefeldt

Respuestas:


235

Para este propósito, puede usar la opción -S para git log:

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

39
O git log -G'bar' -- foo.rbpara buscar diferencias que contengan 'barra' en lugar de confirmaciones que cambiaron el número de ocurrencias de 'barra' (consulte la página de manual de git-log).
Jakub Narębski

1
No me funcionó con las comillas, tuve que usarlo -Sbarpara buscar la barra . Tal vez tenga algo que ver conmigo usando la línea de comandos de Windows.
zbr

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

17

O tal vez puedes probar este (de preguntas relacionadas Buscar en todo el historial de git por cadena )

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 enviará mensajes / parches para cualquier ocurrencia de la barra.


Para Windows: for /F %i in ('git rev-list --all foo.rb') git grep -F bar %i foo.rb(busque comillas dobles si el nombre de archivo o la frase de búsqueda tienen espacios)
biscuit314

1
Para mí en Windows no funcionó sin "hacer": for /F %i in ('git rev-list --all foo.rb') do git grep -F bar %i foo.rb (busque comillas dobles si el nombre de archivo o la frase de búsqueda tienen espacios)
xberger

2

Hay una anulación para el comando git log (del manual ):

$ git log Makefile      # commits that modify Makefile

Entonces podrías usar:

git log foo.rb | grep "bar"

2
Gracias, pero esto solo busca el historial de confirmación, no el historial de la fuente del archivo.
JD Isaacks

2
En realidad, hay otra anulación que busca el cambio de datos de cadena: git log -S'foo () '# commits que agregan o eliminan cualquier dato de archivo que coincida con la cadena' foo () '
Dmitry Reznik

1
También puede intentar usar el parámetro --full-diff. Los registros no solo muestran el historial de confirmaciones, sino también las diferencias.
Dmitry Reznik

@DmitriyReznik: aparentemente --full-diffno funciona (como en, no se muestra ninguna diferencia) sin -p, al menos en git 1.7.9.5
sdaau

0

Usé lo git log -S "string" --follow -p "path of file"que muestra el historial completo de todos los cambios con esa cadena.

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.