使用filter-branch抹掉错误提交的大文件提交记录,彻底清理.git目录

由于不小心将大的压缩包文件放到了项目下,提交的时候又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,若无特殊说明本站内容为 行星带 原创,未经同意禁止转载。

使用filter-branch抹掉错误提交的大文件提交记录,彻底清理.git目录”上有 2 条评论;

评论已关闭。

Scroll to top