目前,iOS 项目仓库体积越来越大,导致 Jenkins 拉取代码常常超时,本文记录了如何利用 bfg 工具删除 Git 仓库历史记录,达到精简仓库体积的目的。

参考文档:
http://harttle.com/2016/03/22/purge-large-files-in-gitrepo.html

1
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -20 | awk '{print$1}')"

这个命令通过两个 Git 命令结合实现仓库历史文件大小排序,找出待删除目录或文件。

后续找到一个更高效的工具 bfg,https://rtyley.github.io/bfg-repo-cleaner,支持更快速的实现 git-filter-branch 命令一样的彻底删除历史记录的功能。

1
2
3
4
5
bfg --delete-folders fastlane ./
bfg --delete-folders UMengFeedback_SDK_2.1.1 ./
bfg --delete-folders UMSocial_Sdk_4.2.2 ./
bfg --delete-folders AdhocSDK.framework ./
bfg --delete-folders node_modules ./

最后执行以下命令完成清理工作。

1
git reflog expire --expire=now --all && git gc --prune=now --aggressive

效果对比,左边是精简之前,右边是精简之后的体积。