NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
## 10.6 传输协议 ### 10.6.1 哑协议 哑协议一般用于架设一个基于 HTTP 协议的只读版本库。在使用哑协议拉取一个远程库的过程: * 拉取`info/refs`文件,从而得到了一个远程引用和 SHA-1 值的列表。 * 拉去 `HEAD` 文件,确定 HEAD 引用是什么。 * 开始遍历处理,拉去 `info/refs`文件中所提到提交对象。对于每个提交对象,要再获取两个对象,一个是树对象和父提交。 * 然后拉取索引文件,它列出了这个包文件所包含的所有对象的 SHA-1 值,和该对象存在于包文件中的偏移量。 * 最后需要拉取包文件。 哑协议虽然很简单但效率略低,且它不能从客户端向服务端发送数据。 ### 10.6.2 智能协议 **上传数据** 为了上传数据至远端,Git 使用`send-pack`和`receive-pack`进程。 运行在客户端上的`send-pack`进程连接到远端运行的`receive-pack`进程,`send-pack`进程会通过 SSH 连接服务器。在上传数据时,Git 会为每一个将要更新的引用发送一行数据,包括该行长度,旧 SHA-1 值,新 SHA-1 值和将要更新的引用。接下来,客户端会发送一个包文件,它包含了所有服务端还没有的对象。 最后,服务端会以成功(或失败)响应。 **下载数据** `fetch-pack`和`upload-pack`进程用于远程下载数据,客户端启动`fetch-pack`进程,连接至远端的`upload-pack`进程,以协商后续传输的数据。在一个服务端收到一个新的拉取请求时,Git 会为每一个将要更新的引用发送一行数据,包括该行长度,旧 SHA-1 值,新 SHA-1 值和将要更新的引用。然后`fetch-pack`进程查看它自己所拥有的对象,并响应 “want” 和它需要的对象的 SHA-1 值。 它还会发送“have”和所有它已拥有的对象的 SHA-1 值。 在列表的最后,它还会发送“done”以通知`upload-pack`进程可以开始发送它所需对象的包文件: ``` 003cwant ca82a6dff817ec66f44342007202690a93763949 ofs-delta 0032have 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 0009done 0000 ```