Partial Clone

17 阅读3分钟

仅仅使用 git sparse-checkout 不能彻底解决 git pull(网络下载)慢的问题。如果要从根本上解决大仓库 git pullgit clone 慢的问题,必须将 git sparse-checkout 与 Partial Clone(部分克隆 --filter=blob:none)结合使用

为什么单靠 sparse-checkout 不能解决 git pull 慢?

我们要区分 Git 的两个核心概念:

  1. .git 目录(本地数据库): 存储仓库的所有历史记录、所有文件的对象(Blobs)。git pull 主要是从远程服务器下载增量的对象到这里。
  2. 工作区(Working Tree): 你肉眼能看到的、可以在编辑器里修改的代码文件。

如果你开启了 git sparse-checkout,它的作用仅仅是:限制在“工作区”中展示哪些文件

  • 优点: 它可以极大地加快本地命令的速度(如 git statusgit checkout),并且节省你肉眼可见的目录所占用的磁盘空间。
  • 缺点: 当你执行 git pull 时,Git 依然会老老实实地从远程服务器把整个大仓库**所有部门、所有目录的新代码增量(Blobs)**全部下载到 .git 文件夹中。所以网络下载的时间依然很长。

真正的黄金解法:Sparse-checkout + Partial Clone

为了让 git pull 真正变快,你需要告诉 Git:不仅工作区不要显示其他目录的文件,连 .git 数据库也根本不要去下载那些不需要的文件内容。

这就需要引入 Partial Clone(部分克隆)。结合使用后,git pull 就只会下载你关注的那几个目录的新代码,速度会从几分钟甚至几十分钟缩短到几秒钟。

如何正确配置才能让后续的 git pull 变快?

场景 1:如果你还没克隆代码(从头开始) 这是最推荐的做法,使用一步到位的命令:

# 1. 使用 partial clone 克隆仓库,不下载任何文件内容(极快)
git clone --filter=blob:none --no-checkout <大仓库的URL>
cd <仓库目录>

# 2. 开启锥形模式的 sparse-checkout
git sparse-checkout init --cone

# 3. 设置你真正需要的目录
git sparse-checkout set frontend/src docs/

# 4. 检出文件
git checkout master

经过这样设置后,未来你每次在这个目录里执行 git pull,Git 都只会拉取元数据以及 frontend/srcdocs/ 目录下的新代码变更,速度极快。

场景 2:如果你已经克隆了完整的仓库,想让以后的 git pull 变快 如果你本地已经有一个几 GB 的完整仓库,单纯设置 sparse-checkout 只能清理工作区。你需要补上 Partial Clone 的配置:

# 1. 开启 sparse-checkout 并设置你需要的目录
git sparse-checkout init --cone
git sparse-checkout set <你需要关注的目录>

# 2. 修改仓库配置,开启部分克隆过滤(告诉 Git 以后 fetch/pull 时不要下载所有文件的 blob)
git config remote.origin.promisor true
git config remote.origin.partialclonefilter blob:none

# (可选)清理本地已经下载的冗余无用历史对象,释放磁盘空间
git repack -a -d --filter=blob:none

总结

  • 单用 sparse-checkout = 掩耳盗铃。工作区清爽了,命令不卡了,但 git pull 依然会在后台下载全量大仓库的更新。
  • sparse-checkout + --filter=blob:none = 终极神器。不仅本地工作区清爽,git pull 也只会精准下载你指定的目录的网络数据,完美解决大仓库卡顿问题。