How to exclude certain directories/files from git grep search

Yogeshwer Sharma picture Yogeshwer Sharma · May 3, 2012 · Viewed 38.6k times · Source

Is there a way to exclude certain paths/directories/files when searching a git repository using git grep? Something similar to the --exclude option in the normal grep command?

I need to use git grep because using grep directly runs too slowly on large git repositories.

Answer

onlynone picture onlynone · May 6, 2015

In git 1.9.0 the "magic word" exclude was added to pathspecs. So if you want to search for foobar in every file except for those matching *.java you can do:

git grep foobar -- './*' ':(exclude)*.java'

Or using the ! "short form" for exclude:

git grep foobar -- './*' ':!*.java'

Note that in git versions up to v2.12, when using an exclude pathspec, you must have at least one "inclusive" pathspec. In the above examples this is the ./* (recursively include everything under the current directory). In git v2.13 this restriction was lifted and git grep foobar -- ':!*.java' works without the ./*.

You could also use something like :(top) (short form: :/) to include everything from the top of the repo. But then you'd probably also want to adjust your exclude pathspec to start from the top as well: :/!*.java (otherwise it would only exclude *.java files from under your current directory).

There's a good reference for all the "magic words" allowed in a pathspec at git-scm.com (or just git help glossary). For some reason, the docs at kernel.org are really out of date even though they often come up first in google searches.