使用python脚本作为git filter-branch的过滤器

时间:2012-03-13 21:36:58

标签: python git bash

我正在尝试使用git filter-branch重命名git存储库中的一些提交者。我非常想使用一些更复杂的逻辑,但我并不真正理解bash。我正在使用的(工作)脚本如下所示:

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

我可以使用python脚本作为--env-filter参数吗?如果是这样,我将如何访问$GIT_COMMITTER_NAME来读取和写入它?

如何在python文件中执行等效的bash字符串?

1 个答案:

答案 0 :(得分:5)

在python中,你需要import os,之后os.environ是一个包含传入环境的字典。对os.environ的更改会自动导出。这里真正的问题是运行git的--filter- *过滤器,正如它所说:

  

始终使用eval命令在shell上下文中进行评估(出于技术原因,提交过滤器有明显的例外)。

所以它实际上是在使用shell,如果你有shell调用Python,你最终会得到shell的子进程,并且Python进程中所做的任何更改都不会影响该shell。您必须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 = 'my.email@provider.com'
    print ('export GIT_COMMITTER_NAME="%s"' % cn)
    print ('export GIT_COMMITTER_EMAIL="%s"' % cm)

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

(上述所有内容均未经测试)。