git 整合apache

 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值