浅克隆是什么
git clone --depth N 只取回最近 N 条提交的快照,而不是完整历史。它的收益直接体现在克隆时间与磁盘占用上,代价是历史不完整:早期提交不在本地,需要历史信息的命令会受限。适合只需要最新代码的场景,例如构建与部署。
浅到什么程度合适
--depth 1 在 CI 和只做构建的场景最常见;需要看最近的改动轨迹时,--depth 20 或 50 更实用。要取多个分支的历史,还得显式加 --no-single-branch,因为 --depth 隐含只取单分支。取回之后发现历史不够用,可以继续加深,不必重新克隆。
基本信息
| 适用平台 | Linux / macOS / Windows(Git 1.9 起支持 --unshallow) |
|---|---|
| 语法 | git clone --depth <N> <仓库地址> |
| 隐含影响 | 只取当前分支,等价于加了 --single-branch |
| 补历史 | git fetch --depth N 继续加深,--unshallow 补全 |
| 产物 | 仍是正常仓库,只是历史被截断 |
| 适用场景 | CI 构建、部署机、只需要最新代码 |
典型使用场景
- CI 构建:只取最新提交,缩短检出耗时
- 部署机:只需要能跑起来的代码,不需要历史
- 快速验证:临时克隆看代码,不必拿完整记录
- 大仓库起步:完整克隆太慢时先用浅克隆拿到基线
- 逐步补全:后续用 fetch 加深到实际需要的深度
常用示例
常用示例
git clone --depth 1 https://github.com/org/repo.git # 只取最新一次提交
git clone --depth 50 --no-single-branch https://example.com/org/repo.git
git rev-parse --is-shallow-repository # 确认是否为浅仓库
git fetch --depth 200 # 在浅克隆里继续加深
git fetch --unshallow # 补全为完整仓库
git log --oneline | head -3 # 核对可用的历史范围浅克隆的影响
| 场景 | 完整仓库 | 浅克隆 |
|---|---|---|
| git log 全量历史 | 可查全部提交 | 只有最近若干条 |
| git blame 早期行 | 能追到最初修改 | 可能停在边界提交 |
| git bisect 定位 | 可覆盖全部范围 | 范围受限 |
| 合并到旧基线 | 正常执行 | 可能因缺少公共祖先失败 |
| 磁盘占用 | 完整对象库 | 明显更小 |
浅克隆下 git log、blame、bisect 与合并基线分析都可能不准确。需要评审历史或定位回归时,先把历史补全再动手。
--depth 隐含 --single-branch。需要多分支历史时必须显式加 --no-single-branch,否则其它分支的提交根本不在本地。