为了从我们的存储库中删除构建结果,我运行了 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
两次?
最佳答案
大概在第一个 filter-branch
之后出现的那些是通过 refs/original/refs/heads/master
等命名的。 --all
表示refs/
下的所有 引用。请记住,filter-branch
保存(备份)refs/original/
下的原始引用(或您使用 定义的任何其他 namespace ——原创
)。如果过滤器分支操作弄得一团糟,您可以使用它们把东西放回去。
使用 -f
(强制),即使已经有一个备份分支命名空间,filter-branch
也会运行:它会删除旧备份以为新分支腾出空间新的一个。如果没有 -f
,它会这样做:
die "Cannot create a new backup.
A previous backup already exists in $orig_namespace
Force overwriting the backup with -f"
通过删除备份,second filter-branch
操作删除了所有 refs/original/
条目——这是您通常应该做的一旦您对过滤器的结果感到满意,请手动执行。在这种情况下,由于重新应用过滤器无害地没有做任何事情,第二个 filter-branch
负责为您清理。
关于git - filter-branch 仅在运行两次后才起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27029208/