GIT支持的四种通信协议

611 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

本文系作者 不太自律的程序猿原创,转载请私信并在文章开头附带作者和原文地址链接。

GIT服务器搭建方式

image.png

git支持的四种通信协议:

1. Local(本地协议)

2. ssh

3. http(Dumb、Smart)

4. git

1、Local(本地协议)

 基于本地文件系统或共享(NFS)文件系统进行访问,

优点: 简单,直接使用了现有的文件权限和网络访问权限,小团队小项目建立一个这样的版本管理系统是非常轻松的一件事。

缺点: 这种协议缺陷就是本身共享文件系统的局限,只能在局域网,而且速度也慢。

适应场景: 小团队,小项目临时搭建版本服务。

 

l 演示本地协议使用方式:

#从本地 f/git/atals 目录克隆项目

git clone /f/git/atals/

#即使是 bare仓库也可以正常下载

git clone /f/git/atals.git

#基于file 协议克隆本地项目

git clone file:///f/git/atals/

如果在 URL 开头明确的指定 file://,那么 Git 的行为会略有不同。 如果仅是指定路径,Git 会尝试使用硬链接(hard link)或直接复制所需要的文件。 如果指定 file://,Git 会触发平时用于网路传输资料的进程,传输过来的是打包好的文件,更节约硬盘空间。

l 演示通过 file:///协议与直接拷贝的区别。

2、ssh 协议

 git 支持支持利用ssh 协议进行通信,这是绝大部分linux、uninx系统都支持的,所以利用该协议架设GIT版本服务是非常方便的

优点: 首先SSH 架设相对简单、其次通过 SSH 访问是安全的、另外SSH 协议很高效,在传输前也会尽量压缩数据。

缺点: 权限体系不灵活,必须提供操作系统的帐户密码,哪怕是只需要读取版本。

适应场景: 小团队、小项目、临时项目

 

演示基于 ssh 协议

这里我们把git 服务必须先安装到linux 系统上,然后才能使用ssh  协议跟git 服务进行通信。

 

linux 安装git服务

1.安装依赖环境

yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker

 

2.下载并解压源码

$ wget github.com/git/git/arc…

#备用下载链接: pan.baidu.com/s/1czwEz8 密码: y3hn

$ unzip v2.3.0.zip

$ cd git-2.3.0

 

3 编译 安装(如果没有权限就加上sudo)

make prefix=/usr/local/git all

make prefix=/usr/local/git install

 

4、添加环境变量

vim /etc/profile

export PATH=/usr/local/git/bin:$PATH

source /etc/profile

#如果成功显示版本号表示添加成功

git --version

git version 2.3.0

 

#创建一个祼项目

git --bare init luban.git

#本地基于远程克隆仓库

git clone root@192.168.0.147:/data/git-repository/luban.git

cd luban/

#添加文件

echo "this is luban" >> README.MF

#本地添加、提交、并推送至远程

git add -A; git commit -am 'first commit'; git push;

 

可能的错误:

git-upload-pack: command not found

原因是 ssh 协议下只能访问/usr/bin 下的目录,解决办法如下

ln -s /usr/local/git/bin/git-upload-pack /usr/bin/git-upload-pack

ln -s /usr/local/git/bin/git-receive-pack /usr/bin/git-receive-pack

3、http(Dumb、Smart)

Git http 协议实现是依懒 WEB容器(apache、nginx)及cgi 组件进行通信交互,并利用WEB容器本身权限体系进行授权验证。在 Git 1.6.6  前只支持http Dumb(哑)协议,该协议只能下载不能提交,通常会配合ssh 协议一起使用,ssh 分配提交帐号,http dumb提供只读帐号。1.6.6 之后git 提供了git-http-backend 的 CGI 用于实现接收远程推送等功能。

 

优点: 解决了local 与ssh 权限验证单一的问题、可基于http url 提供匿名服务,从而可以放到公网上去。而local 与ssh 是很难做到这一点,必如实现一个类似github 这样的网站。

缺点: 架设复杂一些需要部署 WEB服务器,和https 证书之类的配置

场景: 大型团队、需要对权限精准控制、需要把服务部署到公网上去

 

l 演示 http Dumb 配置与使用

1、创建服务端版本仓库

cd /data/git-repository

git --bare init luban.git

cd luban.git/hooks/mv

// 版本更新钩子,当有版本提交的时候会执行更新

post-update.sample post-update

./post-update

nginx 静态访问配置

server {

        listen       80;

        server_name  git.tl.com;

        location / {

            root  /data/git-repository;

        }

}

#重命名钩子

mv hooks/post-update.sample hooks/post-update

本地克隆远程服务

git clone git.tl.com/luban.git

 

注: http  Smart 协议 是基于  CGI 配合GIT  git-http-backend 脚本进行使用,配置较复杂,现在一般不会这么去做,而是采用gitlab 、gogs 之类的web管理进行代替,在此就不在演示。

4、GIT 协议

Git 协议是包含在 Git 里的一个特殊的守护进程;它监听在一个特定的端口(9418),类似于 SSH 服务,但是访问无需任何授权。

 

优点

目前,Git 协议是 Git 使用的网络传输协议里最快的。 如果你的项目有很大的访问量,或者你的项目很庞大并且不需要为写进行用户授权,架设 Git 守护进程来提供服务是不错的选择。 它使用与 SSH 相同的数据传输机制,但是省去了加密和授权的开销。

 

缺点

Git 协议缺点是缺乏授权机制。 而且9418是一个非标准端口,一般防火墙不会开放。

l 演示GIT协议的使用

cd luban.git/

#创建一个空文件,表示开放该项目

touch git-daemon-export-ok

#启动守护进程

$nohub git daemon --reuseaddr --base-path=/data/git-repository/ /data/git-repository/ &

#本地克隆远程项目

git clone git://192.168.0.147:9418/luban.git

感谢诸君的观看,文中如有纰漏,欢迎在评论区来交流。如果这篇文章帮助到了你,欢迎点赞👍关注。