2010-09-28 155 views
20

我正在使用Apache和git-http-backend.exe在WS 2008计算机上设置Git服务器(1.7.2.3)。我一直在关注着一个好主意here。我有GUI的工作,我可以annoymously克隆,如果我把回购的配置,下面我可以annoymously推:在Windows上设置Git服务器使用git-http-backend.exe

[http] 
receivepack = true 

我已经添加了以下到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> 

当我添加“LocationMatch”我仍然可以克隆annoymously或通过在URL,克隆的git http://[email protected]

它会提示输入密码,并克隆指定名称。

但是当我尝试推回至回购我得到如下:

错误:无法访问URL http://[email protected]/newtestrepo.git/,返回码22 致命:混帐HTTP推送失败

我一直在寻找在http-backend.exe man page例如,但不能让他们的工作。

这里是我组文件,(这只是测试的例子所以没有什么会在督促使用):

admin: jon steve admin 
webview: jon steve web 
repogeneral: jon steve 
testrepo: jon admin 
testrepo2: jon steve web 

这里是用户文件:

jon:$apr1$kEKVExYx$guIF9oYV8buGhFLZr16XN0 
steve:$apr1$jvgjF9nv$PvWsHH.cSOBN5ymk6NT1B0 
admin:$apr1$vzXgDskN$oszCei3tkHNUgtLj2HkHF/ 
web:$apr1$wS0do7hb$VA9tsc9c9LwY5PcjfhdwK0 

我知道用户名jon的作用就像我把目录要求放在gui部分我可以用用户名jon登录没有问题,(指向与locationmatch相同的用户和组文件)。

我不确定什么配置我错过了在这一点上(假设它的配置问题)。

任何关于克服这最后一道障碍的建议都会很棒。

编辑

我一直在玩一些,这里是我的资料:

如果我克隆一个回购协议:

git clone http://[email protected]/remotetest.git 

我可以得到库出来,但是当我尝试推回:

git push origin master

我被问了我的密码,我进入它,然后再要求它,然后我得到了以下错误:

C:\ TEMP \ remotetest \ remotetest>混帐推起源主 密码: 密码: 错误:无法访问URL http://[email protected]/remotetest.git/,返回码22 致命︰git-http-push失败

在我的Apache访问。登录我得到如下:

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 

有趣的是,当我在不要紧,我把什么密码在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 

EDIT 2

我试图做重新创建密码文件:

htpasswd -c -m C:/git/apacheconfig/users jon 

但这并没有帮助。

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

EDIT 4

行,所以我可以得到以愉快的方式克隆和推入恶意模式,但认证失败的推动。

C:\temp\test2\temp\test>git push origin master 
Password: 
Password: 
error: Cannot access URL http://[email protected]:8000/repositories/test.git/, return code 22 
fatal: git-http-push failed 

我改变了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> 

有趣的是,当我创建了一个新的回购协议(git的初始化--bare newrepo.git)它没有建立一个信息/参考文件。我不得不做“git update-server-info”命令来创建它。

Apache的访问日志有一些有趣的事情,可能是一个线索:

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 

这是当我试图“推”回回购,但他们是GET命令和POST没有。不知道PROPFIND是什么,还没有发现很多信息。我想,(阅读周围),可能会发生某种重写,即将POST更改为GET并将其杀死,或者其他。尽管如此,我在这方面还没有深入。

谢谢

+0

我不知道为什么“'htdocs'”进入在Directory'definition的'长期图片。 – VonC 2010-10-04 10:26:22

+0

这是Apache从中提供文件的默认位置。我使用PHP gui来显示存储库,它使用相同的authuserfile,并提供弹出式登录并使用相同的用户名和密码。使用它作为测试,以确保Apache可以理解用户密码文件。 – Jon 2010-10-04 12:23:48

+0

这个问题应该在http://serverfault.com/上,因为它不涉及编程和更多的设置和配置,不是? – 2010-10-09 06:14:52

回答

23

好的,所以地狱已经结冰了,我终于得到了这个工作!

我相信有两件事情在我的设置中根本不对。

1)用户没有得到认证穿过,我发现这有助于:

SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER 

其次我不能让身体“目录”工作。

<Directory "C:/GIT/Apache/repositories"> 
Options +ExecCGI 
AuthType Basic 
AuthName intranet 
AuthUserFile "C:/GIT/Apache/config/users" 
Require valid-user 
</Directory> 

为了解决这个问题,我使用了locationMatch进行pull和push。这意味着您必须通过身份验证才能进行推送。如果你想惹恼你,你可以删除“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> 
+0

优秀的反馈。谢谢。 +1 – VonC 2010-10-21 04:05:14

+0

嗨,乔恩,你的工作很好。你能帮我理解你如何管理用户配置,因为它似乎对你来说不是问题 – pollux1er 2014-06-26 09:20:19

+0

@ pollux1er我最终转移到了github。我只是把它用于我自己,所以没有太多的用户担心。现在不记得太多了,抱歉和GL。 – Jon 2014-06-26 10:50:51

相关问题