通过 http 进行 git push 的身份验证

通过 http 进行 git push 的身份验证

我已按照 pro git 手册及其手册页中的说明设置 apache 以使用 git-http-backend。我的 apache 配置现在如下所示:

SetEnv GIT_PROJECT_ROOT /var/www/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/lib/git-core/git-http-backend/
<LocationMatch "^/git/.*/git-receive-pack$">
AuthType Basic
AuthName "Git Access"
Require group committers
</LocationMatch>

我可以使用克隆 repo git clone http: //user@url/git/repo.git
,它会提示我输入“用户”的密码,然后继续。但是,当我尝试推送时,系统会提示我输入密码两次,然后出现错误:

Cannot access URL http: //user@url/git/repo.git/, return code 22

(我在 URL 中插入了一个空格,因为否则垃圾邮件防范机制将不允许我发帖)

当我查看我的 apache 日志时,我看到:
192.168.1.151 - - [12/Sep/2010:20:11:22 +0100] "GET /git/repo.git/info/refs?service=git-receive-pack HTTP/1.1" 403 - "-" "git/1.7.2.3"
192.168.1.151 - - [12/Sep/2010:20:11:23 +0100] "GET /git/repo.git/info/refs HTTP/1.1" 200 59 "-" "git/1.7.2.3"
192.168.1.151 - - [12/Sep/2010:20:11:23 +0100] "GET /git/repo.git/HEAD HTTP/1.1" 200 23 "-" "git/1.7.2.3"
192.168.1.151 - - [12/Sep/2010:20:11:26 +0100] "PROPFIND /git/repo.git/ HTTP/1.1" 404 - "-" "git/1.7.2.3"

我已将“用户”添加到服务器上的“提交者”组(似乎最简单的方法是按照说明进行操作),并且我的本地 .netrc(chmodded 600)如下所示:

machine address
login user
password pass

我发现的每条指令似乎都不太清楚我是否必须为相关目录启用 DAV(尽管我认为这是旧方法)。我可以只需使用 gitolite,但我想先弄清楚这一点……

答案1

PROPFIND 是一种非标准的 webdav HTTP 方法。
您需要为存储库的位置启用 webdav。在 httpd.conf 中启用 mod_dav,并将其添加到您的 vhost LocationMatch 块中:

<LocationMatch "^/git/.*/git-receive-pack$">
  #...
  Dav on
</LocationMatch>

然后确保您的 Apache 用户对您的存储库具有写权限。

答案2

你的 apache 日志中最重要的是以下行:

  192.168.1.151 - - [12/Sep/2010:20:11:22 +0100] "GET /git/repo.git/info/refs?service=git-receive-pack HTTP/1.1" 403 - "-" "git/1.7.2.3"

当客户端请求使用 git-receive-pack 方法时,git-http-backend 返回 403/Forbidden 代码。然后它回退到 WebDAV,但使用 WebDAV 是不是必要的

我遇到了同样的问题;在我的例子中,这是由于未设置 REMOTE_USER 造成的。在我的例子中,REDIRECT_REMOTE_USER 已设置,因此我将 REMOTE_USER 设置为 REDIRECT_REMOTE_USER,这解决了问题。

我记录了我的设置博客- 看看这对您是否有用。

相关内容