起因
同事在用go get拉取一个go项目依赖时,其中一个项目使用git submodule引用了另外一个项目的GitHub仓库,然后报了host key verification failed错误。
排查过程
平时工作用的代码管理是使用的SVN,对Git的相关配置还不是很熟悉,先查看了git config发现配置的用户名是一个内网邮箱,故先怀疑是不是配置的用户名不对,需要改成GitHub的帐号。但是测试git clone我的公开仓库,又可以顺利clone,经过简单的搜索,将问题定位到了Git协议上,host key verification failed是SSH协议报出的错误,去git-scm查看手册学习到git服务器支持的几种协议解决了问题。
Git协议介绍
Git可以用四种协议来传输资料
本地协议
最基本的就是 本地协议(Local protocol) ,其中的远程版本库就是硬盘内的另一个目录。这个确实没怎么用过,也没怎么见过,一般公共Git服务没有提供这种协议。使用版本库路径作为URL
$ git clone /opt/git/project.git
$ git clone file:///opt/git/project.git
HTTP协议
1.6.6版本之前叫 Dumb HTTP协议,基本类似于本地协议,之后引入了 Smart HTTP协议,也是我们现在最流行的使用Git的方式了。支持匿名服务,也支持传输时的授权和加密。而且只用一个URL就可以做到。
优点
只关注Smart HTTP的优点,可以使用用户名密码授权,不需要SSH相关知识的支持,简单明了。协议被广泛使用,一般不会被防火墙阻断。
缺点
架设稍微复杂点。
SSH协议
通过 SSH 协议克隆版本库,你可以指定一个 ssh:// 的 URL:
$ git clone ssh://user@server/project.git
或者使用一个简短的 scp 式的写法:
$ git clone user@server:project.git
你也可以不指定用户,Git 会使用当前登录的用户名。
优点
架设简单,访问是安全的,协议高效,在传输前也会尽量压缩数据。
缺点
不能实现匿名访问
Git协议
是Git里的一个特殊守护进程;监听9418端口,类似SSH服务,但是访问无需授权。
优点
Git协议是Git使用的网络传输协议里最快的。相比SSH省去了加密和授权的开销。
缺点
缺乏授权机制。
Git子模块 git submodule
看完上述描述,考虑到私有模块的问题,最开始认为子模块的配置只能支持SSH或者HTTPS带授权的协议方式,经过测试,也能支持使用Git协议配置子目录,没有协议的限制。