Git 通过 HTTP 协议进行身份验证的克隆

Git clone with authentication over HTTP protocol

我有一台带有 git 存储库的 centos 7 服务器,通过智能 http 共享,当我设置 "git push" 时,身份验证有效,但当我设置 "git clone" 时,身份验证无效。我想要比 Git 和 Apache 询问我的用户名和密码来克隆 repos。

/var/www/git -> 是我的回购目录 /var/www/html -> 是网站目录

我的site.conf是:

<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName miserver.com
DocumentRoot /var/www/html

SetEnv GIT_PROJECT_ROOT /var/www/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git /usr/libexec/git-core/git-http-backend/

<Directory /var/www/html/gitweb>
    Options +ExecCGI +FollowSymLinks +SymLinksIfOwnerMatch
    AllowOverride All
    order allow,deny
    Allow from all
    AddHandler cgi-script cgi
    DirectoryIndex gitweb.cgi
</Directory>

<Directory /var/www/git>
    DAV On
    Options ExecCGI FollowSymLinks Indexes
    AuthType Basic
    AuthName "git repository"
    AuthUserFile /var/www/git/.htpasswd
</Directory>

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

ErrorLog /var/www/html/error.log
CustomLog /var/www/html/access.log combined

您的配置使用与 git-receive-pack 匹配的 Require expr。这是您推送到服务器时使用的服务。为了使服务器需要对克隆和提取进行身份验证,您还需要在 git-upload-pack 上进行匹配。

解决此问题的最简单方法可能是删除 Require expr 行,因为听起来您希望服务器始终应用身份验证,而不管您正在执行的任务如何。删除 Require expr 行会删除非推送操作的豁免。