浅克隆的加深与补全是什么
浅克隆(--depth)只带一部分历史:git fetch --deepen=N 在现有基础上再追加 N 层,git fetch --unshallow 把仓库补成完整历史;标签在浅克隆里默认不齐,需要时用 git fetch --tags 单独补。它是「先浅后按需加深」流程的核心,CI 与本地大仓库都常用。
基本信息
| 加深 | git fetch --deepen=50(增量补 N 层,不重复下载) |
|---|---|
| 转完整 | git fetch --unshallow(之后与普通克隆无异) |
| 补标签 | 浅克隆默认取不全标签,git fetch --tags 补齐 |
| 前提 | 仓库本就是浅克隆(曾用 --depth 或 fetch-depth 限制过) |
| 场景 | CI 按需加深、blame/describe/发布脚本前补历史 |
典型使用场景
- CI 构建需要最近若干提交的 diff:--deepen=N 精准补层,比全量克隆省时间。
- 发布流程依赖 tag 信息:先补历史再 fetch --tags,describe 与变更日志才准确。
- 排查历史问题要完整 blame:unshallow 转成完整仓库,工具行为与普通克隆一致。
- 阶段性加深:先 1 层,失败再 deepen 50,按需付费不至于每次全量拉取。
- 浅克隆上误用历史命令报错后:先补历史再重试,很多命令只吃完整仓库。
- 打包与镜像:先在临时目录 unshallow 再打包,避免把浅状态分发给下游使用方。
常用示例
常用示例
git clone --depth 1 https://example.com/app.git # 起步:只取最新提交
cd app
git fetch --deepen=100 # 在现有基础上再补 100 层历史
git log --oneline | wc -l # 确认层数已经增加
git fetch --unshallow # 需要完整历史时一次补全
git fetch --tags # 补标签,供 describe 与发布脚本使用相关参数对比
| 参数 | 行为 | 典型用途 |
|---|---|---|
| --depth=N | 克隆时从最新提交起只取 N 层 | 全新浅克隆起步 |
| --deepen=N | 在现有浅历史基础上再追加 N 层 | CI 需要更长的对比基线 |
| --unshallow | 把浅仓库补成完整历史 | 本地开发与历史分析 |
| --tags | 补取标签引用 | 发布、describe 与版本比对 |
加深是增量的:--deepen 不重复下载已有对象,层数在原来基础上增加;unshallow 之后仓库与普通完整克隆没有区别。CI 里按需加深通常比一步到位全量更省时间和带宽。