Git 仓库瘦身

news/2025/3/12 12:23:09/文章来源:https://www.cnblogs.com/dawnkylin/p/18717947

如有错误和建议请评论告知。

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

由结果可知松散对象占用不大(countsize),冗余打包数量为0(prune-package),垃圾文件占用为0(garbagesize-garbage)。但是打包文件占用过大(size-pack),这意味着项目历史过长或者有较多的大文件。

清理无用的文件

上面的情景无需执行这一步。

git gc --prune=now

优化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-extras)
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

# 安装(需 Python 环境)
$ pip3 install git-filter-repo
Collecting git-filter-repoDownloading 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
-----------------------------------------------
# 用法1: 删除指定文件(如 bigfile.zip)
git filter-repo --path bigfile.zip --invert-paths
-----------------------------------------------
# 用法2: 清理指定文件夹(如临时目录)
git filter-repo --path tmp/ --invert-paths
-----------------------------------------------
# 用法3: 删除超过 1MB 的文件
# 克隆新仓库并拉取所有分支
git clone <原仓库URL> new-repo
cd new-repo
git fetch --all# 清理所有分支的大文件(明确指定 --all)
git filter-repo --strip-blobs-bigger-than 1M --all# 修复 origin/HEAD
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
# 基于新历史 rebase
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

验证结果

# 查看新的 size-pack
git count-objects -vH# 检查仓库整体体积
du -sh .git

后续维护

  1. 添加 .gitignore,避免提交临时文件/大文件(如 *.log, *.zip
  2. 使用 Git LFS 管理大文件(1 G免费空间),如果必须存储大文件(如图片/视频),用 Git LFS 替代直接提交:
git lfs install
git lfs track "*.psd"
git add .gitattributes
  1. 定期执行维护命令
# 每月优化一次
git gc --auto
git prune

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/884662.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【后端】简化部署设计方案——内层设计方案

根据《简化部署设计方案V2》的内容,内层部署需要提供的 .sh 脚本应覆盖部署流程的各个阶段,确保组件能够顺利安装、配置、启动、检查状态,并支持升级和卸载。 一、 部署某组件所需的内层结构 左侧是约定的内层结构,右侧的其他部署的内容物,按需存放即可。1.1 scripts目录:…

H3C CX8028 GPFS并行文件系统全闪存储配置案例

H3C华三CX8028使用IBM的GPFS商业授权的一款全闪存储设备。本案中,客户机服务器与存储服务器均搭配双口200G网卡 ,配合200G的ROCE网络搭建集群。 GPRS文件系统中,存储集群不光需要把存储服务器组织在一起,客户机也需要在集群中声明身份,参与到集群之中,这并不像传统的集中…

【kali】在Kali Linux中安装Navicat17

Navicat 是笔者最喜欢的一款专业的数据库管理工具,不仅支持多种数据库类型,而且它提供了直观的用户界面和丰富的功能,帮助用户轻松管理和操作数据库,提高工作效率。 通过,Navicat我们是在Windows环境中部署的。本文以KALI为例,讲解如何在Linux环境中部署。 首先,我们从官…

URL 生成网站截图 API 数据接口

URL 生成网站截图 API 数据接口 网站工具 / 截图 高效生成网页截图 生成网页截图 / 图片输出。1. 产品功能支持全页截图和视窗截图; 支持自定义截图尺寸; 兼容移动设备截图; 支持暗黑模式截图; 固定参数请求,可以得到最新的站点截图; 快速高效的截图生成; 全接口支持 HT…

OCR识别表格中的参数及参数值

一、需求 识别固定表格中的文字,输出表格中的参数字典 二、整体思路找到一张含有表格的图片,利用mac自带的预览工具分析出图片每个单元格的对角线坐标, 使用程序根据图片文件和对角线坐标数组,分割图片为很多个小图片, 采用tesseract库识别单个单元格中的文字,并将识别出…

H800 Nvlink 基础环境配置(Ubuntu20.04 )

H100/800 SXM的8卡服务器在配置多机互联环境时,除了要安装Nvidia的GPU驱动,还需要安装FabricManager。 Nvidia 提供了在线安装和离线安装两种方式。Z项目H800 NVL 基础环境配置(Ubuntu20.04 ) 操作系统基础安装 配置源 本操作在Ubuntu 20.04下完成, 所有命令都以root身份执行…

c_note

c笔记一、变量 1、变量的声明 ​ 变量的声明是给编译器看的,告诉编译器变量的类型以及名字等相关的信息。 格式:数据类型 变量名; 变量的声明显然是一个编译时概念,所以它和程序的运行没有太大的关系。 一个变量具有声明,并不意味着该变量会在运行时期分配内存空间。 2、…

Drasi Sources SDK

什么是Drasi数据源(Source)?Source提供了与系统的连接,Drasi 可以将这些系统视为变化源。source 在 Drasi 中执行三个重要功能:处理源系统生成的更改日志/源,并将这些更改推送到使用该源作为输入的每个连续查询。 将源更改数据转换为一致的属性图数据模型,以便订阅的 Co…

【每日一题】20250216

人生就是这样,不经历鲜血淋漓的疼痛,就不会明白那些曾经让我们厌烦的说教其实是受用一生的信条。【每日一题】(多选)如图所示,在竖直半面内有一半径为 \(R\) 的圆弧轨道.半径 \(OA\) 木平、\(OB\) 竖直,一个质量为 \(m\) 的小球自 \(A\) 的正上方 \(P\) 点由静止开始自由…

数据团队必读:智能数据分析文档(DataV Note)五种高效工作模式

数据项目,无论是数据分析、可视化,还是数据科学和机器学习相关的项目,通常都非常复杂,涉及多个组成部分,比如代码、数据、运行环境、SQL脚本以及分析报告等;与此同时,随着AI时代的到来,数据科学领域正经历重大变革。这对于数据科学团队来说,如何保持高效地工作模式一直…

SU镜像:缩放s

su没有镜像,可用:缩放s 选中要镜像的对象——复制一个——s——找到中间的点——向右拉动——输入 -1

LGP1377 [TJTS 2011] 树的序 学习笔记

LGP1377 [TJTS 2011] 树的序 学习笔记 Luogu Link 题意简述 给一个生成序列 \(p\),简单起见 \(p\) 是一个长为 \(n\) 的排列。按照这样的步骤生成一棵二叉搜索树:往空树中插入 \(p_i\),则 \(p_i\) 成为当前二叉搜索树的根。 往非空树 \(u\) 中插入 \(p_i\),若 \(p_i\) 小于…