Aqui está uma solução que define um alias do git, para que você possa usá-lo assim:
git rblame -M -n -L '/REGEX/,+1' FILE
Exemplo de saída:
00000000 18 (Not Committed Yet 2013-08-19 13:04:52 +0000 728) fooREGEXbar
15227b97 18 (User1 2013-07-11 18:51:26 +0000 728) fooREGEX
1748695d 23 (User2 2013-03-19 21:09:09 +0000 741) REGEXbar
Você pode definir o alias no seu .gitconfig ou simplesmente executar o seguinte comando
git config alias.rblame !sh -c 'while line=$(git blame "$@" $commit 2>/dev/null); do commit=${line:0:8}^; [ 00000000^ == $commit ] && commit=$(git rev-parse HEAD); echo $line; done' dumb_param
Esta é uma linha única feia, então aqui está uma função bash equivalente ofuscada:
git-rblame () {
local commit line
while line=$(git blame "$@" $commit 2>/dev/null); do
commit="${line:0:8}^"
if [ "00000000^" == "$commit" ]; then
commit=$(git rev-parse HEAD)
fi
echo $line
done
}
A solução de picareta ( git log --pickaxe-regex -S'REGEX ' ) fornecerá apenas adições / exclusões de linha, e não as outras alterações da linha que contêm a expressão regular.
Uma limitação desta solução é que a culpa retorna apenas a 1ª correspondência do REGEX; portanto, se existirem várias correspondências, a recursão poderá "saltar" para seguir outra linha. Certifique-se de verificar a saída do histórico completo para identificar esses "saltos" e, em seguida, corrija o REGEX para ignorar as linhas de parasitas.
Finalmente, aqui está uma versão alternativa que executa o git show em cada commit para obter o diff completo:
git config alias.rblameshow !sh -c 'while line=$(git blame "$@" $commit 2>/dev/null); do commit=${line:0:8}^; [ 00000000^ == $commit ] && commit=$(git rev-parse HEAD); git show $commit; done' dumb_param