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

标签 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 两次?

最佳答案

大概在第一个 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/

相关文章:

git - 如何在 jenkins 中针对 master 分支运行 git diff-tree?

.net - 来自 Windows 控制台应用程序的退出代码在 git 钩子(Hook)脚本中不可用

javascript - git : How to move git folder inside subfolder and rewrite history to pretend it always was like that?

带有 --subdirectory-filter 的 git filter-branch 删除所有文件

git:如何从项目中分离出库?过滤器分支,子树?

重命名文件夹后的 Git 过滤

git - 有选择地将文件和目录移动到新的仓库(保留历史记录)

git - "Connection to github.com closed by remote host"推送时

git - 如何结合使用 Git 和 Dropbox?

git - 如何在保持 HEAD 位于当前变更集的同时 checkout 另一个变更集?