繁体   English   中英

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

[英]Using a python script as the filter for git filter-branch

我正在尝试使用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字符串等效的操作?

在python中,您需要import os ,之后os.environ是其中包含传入环境的字典。 os.environ更改将自动导出。 真正的问题是,运行git的--filter- *过滤器,如下所示:

总是使用eval命令在shell上下文中进行评估(出于技术原因,commit过滤器的显着例外)。

因此,它实际上是在使用外壳程序,如果您让外壳程序调用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 = 'my.email@provider.com'
    print ('export GIT_COMMITTER_NAME="%s"' % cn)
    print ('export GIT_COMMITTER_EMAIL="%s"' % cm)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM