简介
随着时间的推移,Git存储库变得越来越大。 将大文件添加到Git存储库后:
- 个人电脑硬盘空间有限,仓库较多时,占用了大量存储空间。
- 由于每个人都必须下载文件,因此获取代码库的速度变慢。
- 它们占用服务器上的大量存储空间。
- 会达到Git仓库的存储限制。
重写存储库会删除不需要的历史记录,从而使存储库更小。 git filter-repo是用于快速重写Git存储库历史记录的工具。
重要:
重写存储库历史记录是一种破坏性操作。
在开始之前,请确保备份您的存储库。
备份存储库的最佳方法是导出项目。
gitlab官方文档:
https://docs.gitlab.com/ee/user/project/repository/reducing_the_repo_size_using_git.html#repository-cleanup
git-filter-repo用法:
https://htmlpreview.github.io/?https://github.com/newren/git-filter-repo/blob/docs/html/git-filter-repo.html#EXAMPLES
操作演示
YMMCargoModule库比较大、研发使用非常高频,具有代表性,以它为例。
YMMCargoModule 仓库未瘦身前.git目录 771.6MB。
1、准备工作
1.1、1.2、1.3、1.4 是防止经验不足误操作做的一些保护措施及演示,不是本文重点,可以忽略。
此次演示,基于备份库操作,不会误伤主库。
备份库:
http://codebak.amh-group.com/
用户名、密码同主库。
1.1、代码备份-熟练后可忽略
1.1.1 fork一份代码,在fork库上操作
1.1.2 导出一份代码备份
1.1.3 为做对比,工作电脑上创建两个文件夹
YMMCargoModule-fromfork 用来保留原始未瘦身前的状态
YMMCargoModule-fromfork-1 用来做瘦身操作
在开始操作前,这两个文件夹的内容完全相同。
1.1.4 记录一下YMMCargoModule-fromfork的分支状态
1.2、 安装插件
安装git-filter-repo
需要pip3,如果没有,请自行配置,本文不做展开。
pip3 install git-filter-repo
2、瘦身操作
2.1 查看top 100 大文件
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -100 | awk '{print $1}')"
可以看出,大文件多数集中在Pods文件夹内。 而这个文件夹对于iOS的工程来说,是不需要使用git管理的。 应该是早期不规范或者误操作给上传到了仓库里。 虽然这个文件夹现在已经被删除了,但是提交记录还在。
2.2 记录当前的.git目录大小
2.3 移除Pods记录
git filter-repo --path-glob 'YMMCargoModule/Pods/*' --invert-paths --force
移除Pods记录后,记录.git占用空间
可以看出,瘦身很明显,从771.6MB降到了165MB。 再看看剩下的top 100大文件是什么,重复2.1的操作。
xcuserdata 这个目录在iOS工程里也是不需要使用git维护的。
2.4 移除xcuserdata
git filter-repo --path-glob 'YMMCargoModule/YMMCargoModule.xcworkspace/xcuserdata/*' --invert-paths --force
瘦身很明显,从165MB降到了17.8MB。
2.5 移除其它非必要的文件
参考2.3、2.4两步,重复操作几次。
剩下的都是.m等代码文件,可以不用再删了。
3、变更远程仓库
第2步操作的都是本地文件,需要提交变更记录到远程。
3.1 添加源
git remote add origin http://codebak.amh-group.com/Y0012230/YMMCargoModule.git
3.2 重写branches
git push origin --force 'refs/heads/*'
遇到上图问题,说明有分支受保护,需要先解除保护。
3.3 重写tags
git push origin --force 'refs/tags/*'
可能会遇到类似3.2的图示问题,说明有tag受保护,需要先解除保护。
3.4 解除dead links
git push origin --force 'refs/replace/*'
3.5 远程cleanup
如果配套使用的gitlab服务端版本较低,不支持远程clean,此步骤可以忽略,不影响瘦身后clone到本地电脑里的体积。
上传 commit-map
文件,这个文件是git filter-repo执行过程中生成的,路径在.git->filter-repo,格式是txt,需要的话可以手动修改后缀名。
4、收尾
4.1 看看执行瘦身操作的代码状态
4.2 看看用来做对比的代码状态
4.3 重新clone一份瘦身后的代码
确实瘦身了。
历史分支、tags都在。
4.4 还原设置
受保护的分支、tags继续保护起来
小结
多人协作
1.操作前通知所有人将手头代码提交到远程,且保证自己电脑里的代码是最新的,各个本地跟踪的分支都更新到最新
2.开始操作后,禁止大家提交代码
3.操作完通知大家重新clone
4.将Pods目录、framework等加入git的忽略文件
5.如果历史podspec 中直接引用库目录下的framework等文件,因为瘦身删除记录后,这些framework已经不存在,因此,老旧的spec就用不了了。这种情况需要新做podspec,将大文件托管在阿里云或腾讯云。