Git仓库减肥指南

情景描述:之前在网上开源的一款主题项目,短短半年时间受到很多网友的喜爱,也收获了一批忠实粉丝,社区也比较活跃,前段时间就有个用户提出了一个问题,就是主题的压缩包已经高达30多M,懂技术的人应该都知道这个问题的严重性,一个静态的主题高达30M那真的是一个灾难性问题。后来花了些时间将主题包的大小从30M压缩到6M,再经过github官方压缩,成功降到1M,也算是一个比较不错的优化案例了吧。在这里将我优化中遇到的问题和经验总结下。

查找问题

首先通过浏览文件夹找到了导致项目体积变大的两个原因,第一个就是主题中自带的看板娘素材,主题中一共带了5种看板娘,导致了看板娘的资源包在3M多;其次就是.git文件变得非常大,大概有30M;前者的问题还好解决,只要将静态资源移除,放在CDN上就行了,但是后者着实让我很郁闷.

git文件过大原因

git的版本控制是通过类似增量复制的一种操作手段,也就是说在你的提交历史记录中只要存在这个文件,只要commit了,那么就是通过复制将其保存在git的历史版本中,也就是说你当前版本中可能没有这个文件,但是历史版本中还是存在这个文件,也就是说根本就没有删除掉这个文件,其实想想也完全理解,毕竟git支持版本回退,如果不保存的话,那回退的版本岂不是没有这些文件了。

解决问题

虽然git的大小不影响主题的上传速度 ,但是会影响主题的下载速度,github本来就慢,压缩包再弄的这么大,那简直就是雪上加霜,所以优化git文件还是有必要的,这里的git文件是指**.git隐藏文件**。
将遇到的问题直接google,就出现了专业对应的文章,不过网上的文章太多还杂,有的根本就无法解决问题,这里我贴出我解决问题的文章:为Git仓库瘦身,不过我在操作的过程中还是遇到了一些问题,接下来针对自己的理解重新整理一遍。

命令

为git瘦身主要就是用到以下结果命令,来剔除体积比较大的文件,不过为了以防万一,在操作之前一定要先做备份、备份、备份

# 1. 过滤git仓库中的体积比较大的文件,-10代表的是最大的十个文件,输出结果是升序,有点不太适应
git verify-pack -v .git/objects/pack *.idx | sort -k 3 -n | tail -10
e28b267b24de7d5b32ed2391669df8a72e24257d blob   162449408 62757122 757958127
c32c8b1da1c6283b250402aa31cde35051a52b3d blob   177733120 59785053 1360726301
711c9b581771981c54b4637497ceeb4bb23012bd blob   188976128 70107988 2347396900
d5cb26ac04328a255e922a24ea271ee50901c59d blob   196414976 74351707 1500585499
...

# 2. 将第一步中得到的hash id作为参数,使用下面的命令查找hash id对应的文件(全路径)
git rev-list --objects --all | grep d5cb26ac04328a255e922a24ea271ee50901c59d
e28b267b24de7d5b32ed2391669df8a72e24257d xxx/xx/file

# 3. 将上述的xxx/xx/file文件作为参数,结合下面的命令开始清理工作
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch xxx/xx/file' --prune-empty --tag-name-filter cat -- --all

# 4. 清理废弃的引用
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin

# 5. 最后,重新打包
git reflog expire --expire=now --all
git gc --prune=now

上述的操作过程中有很多参数要注意替换,所以看得时候一定要仔细,还有就是以上操作绝对有效,指令也都正确,亲测。不过在使用的时候可能会遇到写意想不到的情况,就比说下面截图的情况:

上图中有很多err bad ref .git/xxx类似的错误,这类错误的主要原因就是你的git仓库可能已经损坏,这个时候可以打开.git文件查看一下有没有异常的地方,如:文件名异常,文件大小异常。那怎么算作异常呢,找个正常的对比下就知道了,如果真的是发生了异常,建议大家从新clone下项目,然后按照上述的操作或者使用之前备份的项目再来一遍。

进阶

上述的操作只适合删除一个文件,如果有多个文件要删除,那么难免会有重复性的工作,所以建议写个脚本来解决一下,不过对于小白和新手来说,能解决问题就不错了,写脚本操作那就是给自己找麻烦,不过我觉的不想成为大佬的小白不是一个合格的小白,后面我再抽空找个机会试一下🤣,暂时先到这吧