¿Hay alguna manera de excluir ciertas rutas / directorios / archivos al buscar en un repositorio git usando git grep
? ¿Algo similar a la --exclude
opción en el grep
comando normal ?
Necesito usarlo git grep
porque usarlo grep
directamente se ejecuta muy lentamente en grandes repositorios git.
Respuestas:
No es posible, pero se ha discutido recientemente . Solución alternativa propuesta en el enlace:
EDITAR solo ve la respuesta de nadie , ya que git 1.9.0 es posible.
fuente
En git 1.9.0 la "palabra mágica"
exclude
se agregó apathspec
s. Entonces, si desea buscarfoobar
en todos los archivos, excepto los que coinciden*.java
, puede hacer:O usando la
!
"forma corta" para excluir:Tenga en cuenta que en las versiones de git hasta v2.12, cuando se utiliza una exclusión
pathspec
, debe tener al menos un "inclusivo"pathspec
. En los ejemplos anteriores, este es el./*
(incluya recursivamente todo en el directorio actual). En git v2.13 esta restricción se levantó ygit grep foobar -- ':!*.java'
funciona sin el./*
.También puede usar algo como
:(top)
(forma corta:):/
para incluir todo desde la parte superior del repositorio. Pero es probable que también desee ajustar su exclusiónpathspec
para comenzar también desde arriba::/!*.java
(de lo contrario, solo excluiría*.java
archivos de su directorio actual).Hay una buena referencia para todas las "palabras mágicas" que puede contener un
pathspec
a git-scm.com (o sólogit help glossary
). Por alguna razón, los documentos en kernel.org están realmente desactualizados, aunque a menudo aparecen primero en las búsquedas de Google.fuente
git grep clock.gettime -- './*' ':!arch/**' ':!drivers/**'
para excluir múltiples directorios completos. Sin embargo, no creo que evite la recursión.git config alias.mygrep '!git grep "$@" -- "${GIT_PREFIX}/*" ":!*.java*" #'
. Entonces sologit mygrep foobar
. (Usando alias shell # trick y dir .git grep
ygit ls-files
de dos subdirectorios y los nombres de archivo de informes relativos al directorio actual (incluso cuando se utiliza la':(top)'
incluyo pathspec). Ambos comandos tienen la--full-name
opción de informar nombres relativos a la raíz, pero eso está desactivado de manera predeterminada.Actualización: para git> = 1.9 hay compatibilidad nativa para excluir patrones, consulte la respuesta de oneone .
Esto puede parecer al revés, pero puede pasar una lista de archivos que no coinciden con su patrón de exclusión para que le
git grep
guste esto:grep -v
devuelve cada ruta que no coincide<exclude-pattern>
. Tenga en cuenta quegit ls-files
también toma un--exclude
parámetro, pero que solo se aplica a los archivos no rastreados .fuente
Puede marcar archivos o directorios como binarios creando un archivo de atributos en su repositorio, p. Ej.
Las coincidencias en archivos binarios se enumeran sin la línea incluida, p. Ej.
fuente
Con el ejemplo de @kynan como base, hice este script y lo puse en mi camino (
~/bin/
) comogg
. Sí utiliza,git grep
pero evita algunos tipos de archivo especificados.En nuestro repositorio hay muchas imágenes, así que he excluido los archivos de imagen, y esto reduce el tiempo de búsqueda a 1/3 si busco en todo el repositorio. Pero el script podría modificarse fácilmente para excluir otros tipos de archivos o patrones gelerales.
Nota 1
De acuerdo con esto , debería ser posible nombrar la cosa
git-gg
y poder llamarla como un comando git regular como:Pero no puedo hacer que esto funcione. Creé el script en mi
~/bin/
e hice ungit-gg
enlace simbólico en/usr/lib/git-core/
.Nota 2
El comando no se puede convertir en un
sh
git-alias regular , ya que se invocará en la raíz del repositorio. ¡Y eso no es lo que quiero!fuente