Git快速入门(05)Git的四种通信协议

Git是一个分布式的版本管理工具,分布式肯定会涉及到远程通信,下面我们来了解一下Git的远程通信协议。分布式通信需要有应用协议,应用协议的实现包含编码,解码和远程传输的实现,Git支持四种应用协议,分别是Local,http,git,ssh。通过四种协议都可以手动搭建简单的git仓库私服。





Local协议(本地协议)

本地协议和分布式有什么关系呢?本地协议可以基于本地文件系统,或者共享(NFS)文件系统进行访问,来实现源码的一个共享,使用Local协议搭建Git私服是最轻松的,也是最简单的。我们可以在一个服务器中,专门建立一个文件夹进行共享,作为一个Git的私服,然后把我们的项目代码放进去,存储在文件夹中。开发人员就可以基于本地协议,直接访问文件夹,实现代码的推送和拉取,

优点:

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

缺点:

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

适应场景:

小团队,小项目临时搭建版本服务。

下面来演示一下使用Local协议搭建git私服。比如我们来使用目录 /tmp/git/local 作为git公共仓库,我们来在仓库中创建一个裸项目,名字为hello:

git init --bare hello.git

可以看到仓库没有类似.git 的文件夹目录,进入仓库后就是类似.git文件夹内容的目录,这样一个本地git私服就创建完了,非常简单。开发人员以及可以拉取和提交内容了。前提是能否访问得到这个目录。

我们不再将文件夹进行共享,直接在本机访问私服,直接创建目录,/tmp/git/user,然后克隆项目: 

可以看到我们直接输入仓库的文件夹路径就能克隆下这个本地git仓库,我们来提交一个文件:

这时候再来一个开发人员,比如在 /tmp/git/user2 下面从新拉取代码加入开发:

我们可以看到,第二个同学在拉取代码的时候可以正常的把前面的人的代码拉取下来,这样两个人可以和谐的共同工作!通过上面可以看到,通过local协议创建git私服是非常的简单快速。这是在同一台电脑上演示,如果访问局域网的共享文件,按照正常的方法加上ip,访问共享文件夹即可。

上面除了可以使用文件夹路径的方式,还可以使用file协议,比如

git clone file:///D:/a/b/c.git

使用file协议的区别在于,在拉取代码的时候,file协议会对文件的元数据进行压缩,非file协议会把远程私服的objects文件夹全部拷贝下来,file协议拷贝的是git gc后的内容,来看下git gc前后的区别:

git gc来举个例子,例如我们新建了一个分支,并在分支上做了一些提交,但是切换回来后,并没有把新分支merge到主干上面,这时候发现新建的分支做了无用功,因此删除了,但是新分支做的提交的元数据依然存在,这时候可以通过 git gc 来删除无用的元数据。感兴趣可以试一下。









ssh协议

在Linux中,ssh协议是我们经常用到的。ssh属于Linux里面的一个通信协议,基于ssh在Linux中搭建私服,访问Git仓库是不需要做额外的配置的。只需要基于ssh的用户名密码即可。git 支持利用ssh 协议进行通信,这是绝大部分linux、uninx系统都支持的,所以利用该协议架设GIT版本服务是非常方便的。

优点:

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

缺点:

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

适用场景:

团队、小项目、临时项目

下面来演示一下,我们在服务器192.168.65.135上面创建一个裸项目,

然后在另一台服务器192.168.65.137上面通过ssh协议,拉取代码:

git clone root@192.168.65.135:/tmp/git/hello.git

这种方式需要输入一次密码,注意,如果输入密码后显示下面的错误:

什么原因呢?原来代码服务器【192.168.65.135】上的git安装路径是/usr/git,不是默认路径,根据提示,在git服务器192.168.65.135上, 建立链接文件:

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

再试就可以了。如果想再省事一点,不想输入密码,可以在代码服务器集中配置使用者的公钥,这样可以免密登录。首先在192.168.65.137开发服务器上生成公钥:

ssh-keygen -t rsa

公钥生成的位置在用户目录下的.ssh文件夹下面,我们来查看公钥内容:

cat ~/.ssh/id_rsa.pub

复制内容,到代码服务器的用户目录的.ssh文件夹下面的authorized_keys文件中,没有就新建:

这样就完成了免密码登录,我们再来从新克隆,就不用了要求输入密码了:

下面就可以在这个项目里提交和修改了!







http协议

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 证书之类的配置

适用场景:

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

哑协议最大的特点就是只读,不能够推送代码,只能够拉取。下面演示一下哑协议,首先还是使用上面创建的裸项目:

/tmp/git/hello.git

