部分克隆是什么
部分克隆让克隆时只取一部分对象。最常用的过滤条件是 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 远端信息,跨网络环境迁移或离线打包时容易缺对象,需要先补全再搬运。