35.4.6 提交过滤器
参数—commit-filter用于设置提交过滤器。提交过滤器所给出的脚本,在版本库重整过程的每次提交时运行,取代要默认执行的git commit-tree命令。不过一般情况下会在脚本中调用git commit-tree命令。传递给脚本的参数格式为"<TREE_ID>[(-p<PARENT_COMMIT_ID>)……]",提交日志以标准输入的方式传递给脚本。脚本的输出是新提交的提交ID。作为扩展,如果脚本输出了多个提交ID,则这些提交ID作为子提交的多个父节点。
使用下面的命令,可以过滤掉空提交(合并提交除外)。
$git filter-branch—commit-filter'
git_commit_non_empty_tree "$@" '
函数git_commit_non_empty_tree是在脚本git-filter-branch中已经定义过的函数。可以打开文件$(git—exec-path)/git-filter-branch查看。
if you run 'git_commit_non_empty_tree "$@" ' in a commit filter,
it will skip commits that leave the tree untouched,commit the other.
git_commit_non_empty_tree()
{
if test$#=3&&test "$1"=$(git rev-parse "$3^{tree}");then
map "$3"
else
git commit-tree "$@"
fi
}
如果只想跳过某个用户(如badboy)的提交,而无论该提交是否为空,可以使用下面的命令:
$git filter-branch—commit-filter'
if["$GIT_AUTHOR_NAME"="badboy"];
then
skip_commit "$@";
else
git commit-tree "$@";
f'HEAD
其中,函数skip_commit也是在脚本git-filter-branch中已经定义好了的。该函数的作用就是处理传递给提交过滤器脚本的参数"<tree_id>-p parent1-p parent2……",形成"parent1 parent2"的输出。参见Git命令脚本$(git—exec-path)/git-filter-branch中相关的函数。
if you run 'skip_commit "$@" ' in a commit filter,it will print the(mapped)
parents,effectively skipping the commit.
skip_commit()
{
shift;
while[-n "$1"];
do
shift;
map "$1";
shift;
done;
}