В git 1.9.0 в s excludeбыло добавлено «волшебное слово» pathspec. Поэтому, если вы хотите искать foobarв каждом файле, кроме тех, которые соответствуют, *.javaвы можете сделать:
git grep foobar -- './*' ':(exclude)*.java'
Или используйте !"краткую форму" для исключения:
git grep foobar -- './*' ':!*.java'
Обратите внимание, что в версиях git до v2.12 при использовании исключения у pathspecвас должен быть хотя бы один «включительно» pathspec. В приведенных выше примерах это ./*(рекурсивно включить все в текущем каталоге). В git v2.13 это ограничение снято и git grep foobar -- ':!*.java'работает без расширения ./*.
Вы также можете использовать что-то вроде :(top)(короткая форма :), :/чтобы включить все, что находится в верхней части репозитория. Но тогда вы, вероятно, также захотите настроить исключение, pathspecчтобы оно начиналось сверху: :/!*.java(в противном случае он будет исключать только *.javaфайлы из вашего текущего каталога).
Там хорошая ссылка для всех «волшебных слов» разрешенных в pathspecв git-scm.com (или только git help glossary). По какой-то причине документы на kernel.org действительно устарели, хотя они часто появляются первыми при поиске в Google.