git filter-branch:我该如何使用map函数?

时间:2017-06-02 16:36:56

标签: git git-filter-branch

我正在使用父过滤器,我需要获取当前版本父项的(可能)重写的修订版ID。我可以在man-page上看到有一个 map 函数可以解决这个问题:

A map function is available that takes an "original sha1 id" argument and outputs a "rewritten sha1 id" if the commit has been already rewritten, and "original sha1 id" otherwise; the map function can return several ids on separate lines if your commit filter emitted multiple commits.

但是,当我尝试在我的父过滤器脚本(基于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_ID=$( map $i )但只要该功能不是可用,就不能做太多。

https://git-scm.com/docs/git-filter-branch

1 个答案:

答案 0 :(得分:0)

每个过滤器都以eval op:

运行
parentstr="$(echo "$parentstr" | eval "$filter_parent")" ||

(见https://github.com/git/git/blob/master/git-filter-branch.sh#L389)。这意味着您可以访问父shell中定义的shell函数。但是在你自己的剧本中你不再拥有它们。这意味着您必须运行此shell中的所有内容,或者找到某种方法来导出或重现filter-branch的mapisn't really that hard,但显然您在很大程度上依赖于实现)。

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

export -f bash; bash /path/to/script

作为父过滤器,仍然将其写为脚本。如果没有,那么,“作弊”方法(从过滤器分支本身获取实现)在实践中可能很好。