git仓库压缩瘦身

148 阅读4分钟

git仓库压缩瘦身 场景及思考过程 快速使用 详细说明 参考链接 场景及思考过程 我自己有个项目做了好几年, 虽然提交的次数不多, 但因为技术不成熟, 设计的时候改了又改, 引入了很多不必要的文件, 又删除了很多不必要的文件, 导致仓库源代码 10KB 但历史数据占了 10MB 的情况, 非常尴尬, 这个时候就想到了给仓库压缩一下, 删除无用的历史, 每次 git clone的时候少费点流量.

百度过后发现国内相关的文章非常少, 完全不能解决问题, 转而向google求助, 关键词大概是 git 远程仓库压缩 git 仓库瘦身 git filter-branch remote git gc remote 等

快速使用

查看历史大文件

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

从历史中删除 target/ 这个文件夹

git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch target/' --prune-empty --tag-name-filter cat -- --all

执行仓库压缩

git gc --prune=now

推送到远程仓库

git push origin --force --all

详细说明 显示历史记录过的所有文件 示例中的命令是用来显示历史中体积最大的 5 个文件

git rev-list --objects --all | grep "(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print1}')" 1 有点Shell脚本基础的同学应该很容易看出来, 主要就是 git ref-list 命令

git rev-list --objects --all 1 后面是筛选与排序, 当你对项目的结构非常了解的时候, 你大可不用排序,直接跳过这一步

从历史中删除文件引用 这一步是核心步骤, 把文件/文件夹从历史中删除, 示例命令删除的是 target/ 目录, 如果读者想要删除其他文件/文件夹, 例如删除 readme.md 文件, 可以改写成

git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch readme.md' --prune-empty --tag-name-filter cat -- --all 1 这个命令的主要核心是 git filter-branch , 次要核心是 git rm git rm 的用法和 shell 脚本里的删除命令 rm 是一样的, -r 参数是因为删除的内容是文件夹才要加, 表示递归删除, 如果你只是要删除文件, 那大可不加 -r 关于 git filter-branch 命令的参数, 我没有作深入了解, 因为懒, 而且也足以解决手头的问题了, 哈哈 顺便提一下, 如果你删除的文件夹是目前还在使用的, 那也会被删除, 我就不小心把我 src/main/webapp 文件夹删除了, 还好我有克隆到其他文件夹备份, 文件可以快速找回来

触发垃圾回收, 删除没有被引用的文件 这一个步骤是真正让仓库缩小的命令, 上一步只是删除了引用,是逻辑结构上的删除, 而这一步是删除文件, 从物理上减少了磁盘空间使用, 如果你了解一些虚拟机的话, 你肯定知道我在说什么 示例中使用的 --prune 参数是时间, 如果你想了解具体的参数规则, 可以去 git-scm.com 找找官方文档

git gc --prune=now 1 同步到远程仓库 执行完以上所有步骤后, 只是本地仓库瘦身了, 而远程仓库并没有, 所以需要推到远程仓库 核心命令是 git push

git push origin --force --all 1 参数 origin 是远程仓库地址别名, 具体请参照 git remote 命令 参数 --force 是强制推送, 这个参数表示强行覆盖远程仓库, 这个参数跟TNT炸药一样不能乱用, 它可以简写为 -f 参数 --all 表示所有历史都要覆写, 当然我不知道这里的 “全部” 是多少, 教程里还提到了再提交一次 tags 的

git push origin --force --tags 1 这样可以把打了 tag 的提交也改变历史, 我没有尝试. 因为已经成功压缩仓库了

参考链接 Removing sensitive data from a repository 这个文章主要是讲如何移除历史中的敏感数据, 刚好符合我的需求–删除历史中的某些文件 如何控制 Git 库的膨胀? GC 一步搞定! 如果你使用的是gitee, 那这个文章将非常适合你, gitee项目管理有提供这个功能 为Git仓库瘦身 这个文章非常好地讲述了删除的过程做了什么内容, 给出了思路, 适合喜欢研究原理的同学 BFG Repo-Cleaner 这个是GitHub官方推荐的清理工具, 非常好用, 据说是封装了 git filter-branch 命令,