Usar git gui blame
é difícil de usar em scripts e, embora git log -G
e git log --pickaxe
possa mostrar a você quando a definição do método apareceu ou desapareceu, não encontrei nenhuma maneira de fazê-los listar todas as alterações feitas no corpo do seu método.
No entanto, você pode usar gitattributes
e a textconv
propriedade para reunir uma solução que faça exatamente isso. Embora esses recursos tenham sido originalmente planejados para ajudá-lo a trabalhar com arquivos binários, eles funcionam tão bem aqui.
A chave é fazer com que o Git remova do arquivo todas as linhas, exceto aquelas em que você está interessado, antes de fazer qualquer operação diff. Em seguida git log
, git diff
etc. verá apenas a área na qual você está interessado.
Aqui está o esboço do que faço em outro idioma; você pode ajustá-lo para suas próprias necessidades.
Escreva um script de shell curto (ou outro programa) que receba um argumento - o nome de um arquivo de origem - e produza apenas a parte interessante desse arquivo (ou nada se nada disso for interessante). Por exemplo, você pode usar sed
o seguinte:
#!/bin/sh
sed -n -e '/^int my_func(/,/^}/ p' "$1"
Defina um textconv
filtro Git para seu novo script. (Consulte a gitattributes
página do manual para obter mais detalhes.) O nome do filtro e a localização do comando podem ser o que você quiser.
$ git config diff.my_filter.textconv /path/to/my_script
Diga ao Git para usar esse filtro antes de calcular as diferenças para o arquivo em questão.
$ echo "my_file diff=my_filter" >> .gitattributes
Agora, se você usar -G.
(observe o .
) para listar todos os commits que produzem mudanças visíveis quando seu filtro é aplicado, você terá exatamente aqueles commits nos quais está interessado. Quaisquer outras opções que usam as rotinas diff do Git, como --patch
, também obter essa visão restrita.
$ git log -G. --patch my_file
Voilà!
Uma melhoria útil que você pode querer fazer é fazer com que o script do filtro tome um nome de método como seu primeiro argumento (e o arquivo como seu segundo). Isso permite que você especifique um novo método de interesse apenas chamando git config
, em vez de ter que editar seu script. Por exemplo, você pode dizer:
$ git config diff.my_filter.textconv "/path/to/my_command other_func"
Claro, o script de filtro pode fazer o que você quiser, aceitar mais argumentos ou o que quer que seja: há muita flexibilidade além do que mostrei aqui.