我正在使用以下来源从我的存储库中删除一些大文件和目录:
http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/
git filter-branch
似乎只适用于当前分支 - 有没有办法一次将它应用于所有分支?
我正在使用以下来源从我的存储库中删除一些大文件和目录:
http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/
git filter-branch
似乎只适用于当前分支 - 有没有办法一次将它应用于所有分支?
解决方案很简单:
git filter-branch [options] -- --all
注意 中的四个破折号(两组双破折号,中间有一个空格)-- --all
。
如果您查看 的文档git-filter-branch
,它会说:
git filter-branch [--env-filter <command>] [--tree-filter <command>]
[--index-filter <command>] [--parent-filter <command>]
[--msg-filter <command>] [--commit-filter <command>]
[--tag-name-filter <command>] [--subdirectory-filter <directory>]
[--prune-empty]
[--original <namespace>] [-d <directory>] [-f | --force]
[--] [<rev-list options>…]
继续阅读,文档的开头说:“让您通过重写 <rev-list options> 中提到的分支来重写 git 修订历史,在每个修订上应用自定义过滤器。”
所以检查文档rev-list
给出:
< rev-list options >… git rev-list 的参数。这些选项包含的所有正引用都被重写。您也可以指定诸如 --all 之类的选项,但您必须使用 -- 将它们与 git filter-branch 选项分开。
并且文档git-rev-list
说:
--all
Pretend as if all the refs in refs/ are listed on the command line as <commit>.
正如@ben-lee 的回答所解释的,--all
重写所有分支都需要。如果您的存储库中有标签,您将需要清理所有这些以及分支,以获得减小大小的好处,这将需要额外的--tag-name-filter cat
咒语。
尽管问题指定了使用git filter-branch
,但提问者希望“从我的存储库中删除一些大文件和目录”,因此值得一提的是,这样做的最佳工具实际上是BFG Repo Cleaner,它是git filter-branch
. 例如:
$ bfg --strip-blobs-bigger-than 10M
...删除所有大于 10MB 的 blob(不在您的最新提交中),并适用于您的 repo 中的所有分支和标签。
全面披露:我是 BFG Repo-Cleaner 的作者。
我按照所有说明在我的 Windows 机器上执行此操作,但一直收到错误消息,直到我停止使用单引号并改用双引号。
我的动机是我不小心检查了我的vagrant
环境。vagrant
这是从所有分支中删除文件夹的命令:
git filter-branch --tree-filter "rm -rf vagrant" -f HEAD --all
只需替换vagrant
为您的目录名称,它就会从所有分支中删除该目录。