git-http-backend与AuthzUnixGroup无法正常工作

时间:2014-06-11 18:57:44

标签: git apache centos centos6

我正在尝试在CentOS 6盒子上安装我的Apache 2.2上的git存储库,并安装了git。我尝试过很多不同的方向,但我很茫然。我目前的情况包括能够clone正常,但完全无法推动。

好像我无法让身份验证位正常工作,因为我可以在将http.receivepack设置为true时正常执行推送。

我已经安装了AuthzUnixGroup以及mod_authz_external

我前往/var/www/git并创建了一个名为my-repo.git的仓库,并在其中执行了git init --bare

然后我在git.conf内设置/etc/httpd/conf.d/文件,如下所示:

<VirtualHost "*:80">
  SetEnv GIT_HTTP_EXPORT_ALL
  SetEnv GIT_PROJECT_ROOT /var/www/git
  SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
  ScriptAlias /git /usr/libexec/git-core/git-http-backend
  AddExternalAuth pwauth /usr/local/libexec/pwauth
  SetExternalAuthMethod pwauth pipe

  <Directory "/usr/libexec/git-core/">
    AllowOverride None
    Options +ExecCGI -Includes
    Order allow,deny
    Allow from all
  </Directory>

  <Location "/git">
    AuthzUnixGroup on
    AuthType Basic
    AuthName "Git repository"
    AuthBasicProvider external
    AuthExternal pwauth
    Require group git
  </Location>

</VirtualHost>

将我的网络浏览器指向mysite/git很好地向我展示了HTTP基本登录对话框,该对话框完美无缺。我已将自己添加到组git,并在我的shell上执行groups返回:

naseri sudo git

这是预期的。

当我git clone http://mysite/git/my-repo.git时,我从/var/logs/httpd/access_log下的httpd的access_log文件中获取以下内容:

2.177.130.21 - - [11/Jun/2014:18:51:07 +0000] "GET /git/my-repo.git/info/refs?service=git-upload-pack HTTP/1.1" 401 480 "-" "git/1.8.5.2 (Apple Git-48)"
2.177.130.21 - - [11/Jun/2014:18:51:08 +0000] "GET /git/my-repo.git/info/refs?service=git-upload-pack HTTP/1.1" 401 480 "-" "git/1.8.5.2 (Apple Git-48)"
2.177.130.21 - naseri [11/Jun/2014:18:51:08 +0000] "GET /git/my-repo.git/info/refs?service=git-upload-pack HTTP/1.1" 200 256 "-" "git/1.8.5.2 (Apple Git-48)"
2.177.130.21 - naseri [11/Jun/2014:18:51:09 +0000] "POST /git/my-repo.git/git-upload-pack HTTP/1.1" 200 368 "-" "git/1.8.5.2 (Apple Git-48)"

在客户端上,clone正常运行。我改变了一些东西,然后尝试在提交git push内容之后推送。

这是我在服务器端登录的内容:

2.177.130.21 - - [11/Jun/2014:18:53:26 +0000] "GET /git/my-repo.git/info/refs?service=git-receive-pack HTTP/1.1" 401 480 "-" "git/1.8.5.2 (Apple Git-48)"
2.177.130.21 - naseri [11/Jun/2014:18:53:27 +0000] "GET /git/my-repo.git/info/refs?service=git-receive-pack HTTP/1.1" 401 480 "-" "git/1.8.5.2 (Apple Git-48)"
2.177.130.21 - naseri [11/Jun/2014:18:53:30 +0000] "GET /git/my-repo.git/info/refs?service=git-receive-pack HTTP/1.1" 403 - "-" "git/1.8.5.2 (Apple Git-48)"

我可以看到Apache在第一行响应(401)上发回了我的“需要身份验证”响应,但客户端向我显示:

fatal: unable to access 'http://mysite/git/my-repo.git/': The requested URL returned error: 403

我对这个问题一无所知,因为将我的浏览器指向同一个URL会正确地启用身份验证,它甚至可以正常工作。

2 个答案:

答案 0 :(得分:5)

older answer

  当客户端要求使用git-receive-pack方法时,

git-http-backend返回403 / Forbidden代码。
  然后它回退到WebDAV,但是没有必要使用WebDAV

     

我有同样的问题;在我的情况下,这是由于REMOTE_USER没有设置

由于我的任何Apache config都使用了=&#39;设置变量时,请检查这是否更好:

SetEnv REMOTE_USER $REDIRECT_REMOTE_USER

(两个变量之间没有&#39; -&#39}

同时检查(重新)定义REMOTE_USER是否也有效(因为它可能已经定义,而REDIRECT_REMOTE_USER可能没有定义):尝试不用该行。
我永远不必在我的Apache Git配置中定义它。

注意:with Git 2.21 (Q1 2019, 5+ years later), Git should be more robust

答案 1 :(得分:0)

我遇到过这样的情况,并发现尝试使用Apache来提供git是不容易或简单的。

相反,我建议安装Gerrit - 它允许托管多个存储库,最重要的是具有极其灵活的用户/组管理和权限模型。作为一个很好的奖励,它也恰好是非常强大的代码审查引擎,但它是完全可选的 - 如果你不想,你不必使用代码审查功能。

其他已知的解决方案是GitlabGitolite - 您可能也想查看它们。