写在前面的话
- 如果你是初学Git,意在掌握它的基本使用!那么建议你先阅读本章:本地协议模块
- 为什么把Git的协议篇放到前面来写呢?考虑到:
- 不是每个人都有Github或Gitlab,如果一开始学就要认人去申请这些东西,然后配置秘钥,创建仓库,可能很多人就死在这个路上了;
- 先了解Git的内部支持那些协议可以让你更好的学习后续遇到的问题.例如:学习本地协议之后,你完全可以忽略以上所有问题,自己模拟在本地搭建”托管服务”然后学习绝大部分你看到的关于Git的操作资料;
1. 本地协议
什么是本地协议?
- 你的操作系统[Windows/Linux]就是基于这个东西来访问的;例如:你保存了一个网页到本地,然后打开你保存的网页,你会看到浏览器打开的时候URL地址栏那个地方就是:
file:///home/xxxx/xxx.html
,而file://
就是本地协议的协议头,可以理解为一个标志:告诉浏览器或Git我使用的是本地协议,你到我本地的home/xxxx
路径去找xxx.html
文件- 如果什么协议头都没打,直接/开头,Git会默认使用本地协议去你本地找,所以你可以在本地模拟一个类似Github或者Gitlab的仓库托管服务,然后开启你学习Git之路[下一章会告诉大家怎么去搭建,如果你刚刚开始学习Git,你可以直接跳去下一章进行学习了]
优点
- 简单
- 直接使用现有文件权限和网络访问权限
缺点
- 配置共享文件系统难
- 不方便多位置访问
- “远程磁盘”方式访问,配置不便,访问慢
- 文件协议不保护仓库意外的损坏
2. “哑(dumb)”协议
- 在Git 1.6.6版本之前只有哑协议可用,比较简单且通常是”只读模式”,而且是谁都可以读
- “哑协议”的只读限制是因为其服务端没有一个Git的守护进程在持续的关注”客户端”的所需并与之关注,故而使用哑协议,”客户端”是不能向”服务端”传输数据的
由于现在基本很少使用这种协议了,具体我也没使用过这个,这里只是总结官网上的文章稍微加了自己的理解,了解一下!
3. 智能协议
- 智能协议是Git在
1.6.6
版本中引入的,运行在标准的HTTP/S端口上,并提供各种HTTP验证机制,是目前最常用的传输方式。- 该协议在服务端运行了两组进程,分别负责上传[客户端的
send-pack
进程连接到服务端receive-pack
进程]和下载数据[客户端的fetch-pack
进程连接服务端upload-pack进程
],它们可以读取本地数据,理解客户端有什么和需要什么,并为它生成合适的包文件.
优点
- 效率比哑协议高
- 提供使用各种的HTTP验证机制
- 即支持 “git://” 协议一样设置匿名服务,也可以像SSH协议一样提供传输时授权和加密数据
- 可用性强:①不同访问方式,只需一个URL及服务器只在需要授权时提示输入授权信息;②相比SSH协议,设置简单,免去设置公钥问题;③HTTP/S协议被广泛使用,一般的企业防火墙都会允许这些端口的数据通过;④可以在HTTPS协议上提供只读版本库的服务;甚至可以让客户端使用制定的SSL证书.
缺点
- 架设HTTP/S协议的服务端比SSH协议难
- 如果你在HTTP上使用需授权的推送,管理凭证会比使用SSH秘钥认证麻烦
4. SSH协议
SSH协议是一个需要验证授权【采用公私密钥】的、普遍、建设简单、使用简单的协议
使用SSH协议克隆项目
$ git clone ssh://user@server/project.git
$ # scp方式
$ git clone user@server:project.git
优点
- 建设SSH协议访问服务简单,而且大多数环境下已经支持SSH访问
- SSH访问安全–所有传输数据都要经过授权和加密
- SSH协议很高效,传输前会尽量的亚索数据[其他的协议也会]
缺点
- 不能匿名访问:①.不利于项目开源;②.如果你要同事提供匿名只读访问和SSH协议,那么需要搭建SSH服务和架设一个可以让他人访问的服务
生成SSH公钥
$ ssh-keygen -t 加密方式[rsa|dsa] -C "youremai@email.com"
推荐阅读:https://help.github.com/articles/connecting-to-github-with-ssh/
5. git协议
包含在Git里的一个特殊的守护进程,监听9418端口,但是访问无需任何授权,没有任何安全措施【要么所有人都可以访问,要么谁也不能访问,而且只要有人知道项目URL都可以向项目推送数据】
优点
- Git协议是Git使用的网络传输协议中最快的
缺点
- 缺乏授权机制
- 架设繁杂困难;监听端口为非标准端口,一般企业防火前不会开放
参考文献:
- 《Git内部原理-传输协议》:https://git-scm.com/book/zh/v2/Git-内部原理-传输协议