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 全局替换,以免提交时因写请求被拒而产生困惑。