git仓库压缩瘦身

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 '{print$1}')"
# 从历史中删除 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

详细说明

  1. 显示历史记录过的所有文件

示例中的命令是用来显示历史中体积最大的 5 个文件

git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$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

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

  1. 触发垃圾回收, 删除没有被引用的文件

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

git gc --prune=now
  1. 同步到远程仓库

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

git push origin --force --all

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

git push origin --force --tags

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

参考链接

  • Removing sensitive data from a repository 这个文章主要是讲如何移除历史中的敏感数据, 刚好符合我的需求–删除历史中的某些文件
  • 如何控制 Git 库的膨胀? GC 一步搞定! 如果你使用的是gitee, 那这个文章将非常适合你, gitee项目管理有提供这个功能
  • 为Git仓库瘦身 这个文章非常好地讲述了删除的过程做了什么内容, 给出了思路, 适合喜欢研究原理的同学
  • BFG Repo-Cleaner 这个是GitHub官方推荐的清理工具, 非常好用, 据说是封装了 git filter-branch 命令, 但它又自称比命令行还快
  • 给你的git仓库瘦身 瘦身步骤的一个简略的介绍, 如果是第一次使用瘦身, 可能看不懂这个文章, 也无法实践, 但给二次使用的人提供了便利–可以复制的命令行
  • 10
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值