然后在仓库中加一个钩子,首先进入目录:

cd  /tmp/git/hello.git/hooks

然后修改文件:

mv post-update.sample post-udpate

这个表示当有项目修改的时候,就会触发这个钩子,来看一下文件的内容:

文件显示执行了一个命令,这个命令是帮我们打包,然后生成web端能够访问的静态文件,其实就是生成了一些索引目录,如果是空项目,没有任何变化的时候,没有打过包,那么远程其实是无法通过http拉取代码的,我们现在来执行一下(进入hello.git文件夹执行即可):

git update-server-info


然后我们在仓库服务器上面安装一个Nginx(关于Nginx的学习,可以访问我的Nginx教程),访问效果如下:

下面来修改nginx的配置文件,首先配置使用root权限:

然后配置域名为:

git.demo.com

然后把root指定为git仓库的路径:

表示/tmp/git下面的所有git项目都可以访问,然后把index删掉:

这样一个简单的git服务配置就完成了,我们从新加载nginx,然后在本地从新配置一个host:

这时候我们来访问一下域名:

之所以访问不到,是因为它虽然是http协议,但是git本身并没有提供任何页面,我们可以通过http拉取代码,但是没有提供可供访问的页面,我们来直接拉取代码试试:

可以看到拉取代码是没问题的!不过哑协议只能拉取,无法提交。


哑协议只能拉取代码,但是http智能协议可以同时实现拉取和推送。 设置 Smart HTTP 一般只需要在服务器上启用一个 Git 自带的名为 git-http-backend 的 CGI 脚本。 该 CGI 脚本将会读取由 git fetch 或 git push 命令向 HTTP URL 发送的请求路径和头部信息,来判断该客户端是否支持 HTTP 通信(不低于 1.6.6 版本的客户端支持此特性)。 如果 CGI 发现该客户端支持智能(Smart)模式,它将会以智能模式与它进行通信,否则它将会回落到哑(Dumb)模式下(因此它可以对某些老的客户端实现向下兼容)。(智能协议使用不再演示)






git协议

git协议类似svn,本身会启动一个git进程。接下来我们将通过 “Git” 协议建立一个基于守护进程的仓库。 对于快速且无需授权的 Git 数据访问,这是一个理想之选。 请注意,因为其不包含授权服务,任何通过该协议管理的内容将在其网络上公开。如果运行在防火墙之外的服务器上,它应该只对那些公开的只读项目服务。 如果运行在防火墙之内的服务器上,它可用于支撑大量参与人员或自动系统(用于持续集成或编译的主机)只读访问的项目,这样可以省去逐一配置 SSH 公钥的麻烦。

Git 协议是非常容易设定的。 我们来以后台形式运行下面的命令,比如我们的git所有仓库的根目录为 /tmp/git:

nohup git daemon --reuseaddr --base-path=/tmp/git/ /tmp/git/ &

这样我们的git协议就配置好了,然后在仓库下面创建一个项目:

然后进入项目文件夹,新建一个文件git-daemon-export-ok:

在Git 工程下新建一个名为 git-daemon-export-ok 的文件放到 .git 目录下,表明该工程允许非授权访问。接下来我就可以从远程克隆项目了:

远程提交同样没问题:

这样通过git协议搭建私服就完成了!我们来看一下服务器上面的git守护进程:

当我们停掉这个进程的时候,git仓库也就无法访问了!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,082评论 5 464
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,231评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,047评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,977评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,893评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,976评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,605评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,888评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,906评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,732评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,513评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,980评论 3 301
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,132评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,447评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,027评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,232评论 2 339

推荐阅读更多精彩内容

  • 一 Git配置和仓库初始化 下面会介绍Git的使用,每个小节里会讲解各个功能在命令行中的实现方式,并在每小节的最后...
    Happioo阅读 3,313评论 0 5
  • 第一部分:Git的基本操作 初始化操作 $ git config -global user.name #设置提交...
    庄欲以莘阅读 1,866评论 0 4
  • 一、基本概念: 注:对于git的分布式概念及其优点,不重复说明,自己百度或谷歌。本文中涉及到指令前面有$的,在cm...
    大厂offer阅读 1,393评论 0 3
  • 简介 什么是git? git是一款开源的分布式版本控制工具 在世界上所有的分布式版本控制工具中,git是最快、最简...
    JonesCxy阅读 990评论 0 3
  • 今天我们语文学习了小公鸡和小鸭子一课,老师告诉我们要学会分享和友爱!数学讲的口算题卡的错题并改正。还有认识钟表!还...
    郭宇妍阅读 130评论 0 0