使用python脚本作为git过滤器分支的过滤器

问题描述:

我想重命名git仓库中的一些提交器,使用git filter-branch。我很想使用一些更复杂的逻辑,但我并不真正了解bash。的(工作)脚本我目前使用这个样子的:使用python脚本作为git过滤器分支的过滤器

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="[email protected]" 
fi 

export GIT_COMMITTER_NAME="$cn" 
export GIT_COMMITTER_EMAIL="$cm" 
' -- --all 

是否有可能对我使用python脚本作为--env-filter说法?如果是这样,我将如何访问$GIT_COMMITTER_NAME来读取和写入它?

我该如何做一个Python文件中的bash字符串的等价物?

在Python中,您需要import os,之后os.environ是一个带有传入环境的字典。 os.environ的更改会自动导出。这里真正的问题是,Git的--filter- *过滤器运行,因为它说:

使用eval命令,在外壳方面始终评估(与提交过滤器显着的例外,由于技术原因) 。

所以它的实际使用shell,如果你有外壳调用的Python,你风与外壳的子进程,并在Python进程作出不影响该外壳的任何变化。你不得不eval Python脚本的输出

eval `python foo.py` 

其中foo.py输出相应export命令:

import os 

def example(): 
    cn = os.environ['GIT_COMMITTER_NAME'] 
    cm = os.environ['GIT_COMMITTER_EMAIL'] 
    if cn == 'ew': 
     cn = 'Eric' 
     cm = '[email protected]' 
    print ('export GIT_COMMITTER_NAME="%s"' % cn) 
    print ('export GIT_COMMITTER_EMAIL="%s"' % cm) 

example() # or if __name__ == '__main__', etc. 

(以上全部是未经测试)。