Usando git filter-branch con el module de subprocess de Python

Intento escribir un script que me ayude a mapear algunos usuarios antiguos a nuevos usuarios en un puñado de repositorys Git. El problema que estoy teniendo es con el module de subprocess. Los commands simples como "estado de git" parecen funcionar bien, pero el command más complejo "git filter-branch" me está fallando.

function filter_history

def filter_history(old, new, name, repoPath): command = """ filter-branch --env-filter ' an="$GIT_AUTHOR_NAME" am="$GIT_AUTHOR_EMAIL" cn="$GIT_COMMITTER_NAME" cm="$GIT_COMMITTER_EMAIL" if [[ "$GIT_COMMITTER_EMAIL" == |old|* ]] then cn="|name|" cm="|new|" fi if [[ "$GIT_AUTHOR_EMAIL" == |old|* ]] then an="|name|" am="|new|" fi export GIT_AUTHOR_NAME="$an" export GIT_AUTHOR_EMAIL="$am" export GIT_COMMITTER_NAME="$cn" export GIT_COMMITTER_EMAIL="$cm" ' """ #Do string replace command = command.replace("|old|", old) command = command.replace("|new|", new) command = command.replace("|name|", name) subprocess.Popen(['/usr/bin/git', command], cwd=os.path.dirname(repoPath), shell=False) 

Algunos ejemplos de salida:

 fatal: cannot exec 'git- filter-branch --env-filter ' an="$GIT_AUTHOR_NAME" am="$GIT_AUTHOR_EMAIL" cn="$GIT_COMMITTER_NAME" cm="$GIT_COMMITTER_EMAIL" if [[ "$GIT_COMMITTER_EMAIL" == jacks* ]] then cn="Jack Slingerland" cm="jacks-teamddm" fi if [[ "$GIT_AUTHOR_EMAIL" == jacks* ]] then an="Jack Slingerland" am="jacks-teamddm" fi export GIT_AUTHOR_NAME="$an" export GIT_AUTHOR_EMAIL="$am" export GIT_COMMITTER_NAME="$cn" export GIT_COMMITTER_EMAIL="$cm" ' ': File name too long 

Algunas cosas que he notado son que el command git está recibiendo un guión adjunto, lo que no tiene mucho sentido para mí. Además, si elimino el Hypen extra del command que se imprime y lo ejecuto en repoPath, todo funciona bien. Cualquier ayuda o dirección sobre esto sería muy apreciada.

Esto debería funcionar: (estoy usando linux)

 def filter_history(old, new, name, repoPath): command = """' an="$GIT_AUTHOR_NAME" am="$GIT_AUTHOR_EMAIL" cn="$GIT_COMMITTER_NAME" cm="$GIT_COMMITTER_EMAIL" if [[ "$GIT_COMMITTER_EMAIL" == |old|* ]] then cn="|name|" cm="|new|" fi if [[ "$GIT_AUTHOR_EMAIL" == |old|* ]] then an="|name|" am="|new|" fi export GIT_AUTHOR_NAME="$an" export GIT_AUTHOR_EMAIL="$am" export GIT_COMMITTER_NAME="$cn" export GIT_COMMITTER_EMAIL="$cm" ' """ #Do string replace command = command.replace("|old|", old) command = command.replace("|new|", new) command = command.replace("|name|", name) subprocess.Popen(['git filter-branch --env-filter', command],cwd=os.path.dirname(repoPath), shell=True) 

Tenga en count que "shell = True" en la function subprocess.Popen

Como un FYI para cualquier persona que aparezca, @xueyymusic fue el más cercano. Terminé usando lo siguiente:

 def filter_history(old, new, name, repoPath): command = """--env-filter ' an="$GIT_AUTHOR_NAME" am="$GIT_AUTHOR_EMAIL" cn="$GIT_COMMITTER_NAME" cm="$GIT_COMMITTER_EMAIL" if [[ "$GIT_COMMITTER_EMAIL" == |old|* ]] then cn="|name|" cm="|new|" fi if [[ "$GIT_AUTHOR_EMAIL" == |old|* ]] then an="|name|" am="|new|" fi export GIT_AUTHOR_NAME="$an" export GIT_AUTHOR_EMAIL="$am" export GIT_COMMITTER_NAME="$cn" export GIT_COMMITTER_EMAIL="$cm" ' """ #DO string replace command = command.replace("|old|", old) command = command.replace("|new|", new) command = command.replace("|name|", name) process = subprocess.Popen(['git filter-branch', command],cwd=os.path.dirname(repoPath), shell=True)