Eu tenho um repositório Git com poucos ramos e commits dangling. Eu gostaria de procurar todos os commits no repositório por uma string específica.
Eu sei como obter um log de todos os commits no histórico, mas eles não incluem ramificações ou blobs pendentes, apenas o histórico do HEAD. Eu quero pegar todos eles, encontrar um commit específico que tenha sido extraviado.
Eu também gostaria de saber como fazer isso no Mercurial, pois estou considerando a opção.
Respostas:
Você pode ver confirmações pendentes com
git log -g
.Portanto, você pode fazer isso para encontrar uma sequência específica em uma mensagem de confirmação que está pendente:
Como alternativa, se você deseja pesquisar as alterações para uma sequência específica, pode usar a opção de pesquisa de picareta "-S":
O Git 1.7.4 adicionará a opção -G , permitindo que você passe -G <regexp> para descobrir quando uma linha que contém <regexp> foi movida, o que -S não pode fazer. -S informa apenas quando o número total de linhas que contêm a sequência foi alterado (ou seja, adicionando / removendo a sequência).
Por fim, você pode usar o gitk para visualizar os commits dangling com:
E, em seguida, use seus recursos de pesquisa para procurar o arquivo extraviado. Todo esse trabalho, assumindo que a confirmação ausente não "expirou" e foi coletado como lixo, o que pode ocorrer se ficar pendurado por 30 dias e você expirar os reflogs ou executar um comando que os expire.
fonte
!git fsck --unreachable | sed -ne 's/^unreachable commit //p' | xargs git log --no-walk
No Mercurial, você usa
hg log --keyword
para procurar palavras-chave nas mensagens de confirmação ehg log --user
procurar um usuário específico. Vejahg help log
outras maneiras de limitar o log.fonte
hg log -k
as pesquisas também confirmam o nome de usuário e os arquivos nos conjuntos de alterações (vejo isso em commands.py:log), que é uma das poucas coisas que não entendo em hg. Deve haver opções separadas para procurar mensagens de confirmação e nomes de arquivos. Parece quehg log --template '{desc}\n'|grep
é o caminho certo.hg grep --all <term>
Além da resposta richq de usar
git log -g --grep=<regexp>
ougit grep -e <regexp> $(git log -g --pretty=format:%h)
: dê uma olhada nas seguintes postagens de blog de Junio C Hamano, atual mantenedor do gitResumo
O git grep e o git log --grep são orientados a linhas , pois procuram linhas que correspondam ao padrão especificado.
Você pode usar
git log --grep=<foo> --grep=<bar>
(ougit log --author=<foo> --grep=<bar>
que se traduz internamente em dois--grep
) para encontrar confirmações que correspondam a qualquer um dos padrões (implícito OU semântico).Por ser orientado a linhas, a útil AND semântica é usada
git log --all-match --grep=<foo> --grep=<bar>
para encontrar o commit que possui a linha correspondente primeiro e a linha correspondente segundo em algum lugar.Com
git grep
você pode combinar vários padrões (todos os que devem usar o-e <regexp>
formulário) com--or
(que é o padrão),--and
,--not
,(
e)
. Para grep--all-match
significa que o arquivo deve ter linhas que correspondam a cada uma das alternativas.fonte
Com base na resposta da rq, descobri que esta linha faz o que eu quero:
O qual reportará o ID de confirmação, o nome do arquivo e exibirá a linha correspondente, assim:
... Alguém concorda que essa seria uma boa opção para ser incluída no comando git grep padrão?
fonte
Qualquer comando que aceite referências como argumentos aceitará a
--all
opção documentada na página de manual dagit rev-list
seguinte maneira:Por exemplo
git log -Sstring --all
, exibirá todos os commits mencionadosstring
e acessíveis a partir de uma ramificação ou de uma tag (presumo que seus commits pendentes sejam pelo menos nomeados com uma tag).fonte
git grep
, onde--all
parece ser traduzido para / usado como--all-match
. Isso me parece um bug .. usando o Git 1.7.2.3 (usando o$(git rev-list --all)
works).Com o Mercurial, você faz um
Existem outras opções que restringem o intervalo de revisões pesquisadas.
fonte
hg grep --all
Não sei sobre o git, mas no Mercurial, eu apenas canalizava a saída do hg log para algum script sed / perl / any para procurar o que você estava procurando. Você pode personalizar a saída do hg log usando um modelo ou um estilo para facilitar a pesquisa, se desejar.
Isso incluirá todas as ramificações nomeadas no repositório. O Mercurial não tem algo parecido com bolhas pendentes.
fonte
se você é um usuário do vim, pode instalar o tig (apt-get install tig) e usar /, o mesmo comando para pesquisar no vim
https://blogs.atlassian.com/2013/05/git-tig/
fonte
Para adicionar apenas mais uma solução ainda não mencionada, devo dizer que o uso da caixa de pesquisa gráfica do gitg foi a solução mais simples para mim. Ele selecionará a primeira ocorrência e você poderá encontrar a próxima com Ctrl-G.
fonte
Um comando no git que acho muito mais fácil encontrar uma string:
trabalha no Git 2.0.4
fonte