要从我们的存储库中删除构建结果,我运行了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
?
答案 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
负责清理。