How to exclude certain directories/files from git grep search
Update: For git >= 1.9 there is native support for exclude patterns, see onlyone's answer.
This may seem backwards, but you can pass a list of files not matching your exclude pattern to git grep
like this:
git grep <pattern> -- `git ls-files | grep -v <exclude-pattern>`
grep -v
returns every path not matching <exclude-pattern>
. Note that git ls-files
also takes a --exclude
parameter, but that is only applied to untracked files.
In git 1.9.0 the "magic word" exclude
was added to pathspec
s. 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 you'd want to add ./*
(recursively include everything under the current directory) somewhere after the --
as well. In git v2.13 this restriction was lifted and git grep foobar -- ':!*.java'
works without the ./*
.
There's a good reference for all the "magic words" allowed in a pathspec
at git-scm.com (or just git help glossary
).