简介

随着时间的推移,Git存储库变得越来越大。 将大文件添加到Git存储库后:

  1. 个人电脑硬盘空间有限,仓库较多时,占用了大量存储空间。
  2. 由于每个人都必须下载文件,因此获取代码库的速度变慢。
  3. 它们占用服务器上的大量存储空间。
  4. 会达到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 导出一份代码备份

-w1375

1.1.3 为做对比,工作电脑上创建两个文件夹

YMMCargoModule-fromfork 用来保留原始未瘦身前的状态

YMMCargoModule-fromfork-1 用来做瘦身操作

在开始操作前,这两个文件夹的内容完全相同。

1.1.4 记录一下YMMCargoModule-fromfork的分支状态

-w991

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/*'

遇到上图问题,说明有分支受保护,需要先解除保护。

-w1543

3.3 重写tags

git push origin --force 'refs/tags/*'

可能会遇到类似3.2的图示问题,说明有tag受保护,需要先解除保护。

git push origin --force 'refs/replace/*'

3.5 远程cleanup

如果配套使用的gitlab服务端版本较低,不支持远程clean,此步骤可以忽略,不影响瘦身后clone到本地电脑里的体积。

-w1463

上传 commit-map 文件,这个文件是git filter-repo执行过程中生成的,路径在.git->filter-repo,格式是txt,需要的话可以手动修改后缀名。

-w799

-w1456

4、收尾

-w803

4.1 看看执行瘦身操作的代码状态

-w1259

4.2 看看用来做对比的代码状态

-w893

4.3 重新clone一份瘦身后的代码

确实瘦身了。

-w1367

-w1367

历史分支、tags都在。

4.4 还原设置

受保护的分支、tags继续保护起来

小结

多人协作

1.操作前通知所有人将手头代码提交到远程,且保证自己电脑里的代码是最新的,各个本地跟踪的分支都更新到最新

2.开始操作后,禁止大家提交代码

3.操作完通知大家重新clone

4.将Pods目录、framework等加入git的忽略文件

5.如果历史podspec 中直接引用库目录下的framework等文件,因为瘦身删除记录后,这些framework已经不存在,因此,老旧的spec就用不了了。这种情况需要新做podspec,将大文件托管在阿里云或腾讯云。