本文主要说明如何发布Git仓库。
对于Git来说,服务器并不是必需的。Git更乐于与同一台机器上的同级版本库直接交换文件,而不需要某个服务器来进行代理,或通过各种不需要上级服务器的协议与不同机器交换文件。
无论是要建立一个开源的开发环境,以让更多人通过互联网协同开发项目,还是在某个群体内部建立开发项目,其协作的本质是相同的。主要区别就是版本库的位置和访问方式。
在Git中,Git并没有尝试去管理访问权限,而是把这个问题留给了其它工具,比如SSH可能更加适合。比如直到有版本库的UNIX访问权限,要么通过SSH并执行cd命令切换到该版本库,要么切换你拥有的直接rwx访问权限的版本库,就可以提交到该版本库。
而在任何情况下发布一个版本库时,都强烈建议发布裸版本库。
之前提到,将裸版本库发布到组织内一个文件系统的已知位置,从而使每个人都可以访问,对放牧来说已经OK了。
但是,这种上下文中的访问就意味着所有开发人员都可以在他们的机器上看到该文件系统,并拥有UNIX系统中的所有权和读写权限。此时可能一个NFS挂载的文件系统就可以提供这样的共享支持。
而如果使多个开发机器同时使用,就需要稍微复杂的访问控制,比如版本库仓库和开发机器分离。而若直接访问文件系统(如NFS)不可用,就可以使用通过用SSH的URL来命名的版本库。
而如果想要共享代码,可能需要建立一个宿主服务器来发布版本库并允许其它人克隆,而所有开发人员往往只需要匿名的只读访问权限来从这些版本库中克隆或抓取。常用的方法就是使用git-daemon或HTTP守护进程来将它们导出。
使用git-daemon发布版本库
git-daemon允许用户使用Git原生协议导出版本库。
必须通过某种方式把版本库标记为“可以导出(OK to be exported)”。通常情况下,可以通过在裸版本库的顶级目录创建git-daemon-export-ok文件来实现。
为了避免单独标记每个版本库,也可以在运行git-daemon命令时加上--export-all选项来发布所有在其目录列表中可识别的版本库。另外git-daemon命令还有许多选项来限制并设置哪些版本库会导出。
在服务器上建立git-daemon的一种常见方式是将之作为一个inted服务启用。这需要在/etc/services目录中确保有Git的条目。其端口号为9418,但也可以其它的端口号,其典型条目类似:
git 9418/tcp # Git
一旦将上述内容添加至/etc/services中,就必须要在/etc/inetd.conf中建立条目来指定git-daemon应当怎样调用。条目内容可能如下:
git stream tcp nowait nobody /usr/bin/git-daemon git-daemon --inted --verbose --export-all --base-path=/pub/git
如果使用xinetd而不是inetd,那么需要在/etc/xinetd.d/git-daemon文件中加入相似的配置信息。
- service git
- {
- disable = no
- type = UNLISTED
- port = 9418
- socket_type = stream
- wait = no
- user = nobody
- server = /usr/bin/git-daemon
- server_args = --inetd --export-all --base-path=/pub/git
- log_on_failure += USERID
- }
上面的做法可以使版本库看起来位于不同的主机上,尽管它们只是位于同一主机中的不同目录中。
同时还可以允许一台服务器提供多个实质上托管于Git守护进程的版本库:
git stream tcp nowait nobody /usr/bin/git-daemon git-daemon --inted --verbose --export-all --interpolated-path=/pub/%H%D
这里,%H代替完整的主机名,%D代替版本库目录路径。而因为%H可以是一个逻辑主机名,所以不同组的版本库可以处于同一台物理服务器中。
使用HTTP守护进程发布版本库
使用HTTP守护进程也可以发布允许匿名读取访问的版本库。如果还搭建了gitweb,那么访问者就可以在Web浏览器中输入URL,来查阅版本库索引列表。访问者也就不需要通过运行git来下载文件了。
在能正确启动HTTP守护进程之前,可能需要在Git裸版本库中进行配置调整,核实hooks/post-update脚本是可执行的。
使用智能HTTP发布版本库
可查git-http-backend命令的帮助文档。
从实现来讲,可以使用Git原生协议的URL形式,为git-daemon服务的版本库提供匿名写入权限。此时需要在已发布的版本库中启用receivepack选项:
- [daemon]
- receivepack = true
虽然这种方法可以在LAN上设置,但通常更推荐使用SSH实现。
在GitHub上发布版本库的过程一般为: