Window下使用msysgit和apache配置Git服务
2011-10-24 18:27
645 查看
网上的东西太乱太杂,只好静下来了,从最基本的地方,一点一点来。尽量确保自己写的每一行东西确实努力去弄懂了
在Windows下需要的就是msysgit了,机器上现在安装的是
http://code.google.com/p/msysgit/
Git-1.7.7-preview20111014.3xe
我们关心的主要是
注意:
该程序需要 libiconv-2.dll 这个动态库,如果系统PATH路径中没有该文件,可以从Git安装目录下的bin目录中拷贝一个进来。
对我来说,当前系统PATH内有D:/MinGW/bin,该目录内有这个动态库。故不需要拷贝了
系统中当前apache版本信息:
Apache/2.2.15(Win32) D***/2 SVN/1.6.6 mod_wsgi/3.3 Python/2.7
这个没什么可说的。直接在官网下载安装即可。
选择一个目录 D:\ImportantData\git
然后期待通过
要想能匿名push,我们需要开启recieve-pack服务,可通过修改仓库的config文件可以实现:
当然,同样的方式,我们也可以关闭upload-pack服务。
这样一来,pull 和 push 都没问题了。第一阶段结束
匿名pull和push应该不是我们需要的,一般来说,应该是允许:
匿名用户可以pull
验证用户才可以push
和前面一样,基本设置不变
但我们对请求receive-pack的url路径进行限制
路径之所以这样,是因为我们git push时,http请求的格式大致是:
我们使用Basic的方式认证
密码文件放置在了D:/ImportantData/Repositories/htpasswd,和原来的SVN服务使用的相同。
密码文件可以使用 htpasswd 创建和修改
这样一来,只有通过验证的用户才可以push了(clone仓库时可以直接指定用户名):
安装
在Windows下需要的就是msysgit了,机器上现在安装的是http://code.google.com/p/msysgit/
Git-1.7.7-preview20111014.3xe
我们关心的主要是
D:\Program Files\Git\libexec\git-core\git-http-backend.exe
注意:
该程序需要 libiconv-2.dll 这个动态库,如果系统PATH路径中没有该文件,可以从Git安装目录下的bin目录中拷贝一个进来。
对我来说,当前系统PATH内有D:/MinGW/bin,该目录内有这个动态库。故不需要拷贝了
系统中当前apache版本信息:
Apache/2.2.15(Win32) D***/2 SVN/1.6.6 mod_wsgi/3.3 Python/2.7
这个没什么可说的。直接在官网下载安装即可。
创建仓库
选择一个目录 D:\ImportantData\gitgit init --bare Test.git
然后期待通过
git http://127.0.0.1/git/Test.git[/code]
来访问这个软件仓库网上搜到的东西太多了,还是从最根本的看起:
httpd.conf 第一次配置
设置仓库的根目录
映射路径到我们的CGI程序:git-http-backend.exe
还有一个次要的 GIT_HTTP_EXPORT_ALL,如果不设置它的话,我们必须在每一个仓库中放置一个名为git-daemon-export-ok的文件才行SetEnv GIT_PROJECT_ROOT D:/ImportantData/git SetEnv GIT_HTTP_EXPORT_ALL ScriptAlias /git/ "D:/Progra~1/Git/libexec/git-core/git-http-backend.exe/"
然后,设置路径的访问权限
我们的CGI程序的路径
我们仓库所在的路径<Directory "D:/Program Files/Git/libexec/git-core/"> Allow From All </Directory> <Directory "D:/ImportantData/git"> Allow From All </Directory>现在我们可以通过http来clone仓库了:
效果git clone http://127.0.0.1/git/Test.git[/code]
fetch和pull也都没问题,但是我们不能pushhttp-backend提供了两个服务:
upload 与 receive
服务 | 允许你 | 默认 |
upload-pack | git fetch git pull git clone | 开启 |
receive-pack | git push | 关闭 |
[http] receivepack = true
当然,同样的方式,我们也可以关闭upload-pack服务。
这样一来,pull 和 push 都没问题了。第一阶段结束
httpd.conf 第二次配置
匿名pull和push应该不是我们需要的,一般来说,应该是允许:匿名用户可以pull
验证用户才可以push
和前面一样,基本设置不变
SetEnv GIT_PROJECT_ROOT D:/ImportantData/git SetEnv GIT_HTTP_EXPORT_ALL ScriptAlias /git/ "D:/Progra~1/Git/libexec/git-core/git-http-backend.exe/"
<Directory "D:/Program Files/Git/libexec/git-core/"> Allow From All </Directory> <Directory "D:/ImportantData/git"> Allow From All </Directory>
但我们对请求receive-pack的url路径进行限制
<LocationMatch "^/git/.*/git-receive-pack$"> AuthType Basic AuthName "Git repository" AuthUserFile D:/ImportantData/Repositories/htpasswd Require valid-user Allow From All </LocationMatch>
路径之所以这样,是因为我们git push时,http请求的格式大致是:
"POST /git/Test.git/git-upload-pack HTTP/1.1"
我们使用Basic的方式认证
密码文件放置在了D:/ImportantData/Repositories/htpasswd,和原来的SVN服务使用的相同。
密码文件可以使用 htpasswd 创建和修改
这样一来,只有通过验证的用户才可以push了(clone仓库时可以直接指定用户名):
git clone http://dbzhang800@127.0.0.1/git/Test.git[/code]接前面的第二配置,如果也要禁用匿名用户的clone等操作怎么办? 和push类似,只需要通过Location控制下面的HTTP请求路径即可:
httpd.conf 第三次配置"POST /git/Test.git/git-upload-pack HTTP/1.1"
但是,这个还阻止不了pull、fetch操作,因为它们HTTP头部是"GET /git/Test.git/info/refs?service=git-upload-pack HTTP/1.1"
所以也要一块处理。
但是,实际上,我们可能只有部分私密仓库才需要这么设置。这时,我们可以直接控制某个仓库的路径就行了
比如,要控制我们以/git/Test开头的仓库路径:<Location /git/Test> AuthType Basic AuthName "Git repository" AuthUserFile D:/ImportantData/Repositories/htpasswd Require valid-user </Location>前面我们一直使用的
httpd.conf 第四次配置ScriptAlias /git/ "D:/Progra~1/Git/libexec/git-core/git-http-backend.exe/"
还可以用下面的东西来替换(而保持功能不变):ScriptAliasMatch \ "(?x)^/git/(.*/(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))$" \ "D:/Program Files/Git/libexec/git-core/git-http-backend.exe/$1"
这后这么复杂有什么好处么?
好处就是,这使得 git-http-backend.exe 这个东西只处理这些匹配的路径。而不会处理其他的,比如像http://127.0.0.1/git/goodbyeGit
这样的路径。这样的路径可以进一步交由其他CGI程序处理。比如gitweb.cgi配置gitweb
httpd.conf 第五次配置
在前面的基础上
添加上gitweb.cgi这个脚本
并设置其所在目录的权限ScriptAliasMatch \ "(?x)^/git/(.*/(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))$" \ "D:/Program Files/Git/libexec/git-core/git-http-backend.exe/$1"
ScriptAlias /git/ "D:/Progra~1/Git/share/gitweb/gitweb.cgi/"
<Directory "D:/Program Files/Git/share/gitweb/">
Options +ExecCGI
Allow From All
</Directory>
由于在Windows下,还需要将该cgi脚本第一行改成我们Perl程序所在路径,比如:
这样就差不多了,而至于gitweb如何配置,额,我还不清楚。只是注意到可以直接修改这个 gitweb.cgi 文件中的:our $GIT = "git"; our $projectroot = "D:/ImportantData/git"; ...http://man.he.net/man1/git-http-backend
参考
相关文章推荐
- Window下使用msysgit和apache配置Git服务
- linux下使用apache+svn+ssl配置安全版本控制服务
- msysgit + TortoiseGit:在 windows 上安装配置版本控制工具 Git 图形化使用
- Centos 6.5上Apache + PAM + SVN服务安装配置(使用本地系统用户认证)
- windows(XP)下配置使用Git完整过程(msysgit、TortoiseGit)
- 在MAC下使用gitosis来配置git服务
- 使用网盘配置私有Git服务
- linux Apache服务中配置KeepAlive的合理使用
- 关于window下使用git管理php源码的环境配置问题
- windows(XP)下配置使用Git完整过程(msysgit、TortoiseGit)
- 使用百度网盘配置私有Git服务
- idea 使用git管理项目, window配置和第一次上传项目到码云
- git win下使用与msysGit安装配置
- window上git的配置和使用
- Git服务搭建使用Linux作为服务端,window作为客户端
- 在Mac下使用Gitolite来配置git服务
- 【Git】msysgit + TortoiseGit:在 windows 上安装配置版本控制工具 Git 图形化使用
- 在MAC下使用gitosis来配置git服务
- apache中伪静态配置和使用(Apache虚拟主机下Discuz伪静态)
- 使用mod_cluster进行apache httpd server和jboss eap 6.1集群配置