git filter-branch 没有删除我的目录

git filter-branch is not removing my directory

我的 git 存储库顶部有一个 incubator 目录,我想将其从历史记录中完全删除。我试过:

git filter-branch --force --tree-filter "rm -rf incubator/" --prune-empty HEAD

并且:

git filter-branch --force --index-filter "git rm --cached -r -f --ignore-unmatch incubator" --prune-empty

但其中 none 有效。

我是不是做错了什么?有没有办法让我看到发生了什么或者为什么这个目录没有被删除?

重写 Git 历史是一个棘手的过程,git-filter-branch 并不容易(见下文),因此请改用 the BFG,一种比 [= 更简单、更快速的替代方法12=],专门用于从 Git 历史记录中删除不需要的文件。

认真跟BFG的usage instructions - 核心部分就是这样:

$ java -jar bfg.jar  --delete-folders incubator  my-repo.git

任何名为 incubator 的文件夹(不在您的 最新 提交中)将从您的 Git 存储库的历史记录中删除。然后您可以使用 git gc 清除死数据:

$ git gc --prune=now --aggressive

BFG 通常至少 10-720x 比 运行 git-filter-branch 快,并且通常更易于使用。

...正在诊断 git 过滤器分支故障?

因为(如上所述)重写 Git 历史是一项复杂的工作,有 很多 种方法可能出错,所以您可能需要添加更多详细说明您在问题中说 "But none of them worked" 的位置。您使用的 git filter-branch 咒语看起来会做 某事 - 它会从您的 master 分支中删除 incubator 文件夹 - 它至少做到了吗?也许您希望它从其他分支中删除,在这种情况下您需要添加 --all 标志,或者您可能希望它也从标记的提交中删除,这需要 --tag-name-filter cat。更多详情:

很多事情都可能出错,如果可以的话,你最好使用 BFG。

完全披露:我是 BFG Repo-Cleaner 的作者。