Git学习笔记
#####################################################
qq:1218761836
qq群:150181442
E-mail:[email protected]
#####################################################
目录
git. 1
一 Git支持的协议... 1
1.1 本地协议... 1
1.1.2 优点... 2
1.1.2 缺点... 2
1.2 HTTP协议... 2
1.2.1 智能(Smart)HTTP协议... 2
1.2.2 (Dumb)HTTP协议... 3
1.2.3 优点... 3
1.2.3 缺点... 3
1.3 SSH协议... 4
1.3.1 优点... 4
1.3.2 缺点... 4
1.4 Git协议... 4
1.4.1 优点... 4
1.4.2 缺点... 5
git支持的协议
git |
git:// |
SSH+git |
ssh:// |
Http+git |
http:// |
Https+git |
https:// |
File(本地) |
File:// |
安装好git之后就可以使用git来完成日常工作。然而,为了使用git协作功能,你还需要有远程的git仓库。尽管在技术上你可以从个人仓库进行推送(push)和拉取(pull)来修改内容,但不鼓励使用这种方法,因为这样很容易弄混其他人的进度,此外,你希望你的合作者们即使在你的电脑未联网时亦能存取仓库-拥有一个更可靠的公用仓库十分有用。因此,与他人合作的最佳方法就是建立一个你与合作者们都有权利访问,且可从那里推送和拉取资料的共用仓库。
git可以使用四种主要的协议传输资料:本地协议(local),HTTP协议,SSH(Secure Shell)协议及git协议。
最基本的就是本地协议(local protocol),其中的远程版本库就是硬盘内的另一个目录,这常见于团队每一个成员都对一个共享的文件系统(例如一个挂载的NFS)拥有访问权,或者比较少见的多人共用同一台电脑的情况,后者并不理想,因为你的所有代码版本库如果长存于同一台电脑,更可能发生灾难性的损失。
如果你使用共享文件系统,就可以从本地版本库克隆(clone)、推送(push)以及拉取(pull)。像这样去克隆一个版本库或者增加一个版本库或者远程到现有的项目中,使用版本库路径为URL,例如,克隆一个本地版本库;
git clone /opt/git/project.git
或者
git clone file:///opt/git/project.git
如果在URL开头明确的指定file:// ,那么git的行为会略有不同。如果仅是指定路径,git会尝试使用硬链接(hard link)或直接复制所需要的文件。如果指定file://,git会触发平时用于网络传输资料的进程,那通常是传输效率较低的方法。指定file:// 的主要目的是取得一个没有外部参考(extraneous references)或对象(object)的干净版本库副本-通常是在其他版本控制系统导入后或一些类似情况需要这么做,在此,我们使用普通路径,因为这样通常更快。
要增加一个本地版本库到现有的git项目
git remote add local_proj /opt/git/project.git
然后,就可以像在网络上一样从远端版本库推送和拉取更新了。
基于文件系统的版本库优点是简单,并且直接使用了现有的文件权限和网络访问权限。如果你的团队已经有共享文件系统了,建立版本库会十分容易。只需要像设置其他共享目录一样,把一个裸版本库的副本放到大家都可以访问的路径,并设置好读写权限,就可以了。
这种方法的缺点是,通常共享文件系统比较难配置,并且比起基本的网络连接访问,这不方便从多个位置访问,如果你想从家里推送内容,必须先挂载一个远程磁盘,相比网络连接的访问方式,配置不方便,速度也慢。
值得一提的是如果你使用的是类似于共享挂载文件系统时,这个方法不一定是最快的。访问本地版本库的速度与你访问数据的速度是一样的。在同一个服务器上,如果允许git访问本地硬盘,一般的通过NFS访问版本库要比SSH访问慢。
最终,这个协议并不保护仓库避免意外的损坏。每一个用户都有”远程”目录的完整shell权限,没有方法可以阻止他们修改或删除git内部文件和损坏仓库。
Git通过HTTP通信有两种模式,在git 1.6.6 版本之前只有一个方式可用,十分简单并且通常是只读模式的,git 1.6.6版本引入一种新的、更智能的协议,让git可以像通过SSH那样智能的协商和传输数据。之后几年,这个新的HTTP协议因为其简单、智能变的十分流行,新版本的HTTP协议一般被称为”智能”HTTP协议,旧版本的一般被称为”哑”HTTP协议。
“智能”HTTP协议的运行方式和SSH及git协议类似,只是运行在标准的HTTP/S 端口上并且可以使用各种HTTP验证机制,这意味着使用起来会比SSH协议简单的多,比如我们使用HTTP协议的用户名/密码的基础授权,免去设置SSH公钥。
智能HTTP协议或许已经是最流行的使用git的方式了,它即支持像git:// 协议一样设置匿名服务,也可以像SSH协议一样提供传输时的授权和加密。而且只用一个URL就可以做到,省去了为不同的需求设置不同的URL,如果你需要推送到一个需要授权的服务器上(一般来讲都需要),服务器会提示你输入用户名和密码,从服务器获取数据时也一样。
事实上类似github的服务,URL
https://github.com/schacon/simplegit[]),和你在克隆、推送(如果你有权限)时使用的是一样的。
如果服务器没有提供智能HTTP协议的服务,git客户端会尝试使用简单的”dumb”HTTP协议,Dumb协议里web服务器仅把裸版本库当做普通文件来对待,提供文件服务。Dumb HTTP协议的优美之处在于设置超起来简单,基本上,只需要把一个裸版本库放在HTTP根目录,设置一个post-update的挂钩就可以了(git的钩子)此时,只要能访问web服务器上你的版本库,就可以克隆你的版本库。如下:
cd /var/www/htdocs/
git clone --bare /path/to/git_project gitproject.git
cd gitproject.git
mv hooks/post-update.sample hooks/post-update
chmod a+x hooks/post-update
这样就可以了,git自带的post-update挂钩会默认执行合适的命令(git update-server-info),来确保通过HTTP的获取和克隆操作正常工作。这条命令会再你通过SSH向版本库推送之后被执行;然后别人就可以通过类似下面的命令来克隆。
git clone https://example.com/gitproject.git
这里我们用了apache里设置了常用的路径/var//www/htdoc, 不过你可以使用任何静态web服务器-只需要把裸版本库放到正确的目录下就可以,git的数据是以基本的静态文件形式提供的。
通常的,会再可以提供读/写的智能HTTP服务和简单的只读Dump HTTP服务之间选一个。极少会将二者混合提供服务
不同的访问方式只需要一个URL以及服务器只在需要授权时提示输入授权信息,这两个简便性让终端用户使用git变得非常简单,相比SSH协议,可以使用用户名/密码授权是一个很大的优势,这样用户就就不必须在使用git之前先在本地生成SSH密钥对再把公钥上传到服务器。对非资深的使用者,或者系统上缺少SSH相关程序的使用者,HTTP协议的可用性是主要的优势,与SSH协议类似,HTTP协议也非常快和高效 。
在一些服务器上,架设HTTP/S协议的服务端会比SSH协议棘手一些。除了这一点,用其他协议提供git服务与”智能”HTTP协议相比就几乎没有优势了。
如果你在HTTP上使用需授权的推送,管理凭证会比使用SSH密钥认证麻烦一些。然而,你可以选择使用凭证存储工具,比如OSX的keychain或者windows的凭证管理器。
架设git服务器时常用SSH协议作为传输协议,因为大多数环境下一句支持通过SSH访问――即时没有也比较狠容易架设。SSH协议也是一个验证授权的网络协议;并且,因为其普遍性,架设和使用都很容易。
通过SSH协议克隆版本库,你可以指定一个ssh:// 的URL:
git clone ssh://user@server/project.git
或者使用一个简短的scp式的写法:
git clone user@server:project.git
用SSH协议的优势有很多。首先,SSH架设相对简单――SSH守护进程很常见,多数管理员都有使用经验,并且多数操作系统都包含了它及相关的管理工具。其次,通过SSH访问是安全的――所有传输数据都要经过授权和加密,最后,与HTTP/S协议、git协议及本地协议一样,SSH协议最高效,在传输前也会尽量压缩数据
SSH协议的缺点在于你不能通过他实现匿名访问。即便只要读取数据,使用者也要有通过SSH访问你的主机权限,这使得SSH协议不利于开源的项目,如果你只在公司网络使用,SSH协议可能是你唯一要用到的协议,如果你要同事提供匿名访问和SSH协议,那么你出了为自己架设SSH服务以外,还得架设一个可以让其他人访问的服务。
Git协议,这是包含在特殊的守护进程;它监听在一个特定的端口(9418),类似SSH服务,但是访问无需任何授权,要让版本库支持git协议 ,需要先创建一个git-daemon-export-ok文件――它是git协议守护进程为这个版本库提供服务的必要条件――但是除此之外没有任何安全措施,要么谁都可以克隆这个版本库,要么谁也不能。这意味着,通常不能通过git协议推送。由于没有授权机制,一旦你开放推送操作,意味着网络上知道这个项目URL的人都可以向项目推送数据。这么现象很少出现。
目前,git协议是git使用的网络传输协议里最快的。如果你的项目有很大的访问量,或者你的项目很庞大并且不需要为写进行用户授权,架设git守护进程来提供服务时不错的选择。它使用与SSH相同的数据传输机制,但是省去了加密和授权的开销。
Git协议缺点是缺乏授权机制,把git协议作为访问版本库的唯一手段是不可取的,一般的做法里,会同时提供SSH或者HTTPS协议的访问服务,只让少数几个开发有推送(写)权限,其他人通过git:// 访问只有读权限,git协议也许也是最难架设的,它需要有自己的守护进程,这就要配置xinetd或者其他程序,这些工作并不简单,它还要求防火墙开放9418端口,但是企业防火墙一般不会开放这个非标准端口,而大型企业的额防火墙通常会封锁这个端口