首页/开发/Git 与协作速查/部分克隆(--filter=blob:none)
进阶与大仓实践69 条

部分克隆(--filter=blob:none)

克隆时只取提交与树、不取文件内容,检出或读取时再按需下载对应对象;显著降低首次克隆体积,适合大仓与 CI。

Git 与协作速查开发更新于 2026-10-13

部分克隆是什么

部分克隆让克隆时只取一部分对象。最常用的过滤条件是 blob:none:先取全部提交与目录树,不取文件内容,直到你真正检出某个版本或读取某个文件时,才按需从远端把对应对象拉下来。对大仓库和 CI 环境,首次克隆的传输体积和等待时间都会明显下降。

基本信息

克隆命令git clone --filter=blob:none <仓库地址>
按需获取读取缺失对象时自动从 promisor 远端拉取
组合用法常与 --sparse 一起用于超大单仓
远端要求服务端需支持对象过滤(主流托管平台支持)
离线影响无网络时缺失对象无法补齐,读取会失败

典型使用场景

  • CI 任务只需要构建当前提交,不必下载全部历史文件内容
  • 本地只需要仓库结构做检索或评审,不需要每个历史版本的文件
  • 超大单仓配合稀疏检出,只检出关心的目录
  • 带宽有限时先拉骨架,再按需补齐需要的文件
  • 临时查看某个版本里的少量文件,避免完整克隆的等待

常用示例

常用示例
git clone --filter=blob:none https://example.com/monorepo.git  # 只取提交与树
cd monorepo
git rev-list --count HEAD          # 提交历史完整,可以正常遍历
git ls-tree HEAD                   # 目录树可读,文件内容尚未下载
git checkout main -- src/app.js    # 读取文件时按需拉取对应对象
git log --oneline -5               # 遍历历史的命令不受影响

常用过滤条件

过滤条件取什么适用情形
blob:none提交与树,不取文件内容最常用,CI 与大仓
tree:0只取提交对象仅需要提交历史时
blob:limit=1m只取小于阈值的文件控制单文件体积
--sparse只检出部分目录与部分克隆组合使用
按需拉取对用户是透明的,日常几乎感觉不到;但依赖全量历史的命令(全库内容检索、完整行级追溯)会触发大量对象下载,可能比完整克隆更慢。
部分克隆的仓库会记录 promisor 远端信息,跨网络环境迁移或离线打包时容易缺对象,需要先补全再搬运。

易错点

  • 历史检索类命令(全库内容检索、完整行级追溯)会触发逐对象下载,可能比完整克隆更慢
  • 断网或代理受限时按需拉取失败,表现为文件打不开,而不是明显的网络报错
  • 服务端不支持对象过滤时会退化为完整克隆,体积没有下降,动手前先确认远端能力
  • 把部分克隆的仓库直接离线打包分发,接收方可能因缺对象而无法检出
  • 远端历史被重写后对应对象可能已不存在,此时按需拉取会永久失败,仓库对那部分历史变得不可用

数据来源与参考

  • Git 官方文档:git-clone(--filter)
  • GitHub Docs:Partial clone
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