启用 sparse-checkout 前必须关闭 core.sparseCheckoutCone:执行 git config core.sparseCheckoutCone false;再手动创建 .git/info/sparse-checkout 写入保留路径;最后用 git read-tree -m -u HEAD 生效规则。

启用 sparse-checkout 前必须关闭 core.sparseCheckoutCone
Git 2.25+ 默认开启 sparseCheckoutCone 模式,它只支持“前缀式”路径规则(如 src/*、docs/**),不支持通配符中间匹配(如 **/config.json)或排除特定子目录。如果你的路径结构复杂,或者想精确控制某几个离散文件夹,第一步就得关掉它:
- 执行
git config core.sparseCheckoutCone false - 这步漏掉会导致后续规则静默失效,
git read-tree不报错但实际没过滤 - 该设置仅作用于当前仓库,不影响全局
初始化 sparse-checkout 并写入路径规则
必须手动创建 .git/info/sparse-checkout 文件,并用换行分隔每条规则。注意:规则是“保留”,不是“排除”,默认什么也不写就检出全部;写进去的路径才被保留在工作区。
- 进入空目录,运行
git init && git remote add origin <url> - 执行
git config core.sparseCheckout true - 创建文件:
echo "src/" > .git/info/sparse-checkout(保留整个src/目录) - 若要多路径,追加即可:
echo "README.md" >> .git/info/sparse-checkout - 规则末尾不加
/表示文件;加了表示目录及其所有内容(含子目录)
拉取指定内容时必须用 --no-checkout + read-tree
直接 git pull 或 git clone --filter=tree:0 不会触发 sparse 过滤——它们只影响对象下载,不控制工作区文件生成。真正生效靠的是 git read-tree 和 git checkout-index 的组合。
- 先 fetch:
git fetch --depth=1 origin main - 再构建索引:
git read-tree -m -u HEAD(-u表示更新工作区,按 sparse 规则删/增文件) - 如果提示 “error: Entry 'xxx' would be overwritten by merge”,说明本地有未跟踪文件冲突,需先清理或加
--reset - 不需要
git checkout,read-tree -u已完成文件落地
修改规则后必须重新 read-tree 才能生效
改完 .git/info/sparse-checkout 文件,Git 不会自动重载。旧文件不会被自动删除,新路径也不会出现——必须显式刷新索引。
- 编辑规则后,运行
git read-tree -m -u HEAD - 如果想清空当前工作区再重来,加
--reset:git read-tree -m -u --reset HEAD - 注意:这会真实删除你当前工作区里、但不在新规则中的所有文件(包括未提交修改),操作前建议确认
git status - 别依赖
git sparse-checkout set(那是 cone 模式专用命令),非 cone 下它不读你的规则文件
read-tree -u 落地。最容易卡住的地方是以为改了规则就自动生效,或者误以为 clone --filter 能替代 sparse 逻辑——它俩解决的是不同层面的问题。


















