search crear - ¿Cómo grep Git commit diffs o contenidos para una palabra determinada?




remota rama (8)

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

En un repositorio de código Git quiero enumerar todas las confirmaciones que contienen una palabra determinada. Probé esto

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

pero no necesariamente me devuelve el nombre del archivo (a menos que esté a menos de 5 líneas de la palabra que busqué. También probé

git grep "word"

Pero solo me da archivos presentes y no la historia.

¿Cómo busco 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 palabras para rastrear cambios (buscar en el historial de archivos).


git log encontrará confirmaciones con cambios que incluyen "word" con git log -Sword


Puedes 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 principal donde desea buscar.


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

$ git log --grep=word

Si desea buscar todas las confirmaciones donde se agregó o eliminó "palabra" en el contenido del archivo (para ser más exactos: donde se modificó el número de apariciones de "palabra"), es decir, busque en los contenidos de confirmación , use la llamada búsqueda 'pickaxe' con

$ git log -Sword

En git moderno también hay

$ git log -Gword

para buscar diferencias cuya línea agregada o eliminada coincida con "word" (también confirme el contenido ).

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 mediante el uso de --pickaxe-regex .

Para ilustrar la diferencia entre -S<regex> --pickaxe-regex y -G<regex> , considere una confirmación 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ó).


Si desea buscar datos confidenciales para eliminarlos de su historial de git (razón por la cual 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 intacto su último compromiso), ejecute:

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

Para reemplazar todo el texto listado en passwords.txt donde se pueda encontrar 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.


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

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

Tarda un poco en correr aunque ... ;-)


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

Uso :Ggrep para hacer eso. Para obtener 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 lo guiará a hacer todo eso.


Yo prefiero de esta manera.

git commit --amend -c <commit ID>

De lo contrario, habrá una nueva confirmación con un nuevo ID de confirmación.







git search grep