当初看 Pro Git 时就被做者这个“核弹级选项”的称呼吓到了,所以一直没敢好奇地去尝试。核弹啊,用对了威力无穷,用错了破坏力无穷!html
可是,今天,我不得不用了,由于我想把个人原来写一些代码放到 github 上去公开。因为以前没想过要公开,到上传时才发现不能上传大于50M的文件。java
折腾了半天,仍是没法上传,因而,整个命令出来了:git
--tree-filter
表示修改文件列表。--msg-filter
表示修改提交信息,原提交信息从标准输入读入,新提交信息输出到标准输出。--prune-empty
表示若是修改后的提交为空则扔掉不要。在一次试运行中我发现虽然文件被删除了,可是还剩下个空的提交,就查了下 man 文档,找到了这个选项。-f
是忽略备份。不加这个选项第二次运行这个命令时会出错,意思是 git 上次作了备份,如今再要运行的话得处理掉上次的备份。--all
是针对全部的分支。试运行了几回,看到 40 屡次提交逐一被重写,而后检查下,发现要删除的文件确实被删除了。因而高兴地到 github 创建新仓库,并上传了。bash
折腾完毕,我更加喜欢 git 了 :-)工具
下面是具体的使用方法,主要是要gc,再覆盖到远程仓库。spa
git filter-branch --index-filter 'git rm --cached --ignore-unmatch <your-file-name>' rm -rf .git/refs/original/ git reflog expire --expire=now --all git fsck --full --unreachable git repack -A -d git gc --aggressive --prune=now git push --force origin master
------------------
2019-06-25更新,--all参数好像不能使用了,其实有更方便的第三方工具BFG可使用,支持指定文件大小和文件名。
https://rtyley.github.io/bfg-repo-cleaner/code
顺便也写下BFG的使用方式吧htm
首先仓库要使用bare方式,克隆的时候要加上--bare或者--mirror选项。
ip
删除100M以上的文件
java -jar bfg.jar --strip-blobs-bigger-than 100M some-big-repo.git
删除test.sdf文件
java -jar bfg.jar --delete-files test.sdf some-big-repo.git
删除_Boot 文件夹
java -jar bfg.jar --delete-folders _Boot some-big-repo.git
最后要gc,再push到远程仓库
git reflog expire --expire=now --all && git gc --prune=now --aggressivegit push --force --all