Git 使用智能 HTTP 和 suexec:未找到存储库

Git with smart HTTP and suexec: repository not found

我正在尝试使用智能 HTTP 在我的一台服务器上安装我自己的 Git 存储库。

它可以在没有 suexec 的虚拟服务器上运行,但不能在我启用了 suexec 的生产服务器上运行。当我尝试克隆或推送时,它说:

fatal: repository 'http://domain.tld/git/project/' not found

Apache 配置如下:

<VirtualHost *:80>
    Options -Indexes +ExecCGI

    ServerAdmin user@domain.tld

    DocumentRoot /var/www/domain.tld

    ServerName domain.tld

    Alias /fcgi-bin/ /var/www/domain.tld/fcgi-bin/
    SuexecUserGroup domainuser domainuser

    ########## GIT ##########

    SetEnv GIT_PROJECT_ROOT /var/www/git/git_domain
    SetEnv GIT_HTTP_EXPORT_ALL
    SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
    ScriptAlias /git/ /var/www/git/git_domain/git-http-backend/

    Alias /git /var/www/git/git_domain
    <Directory /usr/lib/git-core>
        Options +ExecCGI +SymLinksIfOwnerMatch
        AllowOverride All
        Require all granted
    </Directory>

    <Directory /var/www/git/git_domain>
        Options -Indexes -SymLinksIfOwnerMatch
        AllowOverride All
        Require all granted
    </Directory>

    ########## PROJECT DIRS HTPASS ##########

        <LocationMatch "^/git/project1/.*$">
#            DAV on
            AuthType Basic
            AuthName "project1"
            AuthUserFile /var/www/git/gitpass/domain/project1
            Require valid-user
        </LocationMatch>

    ########## /PROJECT DIRS HTPASS ##########
    ########## /GIT ##########

如果我禁用

ScriptAlias /git/ /var/www/git/git_domain/git-http-backend/

我可以克隆,但可以推送,因为在那种情况下它适用于 DAV。

我想我已将所有文件的所有者和权限更改为正确的值(domainuser,755)并且 suexec 不会在其日志中抱怨任何内容。

谁能告诉我哪里做错了?

提前谢谢你。

这很简单:mod_suexec 擦除 运行 目标程序之前的所有环境变量,因此所有 SetEnv 指令都无效。

不幸的是,我上次检查(面临同样的问题)mod_suexec 没有 "whitelist" 环境变量的配置旋钮,所以正确的方法是这样的:

  1. 创建一个脚本来包装您的实际 git-http-backend

    好像你已经有了一个。

  2. 使用 shell 的 export 内置函数重新制定所有相关的 SetEnv 指令。

    SetEnv GIT_PROJECT_ROOT /var/www/git/git_domain
    

    变成了

    export GIT_PROJECT_ROOT=/var/www/git/git_domain
    

    在脚本代码中。

如果您需要相同的虚拟主机配置文件在 "normal" 模式和 mod_suexec 模式下工作,请在 SetEnv 指令块旁边对这个怪癖进行大量评论,建议下一个人让它们与包装器脚本中放置的任何内容保持同步。

有关 mod_suexec 行为的更多详细信息,请参见 here