我试着用git-http-backend设置一个git服务器,一切都像我想要的那样工作,但是有一件小事。
配置
<VirtualHost *:80>
ServerName git.server.com
SetEnv GIT_PROJECT_ROOT /srv/git
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
ScriptAlias /git /usr/lib/git-core/git-http-backend/
<Directory "/usr/lib/git-core*">
Options ExecCGI Indexes
Order allow,deny
Allow from all
</Directory>
<LocationMatch "^/git/repos/git-receive-pack$">
AuthType Digest
AuthName "Git Repositories"
AuthUserFile /srv/git/.git-auth-file
AuthGroupFile /srv/git/.git-group-file
Require valid-user
</LocationMatch>
</VirtualHost>
这允许每个人都可以读repos,但只有合法的用户可以写。让我不舒服的是url是http://git.server.com/git/repos。我想摆脱的git在URL如http://git.server.com/repos。当我将配置更改为
时<VirtualHost *:80>
ServerName git.server.com
SetEnv GIT_PROJECT_ROOT /srv/git
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
ScriptAlias / /usr/lib/git-core/git-http-backend/
<Directory "/usr/lib/git-core*">
Options ExecCGI Indexes
Order allow,deny
Allow from all
</Directory>
<LocationMatch "^/repos/git-receive-pack$">
AuthType Digest
AuthName "Git Repositories"
AuthUserFile /srv/git/.git-auth-file
AuthGroupFile /srv/git/.git-group-file
Require valid-user
</LocationMatch>
</VirtualHost>
认证失败。我仍然可以读取repos,但git push失败。我不明白为什么会这样。
* About to connect() to git.server.com port 80 (#0)
* Trying MYIP... * Connected to git.server.com (MYIP) port 80 (#0)
> GET /iocaste/info/refs?service=git-receive-pack HTTP/1.1
User-Agent: git/1.7.6
Host: git.server.com
Accept: */*
Pragma: no-cache
< HTTP/1.1 200 OK
< Date: Sun, 28 Aug 2011 18:17:27 GMT
< Server: Apache/2.2.19 (Unix) mod_ssl/2.2.19 OpenSSL/1.0.0d DAV/2 PHP/5.3.8 with Suhosin-Patch SVN/1.6.17
< Expires: Fri, 01 Jan 1980 00:00:00 GMT
< Pragma: no-cache
< Cache-Control: no-cache, max-age=0, must-revalidate
< Transfer-Encoding: chunked
< Content-Type: application/x-git-receive-pack-advertisement
<
* Connection #0 to host git.server.com left intact
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 257 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
* About to connect() to git.server.com port 80 (#0)
* Trying MYIP... * connected
* Connected to git.server.com (MYIP) port 80 (#0)
> POST /iocaste/git-receive-pack HTTP/1.1
User-Agent: git/1.7.6
Host: git.server.com
Accept-Encoding: deflate, gzip
Content-Type: application/x-git-receive-pack-request
Accept: application/x-git-receive-pack-result
Content-Length: 393
* The requested URL returned error: 404
* Closing connection #0
error: RPC failed; result=22, HTTP code = 404
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly
谁能帮我理解为什么后者失败?我认为一定是在身份验证期间启动了ScriptAlias。
编辑1 apache的日志记录并没有给我提供太多信息。只是由于某种原因身份验证失败了。
access_log显示:
MYIP - - [29/Aug/2011:19:03:18 +0200] "GET /repos/info/refs?service=git-receive-pack HTTP/1.1" 200 153
MYIP - - [29/Aug/2011:19:03:18 +0200] "POST /repos/git-receive-pack HTTP/1.1" 404 -
, error_log显示:
[Mon Aug 29 19:03:18 2011] [error] [client MYIP] Request not supported: '/srv/git/error/HTTP_UNAUTHORIZED.html.var'
尝试更改
ScriptAlias / /usr/lib/git-core/git-http-backend/
到一个更智能的匹配,只将git请求定向到git-http-backend:
ScriptAliasMatch
"(?x)^/(.*/(HEAD |
info/refs |
objects/(info/[^/]+ |
[0-9a-f]{2}/[0-9a-f]{38} |
pack/pack-[0-9a-f]{40}.(pack|idx)) |
git-(upload|receive)-pack))$"
/usr/lib/git-core/git-http-backend/
我没有一个100%确定的答案,但是看看我关于GIT的问题,在Windows上使用GIT -http-backend.exe设置GIT服务器。
我的locationMatch略有不同,但不是很大:
<LocationMatch "^/repositories/.*/git-upload-pack$">
Options +ExecCGI
AuthType Basic
AuthName intranet
AuthUserFile "C:/GIT/Apache/config/users"
AuthGroupFile "C:/GIT/Apache/config/groups"
Require group committers
</LocationMatch>
我将使用的url是myserver.com/repositories/mytest.git