Jon*_*Jon 22 git apache2 git-http-backend
我正在使用Apache和git-http-backend.exe在WS 2008机器上设置Git服务器(1.7.2.3).我一直在关注一个良好的啧啧这里.我有GUI工作,我可以惹恼克隆,如果我把以下内容放在回购配置中我可以惹恼:
[http]
receivepack = true
Run Code Online (Sandbox Code Playgroud)
我已将以下内容添加到httpd.conf文件中:
SetEnv GIT_PROJECT_ROOT C:/GIT/Repositories
SetEnv GIT_HTTP_EXPORT_ALL
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))$" \
"C:/Program Files (x86)/git/libexec/git-core/git-http-backend.exe/$1"
<Directory />
Allow from all
</Directory>
<LocationMatch "^/git/.*/git-receive-pack$">
AuthType Basic
AuthName "Git Access"
AuthUserFile C:/GIT/ApacheConfig/users
AuthGroupFile C:/GIT/ApacheConfig/groups
Require group repogeneral
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)
当我添加"LocationMatch"时,我仍然可以克隆,或者通过在URL中指定一个名称,git clone http://jon@myserver.com
它会提示输入密码并进行克隆.
但当我试图回到回购时,我得到以下内容:
错误:无法访问URL http://jon@myserver.com/newtestrepo.git/,返回代码22致命:git-http-push failed
我一直在查看http-backend.exe手册页中的示例,但无法让它们工作.
这是我的群组文件,(这只是测试示例,所以没有任何可用于prod):
admin: jon steve admin
webview: jon steve web
repogeneral: jon steve
testrepo: jon admin
testrepo2: jon steve web
Run Code Online (Sandbox Code Playgroud)
这是用户文件:
jon:$apr1$kEKVExYx$guIF9oYV8buGhFLZr16XN0
steve:$apr1$jvgjF9nv$PvWsHH.cSOBN5ymk6NT1B0
admin:$apr1$vzXgDskN$oszCei3tkHNUgtLj2HkHF/
web:$apr1$wS0do7hb$VA9tsc9c9LwY5PcjfhdwK0
Run Code Online (Sandbox Code Playgroud)
我知道用户名jon的工作原理,好像我把目录要求放在gui部分我可以使用用户名登录jon没问题,(指向与locationmatch相同的用户和组文件).
我不确定此时我错过了什么配置,(假设配置问题).
关于克服这最后一道障碍的任何建议都会很棒.
编辑
我一直在玩更多,这里是我的信息:
如果我克隆一个回购用:
git clone http://jon@myserver.com/remotetest.git
Run Code Online (Sandbox Code Playgroud)
我可以把存储库拿出来,但当我尝试推回时:
git push origin master
我被问到我的密码,我输入它,然后它又要求它,然后我收到以下错误:
C:\ temp\remotetest\remotetest> git push origin master密码:密码:错误:无法访问URL http://jon@myserver.com/remotetest.git/,返回代码22致命:git-http-push failed
在我的Apache access.log中,我得到以下内容:
192.168.1.2 - - [29/Sep/2010:21:58:19 +0100] "GET /remotetest.git/info/refs?service=git-upload-pack HTTP/1.1" 200 38
192.168.1.2 - - [29/Sep/2010:21:58:51 +0100] "GET /remotetest.git/info/refs?service=git-receive-pack HTTP/1.1" 403 -
192.168.1.2 - - [29/Sep/2010:21:58:51 +0100] "GET /remotetest.git/info/refs HTTP/1.1" 200 -
192.168.1.2 - - [29/Sep/2010:21:58:51 +0100] "GET /remotetest.git/HEAD HTTP/1.1" 200 23
Run Code Online (Sandbox Code Playgroud)
有趣的是,当我使用URL中的用户名进行克隆时,我输入的密码无关紧要,它仍然有用.我假设这是因为我应该能够匿名拉.不知道为什么它在那时要求输入密码.
我也在日志中看到这个错误:
[Wed Sep 29 22:33:00 2010] [error] [client 192.168.1.2] client denied by server configuration: C:/Program Files (x86)/Git/libexec/git-core/git-http-backend.exe
[Wed Sep 29 22:33:00 2010] [error] [client 192.168.1.2] client denied by server configuration: C:/Program Files (x86)/Git/libexec/git-core/git-http-backend.exe
Run Code Online (Sandbox Code Playgroud)
编辑2
我尝试通过以下方式重新创建密码文件:
htpasswd -c -m C:/git/apacheconfig/users jon
Run Code Online (Sandbox Code Playgroud)
但这没有帮助.
编辑3
httpd.conf中的PHP配置,它使用相同的用户文件进行基本身份验证:
<Directory "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs">
AuthName "GitUsers"
AuthType Basic
AuthUserFile C:/GIT/ApacheConfig/users
AuthGroupFile C:/GIT/ApacheConfig/groups
require group webview
</Directory>
Run Code Online (Sandbox Code Playgroud)
编辑4
好的,所以我可以快乐地克隆并推进烦人的模式,但是推送认证失败了.
C:\temp\test2\temp\test>git push origin master
Password:
Password:
error: Cannot access URL http://jon@192.168.10.97:8000/repositories/test.git/, return code 22
fatal: git-http-push failed
Run Code Online (Sandbox Code Playgroud)
我更改了httpd.conf以使用以下内容:
<VirtualHost *:80>
SetEnv GIT_PROJECT_ROOT "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/repositories"
SetEnv GIT_HTTP_EXPORT_ALL
<Directory "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/repositories">
Options Indexes FollowSymLinks MultiViews Includes ExecCGI
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<LocationMatch "^/repositories/.*/git-receive-pack$">
AuthType Basic
AuthName "Git Access"
AuthUserFile "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/repositories/.htpasswd"
Require valid-user
</LocationMatch>
ScriptAliasMatch \
"(?x)^/repositories/(.*/(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))$" \
"C:/Program Files (x86)/Git/libexec/git-core/git-http-backend/$1"
ErrorLog C:/GIT/error_log
CustomLog C:/GIT/access_log combined
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
有趣的是,当我创建一个新的repo(git init --bare newrepo.git)时,它没有创建一个info/refs文件.我不得不做"git update-server-info"命令来创建它.
Apache Access日志有一些有趣的东西可能是一个线索:
192.168.10.97 - - [05/Oct/2010:22:48:26 +0100] "GET /repositories/test.git/info/refs?service=git-receive-pack HTTP/1.1" 200 -
192.168.10.97 - - [05/Oct/2010:22:48:26 +0100] "GET /repositories/test.git/HEAD HTTP/1.1" 200 23
192.168.10.97 - - [05/Oct/2010:22:48:28 +0100] "PROPFIND /repositories/test.git/ HTTP/1.1" 405 248
Run Code Online (Sandbox Code Playgroud)
那是我试图"推"回回购的时候,但他们是GET命令而没有POST.不知道PROPFIND是什么,还没有找到太多信息.我认为,(阅读),可能会进行某种重写,即将POST更改为GET并将其删除或其他内容.不过,我现在已经超出了我的深度.
谢谢
Jon*_*Jon 25
好吧,所以地狱已经冻结了,我终于得到了这个工作!
我相信我的设置有两件事根本不对.
1)用户没有通过认证,我发现这有帮助:
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
Run Code Online (Sandbox Code Playgroud)
其次,我无法让物理"目录"起作用.
<Directory "C:/GIT/Apache/repositories">
Options +ExecCGI
AuthType Basic
AuthName intranet
AuthUserFile "C:/GIT/Apache/config/users"
Require valid-user
</Directory>
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,我使用了locationMatch来进行拉取和推送.这意味着您必须进行身份验证以进行拉取和推送.如果您想要烦恼,可以删除"git-upload-pack"部分.
希望这可以帮助别人.
这是我最后的httpd.conf文件:
DocumentRoot "C:/GIT/Apache/www"
<Directory />
Options +ExecCGI
Allow from all
</Directory>
<Directory "C:/GIT/Apache/www">
Allow from all
</Directory>
<Directory "C:/GIT/Apache/www/secure">
AuthType Basic
AuthName intranet
AuthUserFile "C:/GIT/Apache/config/users"
require valid-user
</Directory>
SetEnv GIT_PROJECT_ROOT C:/GIT/Apache/repositories
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
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))$" \
"C:/Program Files/git/libexec/git-core/git-http-backend.exe/$1"
<LocationMatch "^/.*/git-receive-pack$">
Options +ExecCGI
AuthType Basic
AuthName intranet
AuthUserFile "C:/GIT/Apache/config/users"
Require valid-user
</LocationMatch>
<LocationMatch "^/.*/git-upload-pack$">
Options +ExecCGI
AuthType Basic
AuthName intranet
AuthUserFile "C:/GIT/Apache/config/users"
Require valid-user
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)