git-http-后端

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7222992/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-19 05:54:44  来源:igfitidea点击:

git-http-backend

gitapachegit-http-backend

提问by Michael Pfeuti

I tried to set up a git server with git-http-backend and everything works pretty much as I want but there is one little thing.

我试图用 git-http-backend 设置一个 git 服务器,一切都按我的意愿工作,但有一件小事。

The config

配置

<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>

This allows everybody to read the repos but only valid users to write. The thing that bugs me is that the url is http://git.server.com/git/repos. I would like to get rid of the gitin the URL like http://git.server.com/repos. When I change the config to

这允许每个人读取 repos,但只有有效用户才能写入。困扰我的是 url 是http://git.server.com/git/repos。我想摆脱URL中的git,如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>

The authentication fails. I can still read the repos but git pushfails. I couldn't figure out why this happens.

认证失败。我仍然可以阅读 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

Can someone help me understand why the latter fails? I assume it must be that the ScriptAlias kicks in during the authentication.

有人可以帮助我理解为什么后者会失败吗?我认为必须是 ScriptAlias 在身份验证期间启动。

EDIT 1The logging of apache didn't give me much information. Just that the authentication fail for some reason.

编辑 1apache 的日志记录没有给我太多信息。只是由于某种原因身份验证失败。

The access_log says:

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 - 

and the error_log says:

和 error_log 说:

[Mon Aug 29 19:03:18 2011] [error] [client MYIP] Request not supported:   '/srv/git/error/HTTP_UNAUTHORIZED.html.var'

回答by Jon

I don't have a 100% sure fire answer, but check out my question about GIT here, Setting up Git Server on Windows With git-http-backend.exe.

我没有 100% 确定的答案,但请在此处查看我关于 GIT 的问题,使用 git-http-backend.exe 在 Windows 上设置 Git 服务器

My locationMatch is slightly different, but not by much:

我的 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>

The url I would use would be myserver.com/repositories/mytest.git

我会使用的网址是 myserver.com/repositories/mytest.git

Hope this helps.

希望这可以帮助。

回答by Thach Mai

Try changing

尝试改变

ScriptAlias / /usr/lib/git-core/git-http-backend/

to a more intelligent match that only directs git requests to 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/