git不支持仅拉取指定目录,必须通过稀疏检出或子模块模拟:稀疏检出需先fetch再配置规则并checkout,仍下载全部对象;子模块则以独立仓库方式按需引入,更可控。

Git 本身不支持仅拉取指定目录
Git 是以提交(commit)为单位管理历史的,整个仓库的快照不可分割。所谓“只拉某个目录”,本质是绕过完整克隆、用稀疏检出(sparse checkout)或子模块(submodule)等机制模拟效果。直接执行 git clone 或 git pull 命令时,无法通过参数限定只下载 src/main/java 或 docs/ 这类路径——它要么拉整个仓库,要么报错。
sparse-checkout 配置后仍需完整 fetch
稀疏检出不是“跳过下载”,而是“下载后过滤工作区显示”。即使配置了 core.sparseCheckout=true,git fetch 依然会把远程所有 blob 和 tree 对象拉到本地对象库(.git/objects/),只是 checkout 时只展开匹配路径的文件到工作区。
Conventional Commits v1.0.0 分支、工作树命名及提交信息规范,适用于 GitHub 与 GitLab 项目,用于创建分支和命名工作树等场景。
- 启用前必须先初始化空仓库:
git init && git remote add origin <url></url> - 必须先
git fetch --depth=1拉至少一个 commit,否则sparse-checkout规则无处应用 - 规则写在
.git/info/sparse-checkout中,每行一个路径模式,如:src/**、!src/test/** - 最后执行
git checkout <branch></branch>才真正应用过滤,此时工作区才只出现匹配目录
submodule 是更可控的替代方案
如果你的目标是“只用仓库里的某一部分代码”,且该部分长期独立演进,建议把它拆成独立仓库并作为 submodule 引入。这样你本地只存它的 commit hash 和路径映射,不会拉取无关历史。
- 主仓库中添加:
git submodule add <sub-repo-url> path/to/subdir</sub-repo-url> - 首次克隆需加
--recurse-submodules,否则path/to/subdir是空目录 - 后续更新 submodule:进入子目录执行
git pull,或在主仓库用git submodule update --remote - 注意:submodule 的 commit 是固定快照,不是自动同步最新分支;若需动态跟踪分支,得额外配
git config -f .gitmodules submodule.<name>.branch <branch></branch></name>
真正省带宽的方案只有 shallow clone + sparse-checkout 组合
如果远程仓库巨大(比如含大量二进制资产),又确实只需要某个子目录的最新代码,可组合使用浅克隆和稀疏检出。但要注意:shallow clone 会丢失历史,且某些操作(如 git blame、git log --follow)不可用。
- 步骤顺序不能错:先
git clone --no-checkout --depth=1 <url></url>,再进目录配sparse-checkout,最后git checkout -
--depth=1只拉 HEAD commit,不拉祖先,大幅减少对象体积 - 即便如此,.git 目录仍包含整个仓库的索引和引用信息,只是对象数据少;工作区才真正“干净”
- 无法保证后续
git pull仍保持稀疏——默认会恢复全量检出,需每次手动重置:git read-tree -m -u HEAD配合 sparse 规则
/** 导致子目录不生效,或没写 ! 排除规则导致意外文件出现。实际用之前,务必在测试目录里跑一遍 git read-tree -m -u HEAD 并检查 git status 输出。










