Git Clone 提速原理:Smart HTTP 透明转发

理解两步请求,就能理解克隆加速的全过程,以及 push 为什么会被拒绝。

2026-09-18 · 技术实践

Smart HTTP 是什么

用 HTTPS 协议执行 git clone 时,Git 客户端会先后发起两类请求:先 GET /info/refs?service=git-upload-pack 询问服务端有哪些引用(分支、标签),再 POST /git-upload-pack 协商并拉取需要的对象。这套流程称为 Smart HTTP(智能 HTTP),是 HTTPS 克隆、浅克隆与增量拉取的基础。

网关如何转发克隆请求

加速网关对这两类请求做只读透明转发:不解析 pack 文件内容,按流式方式透传请求与响应;请求中的 Cookie 与 Authorization 头会被剥离,账号凭据不会进入转发链路。因此:

  • 克隆、浅克隆、增量 fetch 都可以通过加速地址完成
  • 推送(git-receive-pack)属于写操作,会被直接拒绝
  • 私有仓库不在支持范围内(需要登录态,与「不接收凭据」的原则冲突)

大仓库怎么克隆更快

仓库体积越大,首次克隆拉取的对象越多。三种常用手段可以显著减少首次数据量:

浅克隆(只要最近一次提交):
git clone --depth=1 https://ghclone.com/https://github.com/owner/repo.git

部分克隆(不要历史 blob,按需补拉):
git clone --filter=blob:none https://ghclone.com/https://github.com/owner/repo.git

只克隆单个分支:
git clone --single-branch --branch main https://ghclone.com/https://github.com/owner/repo.git

浅克隆适合「只读代码、不查历史」的场景;部分克隆适合日常开发,后续查看历史文件时 Git 会自动按需补拉。

常见错误排查

  • repository not found:检查仓库路径拼写与大小写;若为私有仓库,请改用官方地址并自行配置凭据。
  • fatal: unable to access:链路波动导致,重试或更换线路即可。
  • 克隆中途卡住:大仓库建议先浅克隆,再用 git fetch --unshallow 逐步补全历史。

子模块与批量替换

项目含有子模块时,可以在本地仓库内定向替换 URL 前缀(--local 只影响当前仓库):

git config --local url."https://ghclone.com/https://github.com/".insteadOf "https://github.com/"

注意:该替换会同时影响 push 等写操作,而本服务仅只读转发。请勿使用 --global 全局替换,以免提交时因写请求被拒而产生困惑。

← 返回博客列表