git clone --depth=1 --single-branch --branch ${env.BRANCH_NAME} 是 Monorepo 下 Jenkins 秒级轻量检出的核心方案,跳过历史提交和冗余分支,仅拉取目标分支最新提交,配合 fsmonitor 与 sparse-checkout 可进一步优化构建性能。

在 Monorepo 场景下,Jenkins 克隆整个仓库往往耗时长、磁盘占用高、git status 和 git log 响应迟钝。启用 shallow clone 是实现秒级轻量检出最直接有效的手段——它跳过历史提交,只拉取最新提交对象,配合合理配置可将克隆时间从数分钟压至 1–3 秒。
核心参数:depth=1 + single-branch
Monorepo 通常有大量分支和冗长历史,但 CI 构建几乎只依赖当前 PR 或目标分支的最新代码。必须组合使用两个关键参数:
-
--depth 1:仅获取最近一次提交的 commit 对象和 tree/blob,避免传输成百上千个历史对象 -
--single-branch(或--branch <branch>):不拉取所有远程分支引用(refs/remotes/origin/*),大幅减少 ref 数据量
示例命令(Jenkinsfile 中推荐写法):
sh 'git clone --depth 1 --single-branch --branch ${env.BRANCH_NAME} ${env.GIT_URL} .'Jenkins Git 插件配置要点
若使用 Jenkins 内置 Git 插件(非自定义 shell),需在 Checkout Options 中显式启用:
- 勾选 “Shallow clone” 并设置 “Shallow depth” = 1
- 勾选 “Include only the specified branches”,填入
**/${env.BRANCH_NAME}或具体分支名 - 取消勾选 “Prune stale remote-tracking branches”(浅克隆下该操作无意义且可能失败)
注意:插件版本 ≥4.0.0 才完整支持 shallow clone 的语义一致性;旧版本建议升级或改用 Pipeline 脚本控制。
规避浅克隆副作用的关键补丁
浅克隆会禁用 git blame、git log --all 等功能,但 CI 流水线通常不需要。真正需主动处理的是两个常见陷阱:
-
无法识别 tag 或 release 版本号:若构建脚本依赖
git describe --tags,需在 shallow 克隆后补 fetch tag(git fetch --depth=1 --tags),或改用环境变量传入版本标识 -
submodule 初始化失败:默认
git submodule update --init在浅克隆下可能报错,应加--depth 1参数,或改用git submodule update --init --remote --rebase避免深度依赖
配套加速项:fsmonitor + sparse-checkout(按需启用)
shallow clone 解决了克隆阶段瓶颈,但若 Monorepo 包含数百个子项目(如 packages/xxx),工作区文件仍过多,影响后续步骤速度。此时可叠加:
-
启用 core.fsmonitor:在 agent 启动时全局配置
git config --global core.fsmonitor true,配合 watchman 可使git status从秒级降至 0.3 秒内 -
启用 sparse-checkout:仅检出当前构建模块路径(如
packages/frontend),命令为:
git sparse-checkout init --cone && git sparse-checkout set packages/frontend
注意:sparse-checkout 需搭配 git clone --no-checkout 使用,适合明确知道构建范围的 Monorepo 场景。


















