35.4.4 父节点过滤器
参数—parent-filter用于设置父节点过滤器,该过滤器用于修改提交的父节点。提交原始的父节点通过标准输入传入脚本,而脚本的输出将作为提交的新的父节点。父节点参数的格式为:如果没有父节点(初始提交)则为空;如果有一个父节点,参数为"-p parent";如果是合并提交,则有多个父节点,参数为"-p parent1-p parent2-p parent3……"。
下面的命令将当前分支的初始提交嫁接到<graft-id>所指向的提交上。
$git filter-branch—parent-filter 'sed "s/^\$/-p<graft-id>/" ' HEAD
如果不是将初始提交(没有父提交)而是任意的一个提交嫁接到另外的提交上,可以通过GIT_COMMIT环境变量对提交进行判断,更改其父节点以实现嫁接。
$git filter-branch—parent-filter\
'test$GIT_COMMIT=<commit-id>&&\
echo"-p<graft-id>"||cat
'HEAD
关于嫁接,Git可以通过配置文件.git/info/grafts来实现[1],而git filter-branch命令可以基于该配置文件对版本库实现永久性的更改。
$echo "$commit-id$graft-id">>.git/info/grafts
$git filter-branch$graft-id..HEAD
[1]参见第8篇第41章“41.4.1提交嫁接”一节。