赞
踩
要使用Git与其他人协作,比如拥有一个远程Git仓库。从理论上讲,你可以直接将你的更改推送到其他人的仓库,或是从他人的仓库拉取数据。但是这种做法是不推荐的,因为如果你不小心,就会很容易搞乱别人当前的工作。而且,你希望你的协作者在你自己的计算机离线的状态下也能访问Git仓库,这时一个拥有稳定的公共仓库就显得格外重要了。所以与他人协作推荐的方法是,建立一个你们可以共同访问的中间仓库,大家都向该仓库推送数据,也都从中拉取数据。
运行一个Git服务器很简单。首先,你要选择服务器使用何种通信协议,下面将分别介绍Git常用支持的协议
Git可以使用4中主要的协议来传输数据:本地协议
、HTTP协议
、SSH协议
和Git协议
。现在我们来讨论这些协议是什么,以及各自的使用场景和不适用场景。
Git最基本的传输协议就是本地协议。在这种协议中,远程仓库就是磁盘上的另一个目录而已。当团队成员都就可以访问一个共享的文件系统(例如挂载的网络文件系统),或是在较少见的情况下,每位成员都登录到同一台计算机时,往往就会使用本地协议。不推荐后一种做法,因为所有的代码仓库都只保存在同一台计算机上,这样会大大增加灾难性数据丢失的可能性。
如果你挂在了共享文件系统,就可以从基于本地文件的Git仓库中克隆、推送或拉取数据。要克隆这种仓库或是将其作为已有项目的远程仓库,只需要把仓库的路径当成URL使用即可。例如,要克隆一个本地仓库,只需要执行如下命令:
git clone /srv/git/project.git
或者也可以执行如下命令:
git clone file://srv/git/project.git
如果你显示的指定使用 file://
作为URL的开头,Git的处理方式会稍有不同。具体地说,如果你只是指定文件系统路径,Git会尝试直接复制文件,或使用硬链接。但如果你使用的是file://
,Git会启动通常用来在网络上传输数据的进程,这种方式的传输速率要比前者低很多。使用file://
前缀的主要原因是希望去除仓库中外部引用或多于对象,以得到干净的仓库副本。这种情况通常出现在将数据从其他版本控制系统导入Git之后。
要把本地仓库添加到已有的Git项目中,可以执行一下命令
git remote add local_proj /srv/git/project.git
这样就可以像通过网络一样对该远程仓库拉取或推送数据了。
基于文件的仓库简单易用,可以使用已有的文件权限和网络访问权限。
本地协议的缺点是共享文件系统不易设置,很难让本地网络之外的用户访问到。如果你在家使用自己的笔记本电脑推送数据,就的挂载远程的磁盘,相较于基于网络的访问,这样做不但麻烦,而且速度也慢。
本地协议不能保护仓库免遭意外损坏。每个用户都对“远程”目录拥有完全的shell访问权限,这样一来就无法阻止用户意外改变或删除Git内部文件。
Git有两种不同的HTTP通信模式。一种是非智能HTTP协议非常简单,通常是只读形式。另一种是智能HTTP协议,它可以使用类似SSH协议的方式智能协商数据传输。
智能HTTP协议与SSH或Git协议的运作方式非常相似,但它使用的是标准的HTTP/S端口通信,你可以使用HTTP协议的各种身份验证机制。这意味着它比SSH等协议更加容易使用,因为你可以使用“用户名/密码”的基本验证方式、而不需要配置SSH密钥。
如果服务器端没有“智能HTTP协议”服务,Git客户端会尝试降级并使用最简单的“非智能HTTP协议”。这种协议,服务器把裸仓库作为普通文件传输给用户。这种协议的优点在于易于架设和配置。基本上你要做的就是把裸仓库放在HTTP服务器根目录,然后设置一个特定的post-update
钩子函数就可以了。这样设置之后,任何能够访问Web服务器的人都可以克隆仓库。
你可以执行以下命令
这样其他人就可以通过git clone
命令克隆仓库了。
集中分析智能HTTP。
对于最终用户来说,使用同一个URL就可以推送或拉取数据,仅在需要身份验证时服务器才会提示用户输入身份信息,这是十分方便的。
使用HTTP/S协议的另一个优点在于其应用非常的广泛,集团防火墙乙肝都会允许来自HTTP/S协议端口的流量。
在某些服务器上,基于HTTP/S的Git服务回避使用SSH的Git服务更难搭建。除此之外,就Git而言,其他协议与“智能HTTP协议”相比并不占优势。
后面会介绍如何设置安全的HTTP密码缓存。
在自建Git服务器的情况下,SSH是常见的传输协议之一。这是因为大多数服务器已经默认设置了SSH访问,而且对于那些尚未设置SSH访问的服务器来说,设置起来也很简单。SSH也支持身份验证,而且它几乎无处不在,很容易设置和使用。
通过SSH克隆Git仓库,可以像下面这样指定以ssh://
开头的URL:
git clone ssh://user@server/project.git
或者你也可以使用类似SCP协议的简短语法:
git clone user@server:project.git
你也可以不使用用户名,这样Git会默认使用当前登录的用户名。
使用SSH协议的优点有很多。首先,SSH易于设置并且应用广泛,大多数网络管理员都拥有相关的经验,很多操作系统发行版也默认设置了SSH或是包含相关的管理工具。其次,基于SSH的访问能够保证安全,所有数据传输都是加密的,并且经过了身份验证。最后,就像HTTP/S协议,Git协议和本地协议一样,SSH协议效率高,数据在传输之前会被尽可能压缩。
SSH的缺点是不能实现对仓库的匿名访问。要想通过SSH访问Git仓库,用户必须首先有服务器的SSH访问权限,即使用户只需要仓库的只读访问权限也是如此。正因如此,一些开源项目并不倾向于使用SSH访问。如果只在公司内网使用SSH协议,也许对你来说就够用了。
他是Git自带的一种守护进程,专门监听9418
端口,提供类似于SSH协议的服务,但不提供任何的身份验证方式。要允许某个仓库通过Git协议提供服务,必须要在仓库中创建git-daemon-export-ok
文件,否则,Git协议的守护进程不会提供该仓库的服务。通过这种方式提供的服务并没有任何安全机制,要么所有人都可以克隆仓库,要么所有人都不能克隆。、
一般来说,在所有Git可以使用的网络传输中,Git协议是最快的。对于大访问量的公共项目,或是不需要用户身份验证就可以只读访问的大型项目,可能需要启用Git守护进程来提供Git协议服务。Git协议使用与SSH一致的数据传输机制,但没有加密传输和用户身份验证所带来的额外开销。
缺少用户验证机制,所以一般不会把Git协议作为项目的唯一访问方式。通常会搭配SSH或HTTPS协议,供少数人有推送(写)权限的开发人员使用,其他人则通过git://
以只读的方式访问项目。其次,Git协议也难以配置,必须启用自己的守护进程,也需要防火墙允许9418这个端口。
基于Linux的服务器进行演示
使用git clone --bare xxx xxx.git
命令从已有的仓库中导出一个新的裸仓库。(裸仓库目录名结尾一般是.git
)。
以上命令等同于cp -Rf xxx/.git xxx.git
这里假设你已经设置好了一个名为git.example.com并拥有SSH访问权限的服务器
。你希望把所有Git仓库都放在/srv/git目录下。这是你可以把裸仓库复制到该目录,以此创建新的仓库
scp -r xxx.git user@git.example.com:/srv/git
如果用户通过SSH登录服务器时拥有对/srv/git/xxx.git的写权限,就可以自动获得该仓库推送数据的权限。
如果执行git init
命令时添加了–shared参数,Git就会自动为用户组赋予仓库的写权限。
ssh user@git.example.com
cd /srv/git/xxx.git
git init --bare --shared
值得一提的是,上述操作过程就是运行一台Git服务器所需的全部操作步骤,同时该服务器也可以支持多人协作。只需要在服务器上添加拥有SSH权限的账号,然后把裸仓库放在所有用户都能读写的某个目录下就可以了。
要为团队所有成员提供访问权限,有几种可选的方式。
第一种是为每个人建立服务器账号,这种方式很直接,但是操作起来会有点繁琐,因为要为每个用户执行一次adduser并且设置每个人的临时密码。
第二种方式是在服务器上创建单个git用户,要求全部拥有写权限的用户把SSH公钥发送给你,你再把他们的公钥添加到新创建的git用户的~/.ssh/authorizied_keys
文件中。
另一种方式就是把你的SSH服务器身份验证方式设置为使用LDAP服务器或者其他类似的集中式身份验证服务。只要每个Git用户都能通过shell访问服务器,不管使用何种SSH身份验证机制都可以。
查看自己的家目录,是否有.ssh
目录,如果没有则执行入下命令进行生成
第一个表示你创建ssh秘钥的存放位置,后面是询问你口令(如果你不想每次使用密钥时都键入密码,则可以留空)
找到如下两个文件
然后把这个公钥的内容复制下来发送给管理员就可以了。
创建git用户并为其创建.ssh目录
sudo adduser git
su git
cd
mkdir .ssh && chmod 700 .ssh
touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
只需要把公钥追加到authorized_keys
文件的尾部,如下所示
cat /tmp/is_rsa.join.pub >> ~/.ssh/authorized_keys
cat /tmp/is_rsa.j0sie.pub >> ~/.ssh/authorized_keys
cat /tmp/is_rsa.jessica.pub >> ~/.ssh/authorized_keys
配置这种服务只需要在服务器上启用Git自带的CGI脚本git-http-backend
。该CGI脚本会读取基于HTTP的git fetch或是git push请求的头部信息和请求的URL路径,并检查客户端是否可以通过HTTP通信。如果CGI脚本的检测到客户端支持智能HTTP,它就会使用智能协议与客户端进行通信;否则它会降级到非智能协议。
Gitlab是使用数据库的Web应用,所以它的安装会比其他方案更加复杂。好在整个安装过程都有完备的文档和支持
如果你不想自己动手设置Git服务器,那么还可以选择将Git项目托管到专门的第三方托管网站上。这样做的优势不止一点:托管网站易于设置、上手简单,而且用不着操心服务器维护和监控。即便是设置并运行了自己的内部服务器,你可能仍需要为开源代码使用公开的托管网站,这样更容易获得开源社区的关注和帮助。
如今,可以使用的托管服务数量繁多,各有优势。可以查看Git wiki的GitHosting页面来获得最新的托管服务列表。
会在后面详细讲解GitHub
,GitHub是最大的Git托管网站,你也许少不了要同托管上的项目打交道,但如果你不打算设置自己的Git服务器,可供使用的其他选择还有很多。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。