我使用下列来源,从我的仓库抹去一些大的文件和目录过滤分支:混帐,所有分支上
http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/
Why is my git repository so big?
git filter-branch
似乎只在工作当前分支 - 是否有办法一次将其应用到所有分支?
我使用下列来源,从我的仓库抹去一些大的文件和目录过滤分支:混帐,所有分支上
http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/
Why is my git repository so big?
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>…]
阅读,在文档的开头说:“让您通过重写<提到的分支改写git的修订历史记录rev-list选项>,在每个修订版上应用自定义过滤器。“
所以检查文档为rev-list
给出:
< REV-列表选项> ...混帐为REV-列表参数。这些选项包含的所有正面参考 都被重写。您也可以指定选项 ,例如 - all,但您必须使用 - 将它们与git filter-branch选项分开。
而对于git-rev-list
文档说:
--all
Pretend as if all the refs in refs/ are listed on the command line as <commit>.
正如@奔 - 李的回答解释说,--all
需要重写所有分支。如果您的回购中有标签,您需要清除所有那些以及分支机构,以便获得减小尺寸的好处,并且这将需要额外的--tag-name-filter cat
咒语。
虽然问题指定使用git filter-branch
,提问要“从我的仓库删掉一些大的文件和目录”,所以它是值得一提的是,最好工具,这样做实际上是The BFG Repo Cleaner,更简单,更快的替代git filter-branch
。例如:
$ bfg --strip-blobs-bigger-than 10M
...删除超过10MB的所有斑点(不在你最新提交),并适用于所有分支标签&在你的回购协议。
完全披露:我是BFG Repo-Cleaner的作者。
没问题@EoghanM - 你可能会发现这个演示视频很有趣 - 它是git filter-branch和BFG(运行在Raspberry Pi上)之间的竞赛。http://www.youtube.com/watch?v=Ir4IHzPhJuI –
我遵循所有的说明,在我的Windows机器上这样做,但我一直得到一个错误,直到我停止使用单引号并使用双引号代替。
我的动机是我不小心检查了我的vagrant
环境。这里的命令从所有分支删除vagrant
文件夹:
git filter-branch --tree-filter "rm -rf vagrant" -f HEAD --all
与目录名称只需更换vagrant
,它会从所有分支删除该目录。
只是为了阐明,通常'filter-branch'在最后用'HEAD'列出,' - --all'代替'HEAD' – EoghanM
如何使它在PowerShell(Windows)中工作?它保持错误并显示“filter-branch”的帮助信息。根据Paul的回答,我尝试改为双引号,但我无法在那里找到双引号(请参阅我对答案的评论)。 – ADTC
我通过使用管道解决了上述问题(在PowerShell函数中)。基本上:'git rev-list --all | git filter-branch [options]'(最后没有rev-list)而不是'git filter-branch [options] - --all'。 – ADTC