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.

JD Isaacks
fuente
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
ralphtheninja
fuente
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.

Antoine Pelisse
fuente
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"
Dmitry Reznik
fuente
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.

apilar preguntas
fuente