No git 1.9.0, a "palavra mágica" excludefoi adicionada a pathspecs. Portanto, se você deseja pesquisar foobarem todos os arquivos, exceto os correspondentes, *.javapode:
git grep foobar -- './*' ':(exclude)*.java'
Ou usando o !"formato abreviado" para excluir:
git grep foobar -- './*' ':!*.java'
Observe que nas versões git até a v2.12, ao usar uma exclusão pathspec, você deve ter pelo menos uma "inclusiva" pathspec. Nos exemplos acima, este é o ./*(inclua recursivamente tudo no diretório atual). No git v2.13, essa restrição foi levantada e git grep foobar -- ':!*.java'funciona sem o ./*.
Você também pode usar algo como :(top)(formato abreviado:) :/para incluir tudo, desde a parte superior do repositório. Mas então você provavelmente também desejaria ajustar sua exclusão pathspecpara começar do topo: :/!*.java(caso contrário, apenas excluiria *.javaarquivos do diretório atual).
Há uma boa referência para todas as "palavras mágicas" permitidas pathspecno site git-scm.com (ou apenas git help glossary). Por alguma razão, os documentos em kernel.org estão realmente desatualizados, embora geralmente sejam os primeiros nas pesquisas do Google.