Git 版本库如何瘦身?
随着git仓库的使用,仓库的体积越来越大,主要是.git
文件夹记录了所有的历史记录。它能否“瘦身”呢?又该如何操作呢?
查看仓库的存储统计信息
| $ git count-objects -vH |
| count: 91 |
| size: 888.88 KiB |
| in-pack: 1250 |
| packs: 1 |
| size-pack: 112.77 MiB |
| prune-packable: 0 |
| garbage: 0 |
| size-garbage: 0 bytes |
由结果可知松散对象占用不大(count
和size
),冗余打包数量为0(prune-package
),垃圾文件占用为0(garbage
和size-garbage
)。但是打包文件占用过大(size-pack
),这意味着项目历史过长或者有较多的大文件。
清理无用的文件
上面的情景无需执行这一步。
优化size-pack打包体积
查出问题根源
1.识别大文件/历史对象
| |
| git rev-list --objects --all | |
| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | |
| grep '^blob' | sort -k3 -n -r | head -n 20 |
| |
| |
| git big-files -n 20 |
2.分析pack文件内容
| |
| git verify-pack -v .git/objects/pack/*.idx | sort -k3 -n -r | head -n 20 |
清理历史大文件
https://nyakku.moe/posts/2020/06/12/use-git-filter-repo-clean-git-history.html
使用 git filter-repo 重写历史
https://github.com/newren/git-filter-repo
| |
| $ pip3 install git-filter-repo |
| Collecting git-filter-repo |
| Downloading git_filter_repo-2.47.0-py3-none-any.whl.metadata (31 kB) |
| Downloading git_filter_repo-2.47.0-py3-none-any.whl (76 kB) |
| Installing collected packages: git-filter-repo |
| Successfully installed git-filter-repo-2.47.0 |
| ----------------------------------------------- |
| |
| git filter-repo --path bigfile.zip --invert-paths |
| ----------------------------------------------- |
| |
| git filter-repo --path tmp/ --invert-paths |
| ----------------------------------------------- |
| |
| |
| git clone <原仓库URL> new-repo |
| cd new-repo |
| git fetch --all |
| |
| |
| git filter-repo --strip-blobs-bigger-than 1M --all |
| |
| |
| git remote set-head origin main |
| |
| |
| git push origin --force --all |
| git push origin --force --tags |
| |
| |
| git clone <新仓库URL> |
| |
| |
| |
| git checkout -b backup-branch |
| |
| git fetch origin |
| git checkout main |
| git reset --hard origin/main |
| |
| git for-each-ref --format='%(refname)' refs/original/ | xargs -n1 git update-ref -d |
| |
| git rebase --onto origin/main <旧提交起点> |
| |
| git fetch --prune |
替代方案:使用 git filter-branch
| |
| git filter-branch --force --index-filter \ |
| "git rm --cached --ignore-unmatch bigfile.zip" \ |
| --prune-empty --tag-name-filter cat -- --all |
https://juejin.cn/post/7419123474700697627?searchId=2025021213351465C8FE56E6C970C1C49B
https://juejin.cn/post/7261814990843265061?searchId=2025021213351465C8FE56E6C970C1C49B
优化存储结构
强制垃圾回收并重新打包
| |
| git reflog expire --expire=now --all |
| git gc --prune=now --aggressive |
深度压缩仓库
| |
| git config --global pack.depth 50 |
| git config --global pack.window 250 |
| git repack -a -d --depth=50 --window=250 |
验证结果
| |
| git count-objects -vH |
| |
| |
| du -sh .git |
后续维护
- 添加
.gitignore
,避免提交临时文件/大文件(如 *.log
, *.zip
)
- 使用 Git LFS 管理大文件(1 G免费空间),如果必须存储大文件(如图片/视频),用 Git LFS 替代直接提交:
| git lfs install |
| git lfs track "*.psd" |
| git add .gitattributes |
- 定期执行维护命令
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!