filter-branch仅在运行两次后才起作用

时间:2014-11-19 23:43:35

标签: git git-filter-branch

要从我们的存储库中删除构建结果,我运行了git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch */obj/*' -- --all。它似乎有效。

奇怪的是,运行git log --oneline --name-only --all -- */obj/*显示了仍包含obj目录的提交列表。

所以,我第二次跑filter-branch。 Git告诉我:

Rewrite d57c56e00f713854d8b5889a259e10bd9be6a83c (316/316)
WARNING: Ref 'refs/heads/master' is unchanged
WARNING: Ref 'refs/remotes/origin/master' is unchanged
WARNING: Ref 'refs/remotes/origin/carousel' is unchanged
WARNING: Ref 'refs/remotes/origin/master' is unchanged

现在,当我再次运行log命令时,历史记录为空。 obj目录不再在历史记录中。当然,这很好,但问题仍然存在:为什么我需要两次运行filter-branch

1 个答案:

答案 0 :(得分:5)

可能是在第一个filter-branch之后出现的那些是通过refs/original/refs/heads/master等命名的。 --all表示refs/下面的所有引用。请记住,filter-branch保存(备份)refs/original/下的原始引用(或您使用--original定义的任何其他名称空间)。如果过滤分支操作变得一团糟,你可以使用它们来回收东西。

使用-f(强制),即使已有备份分支名称空间,filter-branch也会运行:它会删除旧备份,以便为新备份腾出空间。如果没有-f,则执行此操作:

die "Cannot create a new backup.
A previous backup already exists in $orig_namespace
Force overwriting the backup with -f"

通过删除备份,第二个 filter-branch操作删除了所有refs/original/条目 - 一旦您对结果感到满意,通常应该手动执行此操作。过滤器。在这种情况下,由于过滤器的重新应用无害,所以第二个filter-branch负责清理。