trabajar - que es un repositorio git
¿Cómo grep Git commit diffs o contenidos para una palabra determinada? (8)
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).
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 ... ;-)
Para usar el conector booleano en expresiones regulares:
git log --grep ''[0-9]*/|[a-z]*''
Esta búsqueda de expresiones regulares para expresiones regulares [0-9] * o [az] * en mensajes de confirmación.
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 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.
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, ®match, 0); ... - hit = !regexec(regexp, mf2.ptr, 1, ®match, 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ó).
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 @/#ü !"
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.
git log
encontrará confirmaciones con cambios que incluyen "word" con git log -Sword