git过滤器分支:如何使用map函数?

git过滤器分支:如何使用map函数?,git,git-filter-branch,Git,Git Filter Branch,我正在处理父过滤器,我需要获取(可能)当前修订的父版本的重写修订ID。我可以在手册页上看到,有一个地图功能可以处理: 可以使用map函数,如果提交已被重写,则该函数接受“原始sha1 id”参数并输出“重写的sha1 id”,否则输出“原始sha1 id”;如果提交筛选器发出多个提交,map函数可以在单独的行上返回多个ID。 但是,当我尝试在父过滤器脚本(基于bash的脚本)中使用它时,该函数不可用: 我的代码中有: echo Finding mapping of revision $i

我正在处理父过滤器,我需要获取(可能)当前修订的父版本的重写修订ID。我可以在手册页上看到,有一个地图功能可以处理:

可以使用map函数,如果提交已被重写,则该函数接受“原始sha1 id”参数并输出“重写的sha1 id”,否则输出“原始sha1 id”;如果提交筛选器发出多个提交,map函数可以在单独的行上返回多个ID。

但是,当我尝试在父过滤器脚本(基于bash的脚本)中使用它时,该函数不可用:

我的代码中有:

    echo Finding mapping of revision $i >&2
    map $i >&2
    echo done >&2
处理时的结果:

Finding mapping of revision e73bf9db5c4ce2fb1970c90e3a24a2ff004ec3fe
rewrite_svn_parent.sh: line 44: map: command not found
done
理想情况下,我会这样做:
NEW\u ID=$(map$I)
,但只要函数不可用,就不能做很多事情


各种过滤器都作为
eval
op运行:

parentstr="$(echo "$parentstr" | eval "$filter_parent")" ||
(见附件)。这意味着您可以访问父shell中定义的shell函数。但在你自己的剧本里,你不再有它们了。这意味着您必须运行此shell中的所有内容,或者找到某种方法导出或复制筛选器分支的
映射(这显然取决于实现)

如果这是bash(或者如果您的
/bin/sh
是bash),您可以使用:

export -f bash; bash /path/to/script
作为父过滤器,并仍将其作为脚本编写。如果不是,那么“欺骗”方法(从过滤器分支本身获取实现)在实践中可能是不错的