我正在尝试编写一个脚本,帮助我将一些旧用户映射到少量的Git存储库中的新用户。我遇到的问题与子进程模块有关。简单的命令,如“git status”,似乎可以正常工作,但是更复杂的“git filter-branch”命令则失败了。
filter_history函数
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)
一些示例输出:
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
我注意到一些事情,就是在git命令后面添加了一个连字符,这对我来说不太合理。另外,如果我从打印的命令中删除额外的连字符并在repoPath中执行它,一切都正常。如有任何帮助或指导将不胜感激。
--env-filter
脚本的每一行末尾都应该加上一个'\
',就像http://linux.die.net/man/1/git-filter-branch中看到的示例一样。当涉及到该`--env-filter`参数中包含的脚本部分时,一个`"""`是不足以支持多行命令的。 - VonC--env-filter
参数外部化到一个外部脚本中?(和/或极大地简化脚本以查看错误信息是否仍然存在?) - VonC