-
A1. 附录 A: Git 在其他环境
- A1.1 图形界面
- A1.2 Visual Studio 中的 Git
- A1.3 Visual Studio Code 中的 Git
- A1.4 IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine 中的 Git
- A1.5 Sublime Text 中的 Git
- A1.6 Bash 中的 Git
- A1.7 Zsh 中的 Git
- A1.8 PowerShell 中的 Git
- A1.9 小结
-
A2. 附录 B: 在应用程序中嵌入 Git
-
A3. 附录 C: Git 命令
4.6 服务器上的 Git - 智能 HTTP
智能 HTTP
我们现在已经通过 SSH 实现了认证访问,并通过 git://
实现了非认证访问,但还有一种协议可以同时实现这两种访问。设置智能 HTTP 基本上就是启用 Git 提供的一个 CGI 脚本,名为 git-http-backend
,在服务器上。这个 CGI 会读取 git fetch
或 git push
到 HTTP URL 时发送的路径和头部,并判断客户端是否可以通过 HTTP 进行通信(自 1.6.6 版本以来,任何客户端都支持)。如果 CGI 发现客户端是智能的,它将与客户端进行智能通信;否则它将回退到非智能行为(因此对于旧客户端的读取是向后兼容的)。
让我们来看一个非常基本的设置。我们将使用 Apache 作为 CGI 服务器。如果你没有设置 Apache,可以在 Linux 系统上像这样操作
$ sudo apt-get install apache2 apache2-utils
$ a2enmod cgi alias env
这还会启用 mod_cgi
、mod_alias
和 mod_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 daemon 所做的那样。
最后,你需要告诉 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。 |