Eu apaguei um arquivo ou algum código em um arquivo em algum momento no passado. Posso grep no conteúdo (não nas mensagens de confirmação)?
Uma solução muito ruim é grep o log:
git log -p | grep <pattern>
No entanto, isso não retorna o hash de confirmação imediatamente. Eu brinquei git grep
sem sucesso.
git log -S
culpa) * [Diversão com "git log --grep"] [2] (pesquisando mensagens de confirmação ) * [Diversão com "git grep"] [3] [2]: gitster.livejournal.com/30195.html [3]: gitster.livejournal.com/27674.htmlRespostas:
Para procurar conteúdo de confirmação (ou seja, linhas reais de origem, em vez de confirmar mensagens e similares), você precisa:
git rev-list --all | xargs git grep <expression>
funcionará se você tiver um erro "A lista de argumentos é muito longa".Se você deseja limitar a pesquisa a alguma subárvore (por exemplo, "lib / util"), será necessário passar isso para o
rev-list
subcomando egrep
também:Isso irá verificar todo o seu texto de confirmação para
regexp
.O motivo para passar o caminho nos dois comandos é porque
rev-list
retornará a lista de revisões onde todas as alteraçõeslib/util
ocorreram, mas você também precisa passar paragrep
que ele só procurelib/util
.Imagine o seguinte cenário:
grep
pode encontrar o mesmo<regexp>
em outros arquivos contidos na mesma revisão retornada porrev-list
(mesmo se não houver nenhuma alteração nesse arquivo nessa revisão).Aqui estão algumas outras maneiras úteis de pesquisar sua fonte:
Pesquise na árvore de trabalho o texto que corresponde à expressão regular regexp:
Pesquise na árvore de trabalho as linhas de texto que correspondem à expressão regular regexp1 ou regexp2:
Pesquise na árvore de trabalho as linhas de texto que correspondem à expressão regular regexp1 e regexp2, relatando apenas os caminhos do arquivo:
Pesquise na árvore de trabalho arquivos que tenham linhas de texto que correspondem à expressão regular regexp1 e linhas de texto que correspondem à expressão regular regexp2:
Pesquise na árvore de trabalho as linhas alteradas do padrão de correspondência de texto:
Pesquise em todas as revisões o texto correspondente à expressão regular regexp:
Pesquise em todas as revisões entre rev1 e rev2 o texto que corresponde à expressão regular regexp:
fonte
sh.exe": /bin/git: Bad file number
. A resposta do VonC também funciona com o msysgit.git gc
ou faça o check-out: stackoverflow.com/questions/1507463/…Você deve usar a opção pickaxe (
-S
) degit log
.Para procurar
Foo
:Veja o histórico do Git - encontre linhas perdidas por palavra - chave para obter mais.
Como Jakub Narębski comentou:
isso procura diferenças que introduzem ou removem uma instância de
<string>
. Geralmente significa "revisões nas quais você adicionou ou remove linhas com 'Foo'".a
--pickaxe-regex
opção permite usar o regex POSIX estendido em vez de procurar uma sequência. Exemplo (degit log
):git log -S"frotz\(nitfol" --pickaxe-regex
Como Rob comentou, essa pesquisa diferencia maiúsculas de minúsculas - ele abriu uma pergunta de acompanhamento sobre como pesquisar sem distinção entre maiúsculas e minúsculas.
fonte
git log
pouco na sua pergunta me confundiu;) #-p
bandeira para também gerar o diff.--branches --all
opções para procurar o repo all.Minha maneira favorita de fazer isso é com
git log
a-G
opção (adicionada na versão 1.7.4).Há uma diferença sutil entre a maneira como as opções
-G
e-S
determinam se um commit corresponde:-S
opção basicamente conta o número de vezes que sua pesquisa corresponde a um arquivo antes e depois de uma confirmação. A confirmação é mostrada no log se as contagens antes e depois forem diferentes. Por exemplo, isso não mostra confirmações para onde uma linha correspondente à sua pesquisa foi movida.-G
opção, a confirmação é mostrada no log se a sua pesquisa corresponder a qualquer linha que foi adicionada, removida ou alterada.Tome esse commit como um exemplo:
Como o número de vezes que "olá" aparece no arquivo é o mesmo antes e depois dessa confirmação, ele não coincide com o uso
-Shello
. No entanto, como houve uma alteração em uma correspondência de linhahello
, a confirmação será mostrada usando-Ghello
.fonte
-p
opção para mostrar um diff para cada commit. Então, quando o log é aberto no meu pager, procuro o que estou procurando. Se o seu pager éless
e vocêgit log -Ghello -p
, você pode digitar/hello
, pressionarEnter
e usarn
eN
para encontrar as ocorrências seguintes / anteriores de "olá".-G
Regex: se a linha de comando usa UTF-8 e o arquivo que você está visualizando usa alguma codificação ISO-Latin (8 bits),.*
falha. Por exemplo, eu tenho uma alteraçãoVierter Entwurf
->Fünfter Entwurf
e, embora'V.*ter Entwurf'
produza uma correspondência,'F.*ter Entwurf'
não.Se você deseja procurar alterações de código (veja o que realmente foi alterado com a palavra especificada em toda a história), vá para o
patch
modo - Encontrei uma combinação muito útil de fazer:fonte
git log
pode ser uma maneira mais eficaz de pesquisar texto em todos os ramos, especialmente se houver muitas correspondências, e você desejar ver alterações mais recentes (relevantes) primeiro.Esses comandos de log listam confirmações que adicionam ou removem a sequência / regex de pesquisa especificada, (geralmente) mais recentes primeiro. A
-p
opção faz com que o diff relevante seja mostrado onde o padrão foi adicionado ou removido, para que você possa vê-lo em contexto.Depois de encontrar um commit relevante que adiciona o texto que você estava procurando (por exemplo, 8beeff00d), encontre os ramos que contêm o commit:
fonte
'
aspas não estão agrupando sua sequência de pesquisa como um único argumento. Em vez disso,'public
é o argumento-S
e trata o resto como argumentos separados. Não sei em que ambiente você está executando, mas esse contexto seria necessário para ajudar a solucionar problemas. Sugiro que você abra uma pergunta StackOverflow separada, se necessário, para ajudá-lo a solucionar problemas, com todo o contexto de como seu comando git está sendo enviado para o shell. Parece-me que está sendo enviado através de algum outro comando? Os comentários aqui não são o lugar certo para descobrir isso.Peguei a resposta de Jeet e a adaptei ao Windows (graças a esta resposta ):
Observe que, para mim, por algum motivo, o commit real que excluiu esse regex não apareceu na saída do comando, mas um commit anterior a ele.
fonte
--no-pager
ao comando git no final>>results.txt
para aqueles que não são versados na tubulação do Windows ... #Pesquise em qualquer revisão, qualquer arquivo :
Procure apenas em alguns arquivos, por exemplo, arquivos XML:
As linhas de resultado devem ter a seguinte aparência: 6988bec26b1503d45eb0b2e8a4364afb87dde7af: bla.xml: texto da linha encontrada ...
Você pode obter mais informações como autor, data e diff usando
git show
:fonte
Para simplificar, sugiro o uso da GUI: gitk - O navegador do repositório Git . É bem flexível
E você pode navegar pelos resultados usando as setas para cima / para baixo.
fonte
Para qualquer outra pessoa que tente fazer isso no Sourcetree , não há comando direto na interface do usuário para ele (a partir da versão 1.6.21.0). No entanto, você pode usar os comandos especificados na resposta aceita, abrindo a janela Terminal (botão disponível na barra de ferramentas principal) e copiando / colando os mesmos.
Nota: A visualização Pesquisa do Sourcetree pode fazer parcialmente a pesquisa de texto por você. Pressione Ctrl+ 3para ir para o modo de pesquisa (ou clique na guia Pesquisa disponível na parte inferior). Na extremidade direita, defina o Tipo de pesquisa como Alterações de arquivo e digite a string que deseja pesquisar. Este método possui as seguintes limitações em comparação com o comando acima:
fonte
Sempre que me encontro na sua casa, uso a seguinte linha de comando:
Explicação:
git log
- Preciso escrever mais aqui; mostra os logs em ordem cronológica.-S "<words/phrases i am trying to find>"
- Ele mostra todos os commits do Git em que qualquer arquivo (adicionado / modificado / excluído) tem as palavras / frases que estou tentando encontrar sem os símbolos '<>'.--all
- Aplicar e pesquisar em todos os ramos.--oneline
- Comprime o log do Git em uma linha.--graph
- Cria o gráfico de confirmações ordenadas cronologicamente.fonte
A resposta de Jeet funciona no PowerShell.
A seguir, são exibidos todos os arquivos, em qualquer confirmação, que contenham a
password
.fonte
Então, você está tentando folhear versões mais antigas do código, procurando ver onde algo existe por último?
Se eu estivesse fazendo isso, provavelmente usaria git bisect . Usando o bisect, você pode especificar uma versão boa conhecida, uma versão ruim conhecida e um script simples que verifica se a versão é boa ou ruim (nesse caso, um grep para ver se o código que você está procurando está presente ) A execução disso encontrará quando o código foi removido.
fonte
Cenário: você fez uma grande limpeza do seu código usando seu IDE. Problema: O IDE limpou mais do que deveria e agora o código não é compilado (recursos ausentes etc.)
Solução:
Ele encontrará o arquivo em que "text_to_find" foi alterado.
Agora você pode desfazer essa alteração e compilar seu código.
fonte
é um ajuste na solução do Jeet , por isso mostra resultados enquanto pesquisa e não apenas no final (o que pode levar muito tempo em um grande repositório).
fonte
No meu caso, eu precisava pesquisar um commit curto e as soluções listadas infelizmente não estavam funcionando.
Consegui fazer isso com (substitua o token REGEX ):
fonte