Existe uma maneira de excluir certos caminhos / diretórios / arquivos ao pesquisar um repositório git usando git grep
? Algo semelhante à --exclude
opção no grep
comando normal ?
Eu preciso usar git grep
porque o uso grep
é executado diretamente muito lentamente em grandes repositórios git.
Respostas:
Não é possível, mas foi discutido recentemente . Solução proposta no link:
EDIT vê apenas a resposta de ninguém , já que o git 1.9.0 é possível.
fonte
No git 1.9.0, a "palavra mágica"
exclude
foi adicionada apathspec
s. Portanto, se você deseja pesquisarfoobar
em todos os arquivos, exceto os correspondentes,*.java
pode:Ou usando o
!
"formato abreviado" para excluir: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 egit 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ãopathspec
para começar do topo::/!*.java
(caso contrário, apenas excluiria*.java
arquivos do diretório atual).Há uma boa referência para todas as "palavras mágicas" permitidas
pathspec
no site git-scm.com (ou apenasgit help glossary
). Por alguma razão, os documentos em kernel.org estão realmente desatualizados, embora geralmente sejam os primeiros nas pesquisas do Google.fonte
git grep clock.gettime -- './*' ':!arch/**' ':!drivers/**'
excluir vários diretórios inteiros. Eu não acho que isso evite a recursão.git config alias.mygrep '!git grep "$@" -- "${GIT_PREFIX}/*" ":!*.java*" #'
. Então apenasgit mygrep foobar
. (Usando nome falso desembolsar truque # e dir atual .)git grep
egit ls-files
de subdiretórios e ambos os nomes de arquivos de relatórios relativos ao diretório atual (mesmo quando você usa a':(top)'
incluir pathspec). Ambos os comandos têm a--full-name
opção de relatar nomes relativos à raiz, mas estão desativados por padrão.Atualização: Para git> = 1.9, há suporte nativo para padrões de exclusão, consulte apenas a resposta de alguém .
Isso pode parecer invertido, mas você pode passar uma lista de arquivos que não correspondem ao seu padrão de exclusão para
git grep
:grep -v
retorna todos os caminhos que não correspondem<exclude-pattern>
. Observe quegit ls-files
também usa um--exclude
parâmetro, mas que é aplicado apenas a arquivos não rastreados .fonte
Você pode marcar arquivos ou diretórios como binários, criando um arquivo de atributos em seu repositório, por exemplo
As correspondências nos arquivos binários são listadas sem a linha de inclusão, por exemplo
fonte
Com o exemplo de @kynan como base, criei esse script e o coloquei no meu caminho (
~/bin/
) comogg
. Ele usa,git grep
mas evita alguns tipos de arquivos especificados.Em nosso repositório, há muitas imagens, então excluí os arquivos de imagem, e isso leva o tempo de espera para 1/3, se eu pesquisar no repositório inteiro. Mas o script pode ser facilmente modificado para excluir outros tipos de arquivos ou padrões de geleral.
Nota 1
De acordo com isso , deve ser possível nomear a coisa
git-gg
e poder chamá-la como um comando git normal, como:Mas não consigo fazer isso funcionar. Eu criei o script no meu
~/bin/
e fiz ogit-gg
link simbólico/usr/lib/git-core/
.Nota 2
O comando não pode ser transformado em um
sh
git-alias regular , pois será invocado na raiz do repositório. E não é isso que eu quero!fonte