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

[经验分享] git 整合apache

[复制链接]

尚未签到

发表于 2016-12-30 07:19:53 | 显示全部楼层 |阅读模式
SSH协议私服

适合公司内部小型团队使用的是SSH协议

因为这个协议简单、快速、安全,唯一麻烦的就是需要设置主机信任关系(将公钥提交到私服上,以使得私服与自己建立信任关系),这类文章网上很多,这里就不讲述了,可以参考以下链接:

http://bbs.scmlife.com/thread-22143-1-1.html
http://blog.prosight.me/index.php/2009/11/485

同时除了标准的SSH协议外,还可以实现一些基于SSH协议封装的东东,比如SSH+GitShell和Gitosis,都可以简化一些配置管理的工作

 

只读的HTTP协议私服

本文主要讲述的还是HTTP协议私服的搭建,这里我们先不考虑如何提交代码,仅考虑检出(只读)的情况

首先,需要一个apache服务器,这个安装就不说了,假设安装完成的apache服务器在~/local/httpd22位置

然后执行以下语句

$ cd ~/local/httpd22/htdocs
$ mkdir myproject.git
$ cd myproject.git
$ git init --bare
这里需要注意--bare参数,表示是要生成一个"干净"的仓库,仅包含历史代码不包含工作代码。如果是希望初始化一个已存在的代码库,也可以类似如下命令替换最后一行git命令:

$ git clone --bare /path/to/my_project myproject.git
注意这里也使用了--bare参数,表示仅克隆出历史代码

这样完成了一个仓库的初始化,但要客户端可以使用还缺少了一步——配置钩子(hook),执行下面命令:

$ cd ~/local/httpd22/htdocs/myproject.git
$ mv hooks/post-update.sample hooks/post-update
$ chmod a+x hooks/post-update
$ ./hooks/post-update  # 刚刚初始化完成必须手工执行一次
这样Git会在每次有update之后(post update)执行这个钩子(其实际是执行了命令:git update-server-info,可以通过vi hooks/post-update查看)

现在大功告成,客户端可以执行这样的代码来获取项目代码:

$ git clone http://bb-iit-dev05.bb01.baidu.com:8080/gitproject.git
 

可写的HTTP协议私服

可写的HTTP协议私服是基于WebDAV实现的,它比SSH的好处是可以不需要生成公私钥,通过用户名密码认证(HTTP Basic认证),对于普通用户来说更加简便且容易理解

我们将在上一节的基础上将服务器改造成可写的私服

 

1. 开启WebDAV

首先是要开启Apache服务器的WebDAV功能,以Apache Http 2.2为例。首先建立gitrepo目录用于存放git的仓库

$ cd ~/local/httpd22
$ mkdir gitrepo
然后在conf/httpd.conf中将如下行去掉注释:

Include conf/extra/httpd-dav.conf
编辑文件conf/extra/httpd-dav.conf,写入大致如下内容:

DavLockDB "/home/work/local/apache-httpd-2.2.11/var/DavLock"

Alias /git "/home/work/local/apache-httpd-2.2.11/gitrepo"

<Directory "/home/work/local/apache-httpd-2.2.11/gitrepo/">
    Dav On
    Options +Indexes +FollowSymLinks

    AllowOverride None
    Order Allow,Deny
    Allow from all

    AuthType Basic
    AuthName "Git"
    AuthUserFile "/home/work/local/apache-httpd-2.2.11/user.git"
    Require valid-user
</Directory>

其中第一行高亮为指定DAVLockDB的位置,需要确保路径/home/work/local/apache-httpd-2.2.11/var存在,否则会遇到无法获取锁的问题

AuthUserFile是用于存储用户密码的文件,这个文件需要我们生成:

$ htpasswd -bc user.git guolin mypass
如果已经存在这个文件则不需要-c参数

然后重启Apache服务器

$ cd bin
$ ./apachectl configtest
Syntax OK
$ ./apachectl restart
现在试试看使用任意浏览器访问URL:http://bb-iit-dev05.bb01.baidu.com:8080/git/,如果弹出提示输入用户名密码则表示配置成功,输入之前htpasswd设置的用户名密码后,登录成功

 

2. 建立测试用仓库

首先需要建立一个供我们测试用的仓库,这个仓库可以从其他地方clone过来,也可以自己init出来,但前提是必须带有--bare参数,例如:

$ cd ~/local/httpd22/gitrepo
$ mkdir testproject.git
$ cd testproject.git
$ git init --bare
$ mv hooks/post-update.sample hooks/post-update
$ ./hooks/post-update
 

3. 测试

首先自然是测试clone功能:

$ git clone http://guolin@bb-iit-dev05.bb01.baidu.com:8080/git/testproject.git
会提示需要输入密码,输入正确后,clone成功

接着测试push功能,这个才是配置WebDAV的重点,接上面:

$ cd testproject
$ echo this is a testing > a
$ git add a
$ git commit -am "just test"
$ git push origin master
输入密码后如果提交成功则表示测试OK。如果提示下面的错误:

fatal: git-push is not available for http/https repository when not compiled with USE_CURL_MULTI
fatal: git-http-push failed
则表示git需要带上USE_CURL_MULTI的flag重新编译才能支持git-http-push功能

 

4. 权限配置

到此为止我们还只是构建了一个需要认证的,且可以用于push的Git私服,还没有涉及到授权这块。那么下面我们将通过WebDAV为私服增加授权配置

由于权限是基于WebDAV配置的,因此我们主要是修改Apache的httpd-dav.conf文件:

<Directory "/home/work/local/apache-httpd-2.2.11/gitrepo/">
    Dav On
    Options +Indexes +FollowSymLinks

    # 拒绝所有请求
    Deny from all

    AuthType Basic
    AuthName "Git"
    AuthUserFile "/home/work/local/apache-httpd-2.2.11/user.git"
    AuthGroupFile "/home/work/local/apache-httpd-2.2.11/group.git"
</Directory>

<Directory "/home/work/local/apache-httpd-2.2.11/gitrepo/testproject.git/">
    Allow from all
    Order Allow,Deny
    # 可读组
    <Limit GET>
       Require group testproject-read
    </Limit>
    # 可写组
    <Limit GET PUT POST DELETE PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>
       Require group testproject-write
    </Limit>
</Directory>
以上高亮的地方是需要注意的,首先我们添加了AuthGroupFile用于根据组来授权的功能;然后为我们的testproject项目进行了独立配置,使用Limit限制了testproject-read组和testproject-write组的不同权限

接下来我们编辑group.git文件,将用户加入到组中(假设user.git中现在有guolin,wujinliang,liuou三个用户):

testproject-read: guolin
testproject-write: wujinliang liuou
这样配置表示guolin有读取testproject的权限,却没有写入权限,而wujinliang和liuou却拥有读写权限。至此权限配置完成

可以使用guolin用户测试下效果:

$ git push origin master
Password:
error: The requested URL returned error: 401 while accessing http://guolin@bb-iit-dev05.bb01.baidu.com:8080/git/testproject.git/info/refs
fatal: HTTP request failed
这样一个带有权限配置的Git HTTP私服就大功告成了

 

关于客户端

按照以上配置,每次Git客户端进行读写操作都需要重新输入密码,如果觉得太麻烦,那么可以编辑~/.netrc文件(因为git是基于curl来进行http传输的)

machine bb-iit-dev05.bb01.baidu.com
login guolin
password mypass


 

运维网声明 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-321232-1-1.html 上篇帖子: vagrant + nginx + github + webhook + dploy + rsync + testdb + onlinedb + yii2 + 下篇帖子: Apache 搭建git 服务器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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