我正在使用以下来源从我的存储库中删除一些大型文件和目录:
http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/
Why is my git repository so big?
git filter-branch
似乎只适用于当前分支 - 是否有办法立即将其应用于所有分支?
答案 0 :(得分:71)
解决方案很简单:
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>…]
继续阅读,文档的开头说:“通过重写&lt; rev-list options&gt;中提到的分支,在每个修订版上应用自定义过滤器,可以重写git修订历史记录。”
因此,检查rev-list
的文档会给出:
&LT; rev-list options&gt; ... 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>.
答案 1 :(得分:6)
正如@ ben-lee的回答所解释的那样,重写所有分支都需要--all
。如果您的回购中有标记,则需要清除所有那些以及分支,以便获得缩小尺寸的好处,并且需要额外的--tag-name-filter cat
咒语。
虽然问题指定使用git filter-branch
,但是提问者想要“从我的存储库中删除一些大型文件和目录”,所以值得一提的是最好实现这一目标的工具实际上是 The BFG Repo Cleaner ,是git filter-branch
的一种更简单,更快捷的替代方法。例如:
$ bfg --strip-blobs-bigger-than 10M
...删除所有大于10MB的blob(不在最新提交中),并且可以在所有分支&amp;你的回购中的标签。
完全披露:我是BFG Repo-Cleaner的作者。
答案 2 :(得分:3)
我按照所有说明在我的Windows机器上执行此操作,但我一直收到错误,直到我停止使用单引号并使用双引号代替。
我的动机是我不小心检查了vagrant
环境。这是从所有分支中删除vagrant
文件夹的命令:
git filter-branch --tree-filter "rm -rf vagrant" -f HEAD --all
只需用您的目录名替换vagrant
,它就会从所有分支中删除此目录。