Pro Git
professional version control
To help translate the book, please fork the book at GitHub and push your contributions.
公共访问
匿名的读取权限该怎么实现呢?也许除了内部私有的项目之外,你还需要托管一些开源项目。抑或你使用一些自动化的服务器来进行编译,或者一些经常变化的服务器群组,而又不想整天生成新的 SSH 密钥——总之,你需要简单的匿名读取权限。
或许对小型的配置来说最简单的办法就是运行一个静态 web 服务,把它的根目录设定为 Git 仓库所在的位置,然后开启本章第一节提到的 post-update
挂钩。这里继续使用之前的例子。假设仓库处于 /opt/git
目录,主机上运行着 Apache 服务。重申一下,任何 web 服务程序都可以达到相同效果;作为范例,我们将用一些基本的 Apache 设定来展示大体需要的步骤。
首先,开启挂钩:
$ cd project.git
$ mv hooks/post-update.sample hooks/post-update
$ chmod a+x hooks/post-update
假如使用的 Git 版本小于 1.6,那 mv
命令可以省略—— Git 是从较晚的版本才开始在挂钩实例的结尾添加 .sample 后缀名的。
post-update
挂钩是做什么的呢?其内容大致如下:
$ cat .git/hooks/post-update
#!/bin/sh
exec git-update-server-info
意思是当通过 SSH 向服务器推送时,Git 将运行这个命令来更新 HTTP 获取所需的文件。
其次,在 Apache 配置文件中添加一个 VirtualHost 条目,把根文件(译注: DocumentRoot 参数)设定为 Git 项目的根目录。假定 DNS 服务已经配置好,会把 .gitserver
发送到任何你所在的主机来运行这些:
<VirtualHost *:80>
ServerName git.gitserver
DocumentRoot /opt/git
<Directory /opt/git/>
Order allow, deny
allow from all
</Directory>
</VirtualHost>
另外,需要把 /opt/git
目录的 Unix 用户组设定为 www-data
,这样 web 服务才可以读取仓库内容,因为 Apache 运行 CGI 脚本的模块(默认)使用的是该用户:
$ chgrp -R www-data /opt/git
重启 Apache 之后,就可以通过项目的 URL 来克隆该目录下的仓库了。
$ git clone http://git.gitserver/project.git
这一招可以让你在几分钟内为相当数量的用户架设好基于 HTTP 的读取权限。另一个提供非授权访问的简单方法是开启一个 Git 守护进程,不过这将要求该进程的常驻——下一节将是想走这条路的人准备的。