你在这里有两个选择。 你可以评估$subdir
来建立一个固定的sed
命令,然后将其设置为你的过滤器;或者你可以评估git filter-branch
将调用的shell片段中的一个变量。
为了理解后者,请意识到你的--index-filter
字符串变成了一个普通的shell变量:
--index-filter)
filter_index="$OPTARG"
which is then passed to eval
:
eval "$filter_index" < /dev/null ||
die "index filter failed: $filter_index"
替换代码5】意味着$filter_index
中的表达式,由你的--index-filter
参数设置,可以访问所有的shell变量和函数。过滤分支脚本. 不幸的是,它没有一个私营变量持有你想要的表达式--但你可以访问其environment变量,这意味着你可以把数值放到环境变量中。 换句话说,你可以把subdir=<whatever>
作为一个environment到你原来的表达。
在任何情况下,由于bk2204 回答你需要删除-i
选项。 除此之外,有些版本的sed
不接受\t
作为制表符(估计你的版本接受,只是要注意这个)。
要在前面扩展变量,只需这样做。 比如说
... --index-filter \
'git ls-files -s | sed "s-\t\"*-&'$folder'/-" | ...
(我自己把这里的-i
去掉了)。 请注意,这里是如何退出单引号,展开$folder
,然后重新进入单引号的。 如果$folder
可能包含空格,请确保在这里扩展它时使用双引号。
... --index-filter \
'git ls-files -s | sed "s-\t\"*-&'"$folder"'/-" | ...