首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用python脚本作为git filter-branch的过滤器

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

Stack Overflow用户
提问于 2012-03-14 05:36:58
回答 1查看 1.6K关注 0票数 5

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

代码语言:javascript
运行
复制
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字符串的等价物?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-14 06:16:03

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

总是在shell上下文中使用eval命令进行计算(由于技术原因,提交过滤器是一个值得注意的例外)。

所以它实际上使用的是shell,如果您让shell调用Python,那么最终会得到shell的一个子进程,在Python进程中所做的任何更改都不会影响该shell。您必须对Python脚本的输出执行eval操作:

代码语言:javascript
运行
复制
eval `python foo.py`

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

代码语言:javascript
运行
复制
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.

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9692566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档