Git - Transfer Protocols (git-scm.com)
Git中存在两种传输数据的协议:“dump”和“smart”协议。
Dump 协议
类似HTTPS的Get请求,因为其安全性,已经很少被使用了。
获取内容的大致流程:
- 获取info/refs
- 获取Head
- 然后一次获取object对象。(loose形式)
- 若获取某一对象失败,则尝试获取pack形式的信息。
Smart协议
Dump协议简单但是不够高效。
Smart协议中,服务端需要具备Git的知识,能根据客户端发送的信息,分析其needs,然后打包成packfile发送给客户端。
一、上传数据阶段
客户端send-pack
,服务端receive-pack
。
a) ssh
客户端向服务端发送报文以及服务端不存在的object构成的packfile。
报文记录了存在变化的分支信息。
b) http
- get request, 获取远程的分支信息。
- post request,发送
send-pack
的输出和packfile。
二、下载数据阶段
客户端fetch-pack
,服务端upload-pack
。
a) SSH
客户端请求建立连接后,服务端发送git状态信息,包括,另外报文中的
symref=HEAD:refs/heads/master
代表远程文件中,HEAD指针指向的信息。
客户端根据返回的报文信息检查本地存在的objects以及需要的objects信息。
服务端收到报文后,将客户端want的object打包,发送packfile。
b) HTTPs
基于https的下载过程是通过2次请求完成。
- get request, 获取每个分支的变更信息。
- post request,发送本地存在和want的对象信息。返回RetCode和packfile。