Voici une solution qui définit un alias git, vous pourrez donc l'utiliser comme ça:
git rblame -M -n -L '/REGEX/,+1' FILE
Exemple de sortie:
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
Vous pouvez définir l'alias dans votre .gitconfig ou simplement exécuter la commande suivante
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
Il s'agit d'un laid à une ligne, voici donc une fonction bash équivalente désobscurcie:
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 solution de pioche ( git log --pickaxe-regex -S'REGEX ' ) ne vous donnera que des ajouts / suppressions de lignes, pas les autres altérations de la ligne contenant l'expression régulière.
Une limitation de cette solution est que git blame ne renvoie que la 1ère correspondance REGEX, donc si plusieurs correspondances existent, la récursivité peut "sauter" pour suivre une autre ligne. Assurez-vous de vérifier la sortie de l'historique complet pour repérer ces «sauts», puis réparez votre REGEX pour ignorer les lignes parasites.
Enfin, voici une version alternative qui exécute git show sur chaque commit pour obtenir la diff complète:
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