Git
章节 ▾ 第二版

4.6 服务器上的 Git - 智能 HTTP

智能 HTTP

我们现在已经通过 SSH 实现了经过身份验证的访问,并通过 git:// 实现了未经身份验证的访问,但还有一种协议可以同时实现这两者。设置智能 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