Usando o Git, como eu poderia procurar uma string em todos os ramos?

170

Usando o Git, como eu poderia pesquisar em todos os arquivos em todas as ramificações locais por uma determinada string?

Específico do GitHub: é possível realizar a pesquisa acima em todos os ramos do GitHub? (Existem várias ramificações remotas no meu repositório remoto do GitHub que, idealmente, não precisaria ser derrubado para esta pesquisa ...)

Ivar
fonte
1
git-grep pode ser o que você está procurando, mas eu tenho certeza ainda que as opções que você precisa não sou ...
johnny

Respostas:

170

Você pode fazer isso em um repositório Git:

git grep "string/regexp" $(git rev-list --all)

A pesquisa avançada do GitHub possui capacidade de pesquisa de código:

A pesquisa de código examinará todo o código hospedado publicamente no GitHub. Você também pode filtrar por:

  • o idioma: language:
  • o nome do repositório (incluindo o nome de usuário): repo:
  • o caminho do arquivo: path:
manojlds
fonte
Isso me causa uma falha de segmentação. No entanto, pode ser uma tortoisegitmerge (Windows).
precisa saber é
6
Esta não é realmente a melhor maneira de fazer isso. Ele não controla a quantidade de referências git que são passadas para git grep .... Olhe para as outras respostas, elas são muito melhores que essa, mesmo que estejam marcadas como a resposta aceita!
SLM
1
seria ótimo se você pudesse adicionar um exemplo para seus filtros, por exemplo path:, porque a documentação não parece clara onde aplicar esse filtro, supondo que esteja antes das aspas no exemplo de consulta?
blamb 30/05
3
como posso listar apenas o nome da ramificação. Atualmente, ele lista todo o hash contém a sequência.
harryfeng
4
Pesquisa Github está no branch master única . Em help.github.com/articles/searching-code : "Apenas o ramo padrão é indexado para pesquisa de código. Na maioria dos casos, esse será o ramo mestre".
RedPanda 28/02
124

Se você usar o comando @manojlds Git grep e receber um erro:

-bash: /usr/bin/git: Argument list too long" 

então você deve usar xargs :

git rev-list --all | xargs git grep "string/regexp"

Consulte também Como grep (pesquisar) código confirmado no histórico do Git

queima de chá
fonte
Além disso, este parece ser mais compatível com outro tipo de consoles como fishshell
Daniel
1
Obrigado!!! usando ZSH e isso funcionou enquanto o comando @manojlds deu o erro que você mencionou! Mas aviso, isso pode levar MUITO tempo para um repo grande com uma longa história.
114018
54

Em muitos casos, git rev-list --allpode retornar um grande número de confirmações, levando uma eternidade para verificar. Se você, em vez de pesquisar em todas as confirmações de todas as ramificações do histórico do repositório, apenas deseja pesquisar todas as dicas de ramificações, poderá substituí-las por git show-ref --heads. Então, no total:

git grep "string" `git show-ref --heads`

ou:

git show-ref --heads | xargs git grep "string"

Dica: Você pode gravar a saída no arquivo para visualizar em um editor:

nano ~/history.txt
git show-ref --heads | xargs git grep "search string here" >> ~/history.txt
Zitrax
fonte
6
git show-ref --headslista o hash e o nome da referência para que (2ª linha) procure duas vezes. então git show-ref --heads | cut -d' ' -f2é melhor, pois ele listará apenas os nomes de referência.
hIpPy
4
Não consigo acreditar quantas vezes essa pergunta foi feita e respondida, mas você é o único com a resposta correta .
Sammitch 29/09/17
1
git show-ref --heads -sgera somente o hash SHA1. Além disso, se houver várias ramificações apontando para o mesmo commit, você terá duplicatas. Você pode removê-los com sort -u, dessa forma #git show-ref --heads -s | sort -u | xargs git grep ...
23/02 Steve Steve
Aqui está a função que adicionei ao meu bashrc. Espero que ajude alguém:function gsearch { git grep $1 $(git show-ref --heads) | grep "refs/heads" | grep $1 } # last grep to keep grep color highlight
AFP_555 5/02/19
Essa deve ser a resposta aceita. Manter uma cadeia de caracteres em todas as ramificações, mas apenas para o conteúdo mais recente, é um caso de uso muito comum.
Dr_
21

Existem alguns problemas com as soluções listadas aqui (até aceitas).

Você não precisa listar todos os hashes, pois receberá duplicatas. Além disso, leva mais tempo.

Ele se baseia nisso, onde você pode pesquisar uma sequência "test -f /"em várias ramificações mastere, devcomo

git grep "test -f /" master dev

que é o mesmo que

printf "master\ndev" | xargs git grep "test -f /"

Então aqui vai.

Ele encontra os hashes para a ponta de todas as ramificações locais e pesquisa apenas nas confirmações:

git branch -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp"

Se você precisar procurar em ramificações remotas, adicione -a:

git branch -a -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp"

Mais distante:

# Search in local branches
git branch | cut -c3- | xargs git grep "string"

# Search in remote branches
git branch -r | cut -c3- | xargs git grep "string"

# Search in all (local and remote) branches
git branch -a | cut -c3- | cut -d' ' -f 1 | xargs git grep "string"

# Search in branches, and tags
git show-ref | grep -v "refs/stash" | cut -d' ' -f2 | xargs git grep "string"
hIpPy
fonte
5
pelo menos para a pesquisa em todos os ramos deve ser: git branch -a | cut -c3- | cut -d' ' -f 1 | xargs git grep "string" ou ele vai falhar com ->símbolo na lista de arquivos, o que denota local para relação ramos remoto
Ilya Sheershoff
7

Você pode tentar isso:

git log -Sxxxx  # Search all commits
git log -Sxxxx  --branches[=<pattern>]   # Search branches
Victor Choy
fonte
1
Em todos os ramos:git log --all -s"search_string"
Tim Kuipers