Exibe apenas pedaços relevantes de um diff / patch baseado em um regexp

20

git log -G<regex> -p é uma ferramenta maravilhosa para pesquisar o histórico de uma base de código por alterações que correspondam ao padrão especificado. No entanto, pode ser impressionante localizar o grupo relevante na saída diff / patch em um mar de pedaços quase irrelevantes.

É claro que é possível pesquisar a saída de git log da string / regex original, mas isso faz pouco para reduzir o ruído visual e a distração de muitas alterações não relacionadas.

Lendo em git log , vejo que há o --pickaxe-all , que é exatamente o oposto do que eu quero: ele amplia a saída (para todo o changeset), enquanto eu quero limitá-lo (ao pedaço específico ).

Essencialmente, eu estou procurando uma maneira de "inteligentemente" analisar o diff / patch em blocos individuais e então executar uma pesquisa contra cada pedaço (visando apenas as linhas alteradas), descartar os pedaços que não corresponder e produzir os que o fizerem.

Existe uma ferramenta como eu descrevo? Existe uma abordagem melhor para obter os pedaços combinados / afetados?

Alguma pesquisa inicial que fiz ...

  • Se fosse possível grep a saída do diff / patch e tornasse os valores da opção de contexto dinâmicos - digamos, via regexps em vez de contagens de linha - isso seria suficiente. Mas grep não é exatamente construído dessa forma (nem estou necessariamente solicitando esse recurso).

  • Eu encontrei a suíte patchutils , que inicialmente soou como se fosse adequada às minhas necessidades. Mas depois de ler suas páginas man , as ferramentas não parecem lidar com pedaços de correspondência baseados em regexps. (Eles podem aceitar uma lista de pedaços, embora ...)

  • Eu finalmente encontrei splitpatch.rb , que parece lidar bem com a análise do patch, mas seria precisam ser aumentados significativamente para manipular correções de leitura via stdin , combinando os pedaços desejados e, em seguida, exibindo os blocos.

por wrksprfct 15.07.2015 / 05:32

2 respostas

7

aqui link é descrito como fazer o que você está procurando. efetivamente:

git diff -U1 | grepdiff 'console' --output-matching=hunk

Ele mostra apenas os pedaços que combinam com a string "console".

    
por 30.03.2016 / 17:46
0

Não é exatamente o que você está pedindo, mas uma maneira de conhecer os hunks é o modo de adição interativa. Isso requer que você verifique o commit após o patch em que você está interessado

git checkout COMMIT_ID

em seguida, volte mais uma etapa no VCS, mas não no diretório de trabalho

git reset --soft HEAD^

(Neste ponto, a diferença entre o índice e o diretório de trabalho corresponderá ao patch em que você está interessado.)

Agora você pode executar git add -p . Isso iniciará uma sessão interativa que possui uma opção / , que permite localizar pedaços em que alguma linha corresponde a uma expressão regular. Particularmente útil se você realmente quiser processar ainda mais esses patches (como preparar uma seleção parcial de cereja).

Infelizmente, pelo menos no momento, o comando / em add -p funciona apenas em um único arquivo, portanto, talvez seja necessário ignorar vários arquivos não relevantes.

    
por 16.09.2016 / 13:11

Tags