Aquí hay una solución que define un alias git, por lo que podrá usarlo así:
git rblame -M -n -L '/REGEX/,+1' FILE
Ejemplo de salida:
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
Puede definir el alias en su .gitconfig o simplemente ejecutar el siguiente 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 es una línea fea, así que aquí hay una función de 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
}
La solución pickaxe ( git log --pickaxe-regex -S'REGEX ' ) solo le dará adiciones / eliminaciones de línea, no las otras alteraciones de la línea que contiene la expresión regular.
Una limitación de esta solución es que git blame solo devuelve la primera coincidencia REGEX, por lo que si existen varias coincidencias, la recursión puede "saltar" para seguir otra línea. Asegúrese de verificar la salida del historial completo para detectar esos "saltos" y luego arregle su REGEX para ignorar las líneas de parásitos.
Finalmente, aquí hay una versión alternativa que ejecuta git show en cada confirmación para obtener la diferencia completa:
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