Ecco una soluzione che definisce un alias git, quindi potrai usarlo in questo modo:
git rblame -M -n -L '/REGEX/,+1' FILE
Esempio di output:
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
È possibile definire l'alias in .gitconfig o semplicemente eseguire il comando seguente
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
Questo è un brutto one-liner, quindi ecco una funzione bash equivalente off-offuscata:
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
}
La soluzione piccone ( git log --pickaxe-regex -S'REGEX ' ) fornirà solo aggiunte / eliminazioni di riga, non le altre alterazioni della riga contenente l'espressione regolare.
Una limitazione di questa soluzione è quella colpa git restituisce solo la prima corrispondenza REGEX, quindi se esistono più corrispondenze la ricorsione può "saltare" per seguire un'altra linea. Assicurati di controllare l'output della cronologia completa per individuare quei "salti" e quindi correggere il tuo REGEX per ignorare le linee del parassita.
Infine, ecco una versione alternativa che esegue git show su ogni commit per ottenere il 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