章节 ▾ 第二版

4.6 服务器上的 Git - Smart HTTP

Smart HTTP

现在我们有了通过 SSH 进行身份验证的访问,以及通过git://进行未经身份验证的访问,但还有一种协议可以同时执行这两种操作。 设置 Smart HTTP 基本上只是在服务器上启用 Git 提供的 CGI 脚本,称为git-http-backend。 此 CGI 将读取git fetchgit push发送到 HTTP URL 的路径和标头,并确定客户端是否可以通过 HTTP 进行通信(自 1.6.6 版本以来,所有客户端都是如此)。 如果 CGI 看到客户端是智能的,它将以智能方式与它通信; 否则,它将回退到哑行为(因此它与旧客户端的读取向后兼容)。

让我们来看看一个非常基本的设置。 我们将使用 Apache 作为 CGI 服务器来设置它。 如果你没有设置 Apache,你可以在 Linux 机器上执行以下操作:

$ sudo apt-get install apache2 apache2-utils
$ a2enmod cgi alias env

这也启用了mod_cgimod_aliasmod_env模块,这些模块都是正常工作所必需的。

你还需要将/srv/git目录的 Unix 用户组设置为www-data,以便你的 Web 服务器可以读取和写入访问存储库,因为运行 CGI 脚本的 Apache 实例(默认情况下)将以该用户身份运行

$ chgrp -R www-data /srv/git

接下来,我们需要向 Apache 配置添加一些内容,以运行git-http-backend作为任何进入 Web 服务器/git路径的处理程序。

SetEnv GIT_PROJECT_ROOT /srv/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/lib/git-core/git-http-backend/

如果你省略GIT_HTTP_EXPORT_ALL环境变量,那么 Git 只会将带有git-daemon-export-ok文件的存储库提供给未经身份验证的客户端,就像 Git 守护程序所做的那样。

最后,你将需要告诉 Apache 允许对git-http-backend的请求,并通过某种方式对写入进行身份验证,可能使用像这样的 Auth 块

<Files "git-http-backend">
    AuthType Basic
    AuthName "Git Access"
    AuthUserFile /srv/git/.htpasswd
    Require expr !(%{QUERY_STRING} -strmatch '*service=git-receive-pack*' || %{REQUEST_URI} =~ m#/git-receive-pack$#)
    Require valid-user
</Files>

这将要求你创建一个.htpasswd文件,其中包含所有有效用户的密码。 这是一个将“schacon”用户添加到该文件的示例

$ htpasswd -c /srv/git/.htpasswd schacon

有很多方法可以让 Apache 对用户进行身份验证,你必须选择并实施其中一种。 这只是我们可以想到的最简单的例子。 你几乎肯定还需要通过 SSL 设置此设置,以便所有这些数据都经过加密。

我们不想在 Apache 配置细节的兔子洞里走得太远,因为你很可能正在使用不同的服务器或有不同的身份验证需求。 我们的想法是,Git 附带一个名为git-http-backend的 CGI,当调用它时,它将进行所有协商以通过 HTTP 发送和接收数据。 它本身不实现任何身份验证,但这可以很容易地在调用它的 Web 服务器层进行控制。 你几乎可以使用任何支持 CGI 的 Web 服务器来执行此操作,因此请选择你最熟悉的那个。

注意

有关在 Apache 中配置身份验证的更多信息,请查看 Apache 文档:https://httpd.apache.ac.cn/docs/current/howto/auth.html

scroll-to-top