Cómo grep Git commit diffs o contenidos para una palabra determinada?


En un repositorio de código Git quiero listar todas las confirmaciones que contienen una palabra determinada. He intentado esto

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

Pero no necesariamente me devuelve el nombre del archivo (a menos que sea menos que 5 líneas alejadas de la palabra que busqué. También intenté

git grep "word"

Pero me da solo los archivos presentes y no el historial.

¿Cómo puedo buscar en todo el historial para poder seguir los cambios en una palabra en particular? Me refiero a buscar en mi base de código las ocurrencias de word para rastrear los cambios (buscar en el historial de archivos).

Author: Jesper Rønn-Jensen, 2009-08-27

8 answers

Si desea encontrar todas las confirmaciones donde mensaje de confirmación contiene la palabra dada, use

$ git log --grep=word

Si desea encontrar todas las confirmaciones donde se agregó o eliminó" word " en el contenido del archivo (para ser más exacto: donde se cambió el número de ocurrencias de "word"), es decir, busque en el contenido de la confirmación , use la llamada búsqueda 'pickaxe' con

$ git log -Sword

En git moderno también hay{[14]]}

$ git log -Gword

Para buscar diferencias cuya línea añadida o eliminada coincide con "word" (también commit contents).

Tenga en cuenta que -G por defecto acepta una expresión regular, mientras que -S acepta una cadena, pero se puede modificar para aceptar expresiones regulares usando --pickaxe-regex.

Para ilustrar la diferencia entre -S<regex> --pickaxe-regex y -G<regex>, considere un commit con la siguiente diferencia en el mismo archivo:

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

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

 724
Author: Jakub Narębski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-16 21:45:13

git log's pickaxe encontrará confirmaciones con cambios incluyendo "palabra" con git log -Sword

 241
Author: u0b34a0f6ae,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-10 11:51:35

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 una, con colores que muestran palabras agregadas y eliminadas.

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

Lleva un tiempo correr... ;-)

 11
Author: CharlesW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-04 16:12:44

Una forma/sintaxis más para hacerlo es: git log -S "word"
Así puedes buscar por ejemplo git log -S "with whitespaces and stuff @/#ü !"

 7
Author: 1u-,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-11 23:03:57

Puede probar el siguiente comando:

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

O usando grep de la siguiente manera:

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

Ejecute este comando en el directorio padre donde desea buscar.

 6
Author: kenorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-17 09:53:44

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

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

Esta expresión regular busca la expresión regular [0-9]* o [a-z]* en los mensajes de confirmación.

 3
Author: Reudismam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-30 20:18:11

Vim-fugitive es versátil para ese tipo de examen en Vim.

Usa :Ggrep para hacer eso. Para más información puede instalar vim-fugitive y buscar el turorial por :help Grep. Y este episodio: exploring-the-history-of-a-git-repository te guiará para hacer todo eso.

 2
Author: lerner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-09 06:49:20

Si quieres buscar datos confidenciales para eliminarlos de tu historial de git (que es la razón por la que aterricé aquí), hay herramientas para eso. Github como una página de ayuda dedicada para ese problema.

Aquí está la esencia del artículo:

El BFG Repo-Cleaner es una alternativa más rápida y sencilla a git filter-branch para eliminar datos no deseados. Por ejemplo, para eliminar su archivo con datos confidenciales y dejar intacta su última confirmación), ejecutar:

bfg --delete-files YOUR-FILE-WITH-SENSITIVE-DATA

Para reemplazar todo el texto listado en contraseñas.txt donde sea que se encuentre en el historial de su repositorio, ejecute:

bfg --replace-text passwords.txt

Consulte la documentación de BFG Repo-Cleaner para obtener instrucciones completas de uso y descarga.

 0
Author: edelans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-27 20:33:36