由于不小心将大的压缩包文件放到了项目下,提交的时候又 push
到远程仓库去了,虽然后来我把文件删掉了重新提交,但 Git
周到的为你保存了每个文件的前生后世防止你哪天又要找回你删除过的文件,导致项目下的 .git
子目录依然存在这些大文件的提交记录,占用大量空间。
那如果我确认以后再不需要这个大文件,如果彻底从 git
仓库和提交记录里面删除它呢?
这时候我们就需要用到 filter-branch
,这个命令就可以修改历史提交记录,从而达到清理错误提交记录。
找出要清理的大文件
从pack中找出大小前5的提交
git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -5
555922f3a8beb739947557fd3077d7df60853942 blob 112286 9456 2350899
29287f8277ab91c236fb900e01e359ad644bc23c blob 115429 106354 2564718
171ac105474059ac1516da7fd69e766ada224601 blob 191474 173934 203438
cf1424ebb13896096d4ee1ff489e845d5dcbdc0f blob 240395 226516 2695384
e6c8359c60114452215c8f1057572a5c378f3602 blob 2345531 1970287 380612
列出提交包含的文件
从这里面找出要删除的大文件。
git rev-list --objects --all | grep e6c8359c60114452215c8f1057572a5c378f3602
e6c8359c60114452215c8f1057572a5c378f3602 documents/20181224/1.db
可以看到这次很占空间 e6c8359c60114452215c8f1057572a5c378f3602
的提交里的这个 documents/20181224/1.db
文件就是我们要找的,现在从提交记录里清除掉它。
从历史记录中删除
这里也可以使用通配符 *
来删除某个目录,比如 documents/*
这样就清除了 documents
目录。
git log --pretty=oneline --branches -- documents/20181224/1.db
重写(Rewrite)所有的 commit
使用 git filter-branch
命令来重写 commit
。同样的,这里也支持通配符匹配目录。
git filter-branch --index-filter 'git rm --cached --ignore-unmatch documents/20181224/1.db' -- --all
清除无效的引用
现在,这个文件已经从历史记录中被清除。但运行 filter-branch 产生的日志还是会对该文件有引用,需要清除一下无效引用。
rm -Rf .git/refs/original
rm -Rf .git/logs
git gc
git prune
强制提交
经过上面的操作,我们已经抹掉了那个目标文件在这个项目中的 git
记录(感觉有点像谍战片里所有资料被抹掉的卧底),提交到仓库。
git push --force
Git为我们提供的 filter-branch
还有很多其他用法,可以参考:git-filter-branch – Rewrite branches
标题:使用filter-branch抹掉错误提交的大文件提交记录,彻底清理.git目录
原文链接:https://beltxman.com/2931.html
若无特殊说明本站内容为 行星带 原创,未经同意请勿转载。
我也遇到过这样的问题,mark
我是不小心把项目原型图放项目里还提交了,900MB+,我的乖乖