设为首页 收藏本站
查看: 920|回复: 0

[经验分享] Window下使用msysgit和apache配置Git服务

[复制链接]

尚未签到

发表于 2017-1-11 10:32:48 | 显示全部楼层 |阅读模式

  • 网上的东西太乱太杂,只好静下来了,从最基本的地方,一点一点来。尽量确保自己写的每一行东西确实努力去弄懂了


安装



在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)DAV/2SVN/1.6.6mod_wsgi/3.3Python/2.7

这个没什么可说的。直接在官网下载安装即可。


创建仓库



选择一个目录D:\ImportantData\git

git init --bare Test.git

然后期待通过

git http://127.0.0.1/git/Test.git

来访问这个软件仓库


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

fetch和pull也都没问题,但是我们不能push


upload 与 receive



http-backend提供了两个服务:



服务



允许你



默认




upload-pack



git fetch

git pull

git clone



开启




receive-pack



git push



关闭





要想能匿名push,我们需要开启recieve-pack服务,可通过修改仓库的config文件可以实现:

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




  • 路径之所以这样,是因为我们gitpush时,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


httpd.conf 第三次配置



接前面的第二配置,如果也要禁用匿名用户的clone等操作怎么办?和push类似,只需要通过Location控制下面的HTTP请求路径即可:

"POST /git/Test.git/git-upload-pack HTTP/1.1"

但是,这个还阻止不了pullfetch操作,因为它们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


httpd.conf 第五次配置



配置gitweb
在前面的基础上


  • 添加上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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-326937-1-1.html 上篇帖子: Windows下Git Status的乱码问题解决方案 下篇帖子: CentOS下用yum安装git
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表