2009-08-26 17 views
457

En un repositorio de código Git, quiero enumerar todas las confirmaciones que contienen una determinada palabra. He intentado esto¿Cómo grep Git commit diffs o contenidos para una palabra determinada?

git log -p | grep --context=4 "word" 

pero no necesariamente me devuelva el nombre del archivo (a menos que sea menos de 5 líneas lejos de la palabra que buscaba. También probé

git grep "word" 

pero me da solo presentar archivos y no el historial

¿Cómo busco todo el historial para poder seguir los cambios en una palabra en particular? Quiero buscar en mi base de código las apariciones de palabra para rastrear cambios (buscar en el historial de archivos).

pico

Respuesta

659

Si usted quiere encontrar todas las confirmaciones cuando mensaje de confirmación contiene la palabra dada, utilice

$ git log --grep=word 

Si desea para encontrar todas las confirmaciones donde se agregó o eliminó "palabra" en el contenido del archivo (para ser más exactos: donde ha cambiado el número de ocurrencias de "palabra"), es decir, buscar el contenido de confirmación , utilice el llamado 'Pico' de búsqueda con

$ git log -Sword 

En git moderna también hay

$ git log -Gword 

para buscar diferencias cuyo agregado o eliminado la línea coincide con la "palabra" (también cometer contenidos).

Tenga en cuenta que -G acepta de manera predeterminada una expresión regular, mientras que -S acepta una cadena, pero se puede modificar para aceptar expresiones regulares mediante el --pickaxe-regex.

Para ilustrar la diferencia entre -S<regex> --pickaxe-regex y -G<regex>, considere una confirmación con la siguiente diff en el mismo archivo:

+ return !regexec(regexp, two->ptr, 1, &regmatch, 0); 
... 
- hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0); 

Mientras git log -G"regexec\(regexp" mostrará esta confirmación, git log -S"regexec\(regexp" --pickaxe-regex no (porque el número de ocurrencias de esa cuerda no cambió).

+5

'git log -S word' también funciona para el segundo caso –

+0

* -S * y * -G * en' man git log' no está claro. Tuve que leer y experimentar tres veces para captar la diferencia. –

+3

@TankorSmash '-S ' Busque las diferencias que introducen o eliminan una instancia de . '-G ' Busque las diferencias cuya línea añadida o eliminada coincide con el dado. –

239

git log 's encontrará las confirmaciones con los cambios incluidos 'palabra' con git log -Sword

+55

Esto no es del todo exacto. -S Busque las diferencias que introducen o eliminan una instancia de . ** Tenga en cuenta que esto es diferente a la cadena que simplemente aparece en la salida diff; ** – mayu

+4

Si bien esta es generalmente la respuesta correcta, bajé la votación solo para alentar a otros a leer esta respuesta (http://stackoverflow.com/a/1340245/ 586983) que tiene 3 formas diferentes y explica sus sutilezas. – jakeonrails

+9

¡Dios mío! No creo que sea una buena razón para rechazar una respuesta correcta ... ¿no tenías confianza, incluyendo el enlace en un comentario sería suficiente aliento? – Deborah

3

Para usar el conector booleano en la expresión regular:

git log --grep '[0-9]*\|[a-z]*' 

Esta búsqueda de expresiones regulares para la expresión regular [0-9] * o [a-z] * en los mensajes de confirmación.

6

una forma más/sintaxis para hacerlo es: git log -S "word"
como no se puede buscar por ejemplo git log -S "with whitespaces and stuff @/#ü !"

9

Después de mucha experimentación, puedo recomendar lo siguiente, que muestra confirmaciones que introducen o eliminan líneas que contienen una expresión regular dada, y muestra los cambios de texto en cada uno, con colores que muestran palabras añadidas y eliminadas.

git log --pickaxe-regex -p --color-words -S "<regexp to search for>" 

toma un tiempo para correr, aunque ... ;-)

6

Puede probar el siguiente comando:

git log --patch --color=always | less +/searching_string 

o el uso de grep de la siguiente manera:

git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string' 

Ejecute este comando en el directorio principal donde le gustaría buscar.

+2

Me gusta este método porque las confirmaciones que estoy mirando tienen cientos de líneas de cambios que no tienen, y estoy interesado sólo en los parches reales que implican la palabra que estoy buscando. Para obtener el uso del color, 'git log --patch --color = always | menos +/search_string'. –