Eog*_*anM 50 git git-filter-branch git-rewrite-history
我正在使用以下来源从我的存储库中删除一些大型文件和目录:
http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/
git filter-branch 似乎只能在当前分支上工作 - 是否有办法立即将其应用于所有分支?
Ben*_*Lee 75
解决方案很简单:
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>…]
Run Code Online (Sandbox Code Playgroud)
阅读,文档的开头说:"让你通过重写<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>.
Run Code Online (Sandbox Code Playgroud)
正如@ ben-lee的回答所解释的那样,--all需要重写所有分支.如果您的仓库中有标签,您将需要清理所有这些以及分支,以获得减小尺寸的好处,这将需要额外的--tag-name-filter cat咒语.
虽然问题指定使用git filter-branch,但是提问者想要" 从我的存储库中删除一些大文件和目录 ",所以值得一提的是,实现这一目标的最佳工具实际上是BFG Repo Cleaner,一种更简单,更快速的替代方法git filter-branch.例如:
$ bfg --strip-blobs-bigger-than 10M
Run Code Online (Sandbox Code Playgroud)
...删除大于10MB的所有blob(不在最近的提交中),并且可以处理repo中的所有分支和标记.
完全披露:我是BFG Repo-Cleaner的作者.
我按照在我的 Windows 机器上执行此操作的所有说明进行操作,但我一直收到错误消息,直到我停止使用单引号并改用双引号为止。
我的动机是我不小心检查了我的vagrant环境。这是vagrant从所有分支中删除文件夹的命令:
git filter-branch --tree-filter "rm -rf vagrant" -f HEAD --all
Run Code Online (Sandbox Code Playgroud)
只需替换vagrant为您的目录名称,它就会从所有分支中删除该目录。