Quero poder encontrar uma determinada string que foi introduzida em qualquer commit em qualquer branch, como posso fazer isso? Eu encontrei algo (que eu modifiquei para o Win32), mas git whatchanged
não parece estar olhando para os diferentes ramos (ignore o pedaço py3k, é apenas uma correção de feed de linha msys / win)
git whatchanged -- <file> | \
grep "^commit " | \
python -c "exec(\"import sys,msvcrt,os\nmsvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)\nfor l in sys.stdin: print(l.split()[1])\")" | \
xargs -i% git show origin % -- <file>
Realmente não importa se sua solução é lenta.
Respostas:
Você pode fazer:
Para encontrar todas as confirmações que adicionaram ou removeram a sequência fixa
whatever
. O--all
parâmetro significa iniciar de cada ramificação e--source
mostrar quais dessas ramificações levaram a encontrar essa confirmação. Muitas vezes, é útil adicionar-p
para mostrar os patches que cada um desses commit introduziria também.As versões do git desde 1.7.4 também têm uma
-G
opção semelhante , que recebe uma expressão regular . Na verdade, isso tem semânticas diferentes (e um pouco mais óbvias), explicadas nesta postagem no blog de Junio Hamano .Como thameera aponta nos comentários, você precisa colocar aspas no termo de pesquisa se ele contiver espaços ou outros caracteres especiais, por exemplo:
Aqui está um exemplo usando
-G
para encontrar ocorrências defunction foo() {
:fonte
--decorate
apenas adiciona o nome do ramo ao commit na ponta de cada ramo. Na prática, eu realmente não usar--source
ou--decorate
, e em vez disso usargit branch -a --contains <commit-hash>
para descobrir qual ramos conter a cometer estou interessado.git log -S"dude, where's my car?" --source --all
,. A @ribamar também escreveu isso em uma resposta abaixo, mas pode ser facilmente ignorada ao lado desta resposta principal.--reverse também é útil, pois você deseja o primeiro commit que fez a alteração:
Dessa forma, as confirmações mais antigas aparecerão primeiro.
fonte
A resposta de Mark Longair é excelente, mas achei que esta versão mais simples funcionou para mim.
fonte
HEAD
, mas essa pergunta específica foi feita especificamente sobre a procura em todas as ramificações em um repositório.Brincando com as mesmas respostas:
Agora você pode fazer
ou
fonte
Preste atenção para não usar espaços entre S e "string_to_search". Em algumas configurações (git 1.7.1), você receberá um erro como:
fonte
Embora isso não responda diretamente à sua pergunta, acho que pode ser uma boa solução para você no futuro. Vi uma parte do meu código, que era ruim. Não sabia quem o escreveu ou quando. Pude ver todas as alterações do arquivo, mas ficou claro que o código havia sido movido de outro arquivo para este. Eu queria descobrir quem realmente o adicionou em primeiro lugar.
Para fazer isso, usei o Git bisect , que rapidamente me permitiu encontrar o pecador.
Eu corri
git bisect start
e depoisgit bisect bad
, porque a revisão teve o problema. Como não sabia quando o problema ocorreu, direcionei o primeiro commit para o "bom"git bisect good <initial sha>
,.Então continuei pesquisando no repositório o código incorreto. Quando descobri isso, eu corri
git bisect bad
, e quando ela não estava lá:git bisect good
.Em ~ 11 etapas, eu havia coberto ~ 1000 confirmações e encontrei a confirmação exata, onde o problema foi introduzido. Muito bem.
fonte
Não sei por que a resposta aceita não funciona no meu ambiente; finalmente, corro o comando abaixo para obter o que preciso
fonte