使用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.
(以上全部是未经测试)。