Existe-t-il un moyen d'exclure certains chemins / répertoires / fichiers lors de la recherche d'un référentiel git à l'aide de git grep
? Quelque chose de similaire à l' --exclude
option de la grep
commande normale ?
J'ai besoin d'utiliser git grep
parce que l'utilisation grep
directe s'exécute trop lentement sur les grands dépôts git.
Réponses:
Ce n'est pas possible, mais cela a été discuté récemment . Solution de contournement proposée dans le lien:
EDIT ne voyez que la réponse , puisque git 1.9.0 c'est possible.
la source
Dans git 1.9.0, le "mot magique" a
exclude
été ajouté àpathspec
s. Donc, si vous voulez rechercherfoobar
dans tous les fichiers à l'exception de ceux qui correspondent,*.java
vous pouvez faire:Ou en utilisant la
!
"forme courte" pour exclure:Notez que dans les versions git jusqu'à la v2.12, lorsque vous utilisez une exclusion
pathspec
, vous devez avoir au moins un "inclusif"pathspec
. Dans les exemples ci-dessus, il s'agit du./*
(inclure récursivement tout sous le répertoire courant). Dans git v2.13, cette restriction a été levée etgit grep foobar -- ':!*.java'
fonctionne sans l' extension./*
.Vous pouvez également utiliser quelque chose comme
:(top)
(forme courte:):/
pour tout inclure depuis le haut du dépôt. Mais alors vous voudrez probablement également ajuster votre exclusionpathspec
pour qu'elle commence également par le haut::/!*.java
(sinon, cela n'exclurait que les*.java
fichiers de votre répertoire actuel).Il existe une bonne référence pour tous les «mots magiques» autorisés dans un
pathspec
at git-scm.com (ou justegit help glossary
). Pour une raison quelconque, les documents sur kernel.org sont vraiment obsolètes même s'ils apparaissent souvent en premier dans les recherches Google.la source
git grep clock.gettime -- './*' ':!arch/**' ':!drivers/**'
pour exclure plusieurs répertoires entiers. Je ne pense pas que cela empêche la récursivité.git config alias.mygrep '!git grep "$@" -- "${GIT_PREFIX}/*" ":!*.java*" #'
. Alors justegit mygrep foobar
. (Utilisation de l'alias shell # trick et current dir .)git grep
etgit ls-files
des sous-répertoires et les deux rapportent les noms de fichiers par rapport au répertoire actuel (même lorsque vous utilisez le':(top)'
chemin include). Les deux commandes ont la--full-name
possibilité de rapporter les noms relatifs à la racine, mais c'est désactivé par défaut.Mise à jour: pour git> = 1.9, il existe un support natif pour les modèles d'exclusion, voir la réponse d'une seule .
Cela peut sembler à l'envers, mais vous pouvez passer une liste de fichiers ne correspondant pas à votre modèle d'exclusion pour
git grep
aimer ceci:grep -v
renvoie tous les chemins qui ne correspondent pas<exclude-pattern>
. Notez quegit ls-files
prend également un--exclude
paramètre, mais qui n'est appliqué qu'aux fichiers non suivis .la source
Vous pouvez marquer des fichiers ou des répertoires comme binaires en créant un fichier d'attributs dans votre référentiel, par exemple
Les correspondances dans les fichiers binaires sont listées sans la ligne d'inclusion, par exemple
la source
Avec l'exemple de @kynan comme base, j'ai créé ce script et l'ai mis dans mon chemin (
~/bin/
) sous la formegg
. Il utilisegit grep
mais évite certains types de fichiers spécifiés.Dans notre repo, il y a beaucoup d'images, j'ai donc exclu les fichiers image, ce qui réduit le temps de recherche à 1/3 si je recherche tout le repo. Mais le script pourrait facilement être modifié pour exclure d'autres types de fichiers ou modèles de gel.
Note 1
Selon cela, il devrait être possible de nommer l'objet
git-gg
et de pouvoir l'appeler comme une commande git régulière comme:Mais je ne peux pas faire fonctionner cela. J'ai créé le script dans my
~/bin/
et créé legit-gg
lien symbolique dans/usr/lib/git-core/
.Note 2
La commande ne peut pas être transformée en un
sh
git-alias normal car elle sera alors appelée à la racine du dépôt. Et ce n'est pas ce que je veux!la source