Usar una secuencia de commands python como filter para git filter-branch

Estoy intentando cambiar el nombre de algunos committers en un repository de git, usando git filter-branch . Me gustaría utilizar una lógica más compleja, pero realmente no entiendo bash. El script (de trabajo) que estoy usando se ve así:

 git filter-branch -f --tag-name-filter cat --env-filter ' cn="$GIT_COMMITTER_NAME" cm="$GIT_COMMITTER_EMAIL" if [ $cn = "ew" ] then cn="Eric" cm="my.email@provider.com" fi export GIT_COMMITTER_NAME="$cn" export GIT_COMMITTER_EMAIL="$cm" ' -- --all 

¿Es posible para mí usar una secuencia de commands python como el argumento --env-filter ? De ser así, ¿cómo podría get acceso a $GIT_COMMITTER_NAME para leerlo y escribirlo?

¿Cómo haría el equivalente de esa cadena de bash en un file de Python?

En python, debe import os el sistema os.environ , después del cual os.environ es un dictionary con el entorno entrante. Los cambios en os.environ se exportan automáticamente. El verdadero problema aquí es que los filters git -filter- * se ejecutan, como dice:

siempre se evalúa en el context de shell utilizando el command eval (con la notable exception del filter de confirmación, por razones técnicas).

Entonces, en realidad está usando el shell, y si el shell invoca a Python, termina con un subprocess del shell y cualquier cambio realizado en el process de Python no afecta ese shell. Tendría que eval el resultado de un script de Python:

 eval `python foo.py` 

donde foo.py emite los commands de export apropiados:

 import os def example(): cn = os.environ['GIT_COMMITTER_NAME'] cm = os.environ['GIT_COMMITTER_EMAIL'] if cn == 'ew': cn = 'Eric' cm = 'my.email@provider.com' print ('export GIT_COMMITTER_NAME="%s"' % cn) print ('export GIT_COMMITTER_EMAIL="%s"' % cm) example() # or if __name__ == '__main__', etc. 

(todo lo anterior no está probado).