我正在使用父过滤器,我需要获取当前版本父项的(可能)重写的修订版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 )
但只要该功能不是可用,就不能做太多。
答案 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的map
(isn't really that hard,但显然您在很大程度上依赖于实现)。
如果这是bash(或者你的/bin/sh
是bash),你可以使用:
export -f bash; bash /path/to/script
作为父过滤器,仍然将其写为脚本。如果没有,那么,“作弊”方法(从过滤器分支本身获取实现)在实践中可能很好。