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" 环境变量的配置旋钮,所以正确的方法是这样的:
创建一个脚本来包装您的实际 git-http-backend
。
好像你已经有了一个。
使用 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。
我正在尝试使用智能 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" 环境变量的配置旋钮,所以正确的方法是这样的:
创建一个脚本来包装您的实际
git-http-backend
。好像你已经有了一个。
使用 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。