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位置
然后执行以下语句
$ mkdir myproject.git
$ cd myproject.git
$ git init --bare
这里需要注意--bare参数,表示是要生成一个"干净"的仓库,仅包含历史代码不包含工作代码。如果是希望初始化一个已存在的代码库,也可以类似如下命令替换最后一行git命令:
注意这里也使用了--bare参数,表示仅克隆出历史代码
这样完成了一个仓库的初始化,但要客户端可以使用还缺少了一步——配置钩子(hook),执行下面命令:
$ 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查看)
现在大功告成,客户端可以执行这样的代码来获取项目代码:
可写的HTTP协议私服
可写的HTTP协议私服是基于WebDAV实现的,它比SSH的好处是可以不需要生成公私钥,通过用户名密码认证(HTTP Basic认证),对于普通用户来说更加简便且容易理解
我们将在上一节的基础上将服务器改造成可写的私服
1. 开启WebDAV
首先是要开启Apache服务器的WebDAV功能,以Apache Http 2.2为例。首先建立gitrepo目录用于存放git的仓库
$ mkdir gitrepo
然后在conf/httpd.conf中将如下行去掉注释:
编辑文件conf/extra/httpd-dav.conf,写入大致如下内容:
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是用于存储用户密码的文件,这个文件需要我们生成:
如果已经存在这个文件则不需要-c参数
然后重启Apache服务器
$ ./apachectl configtest
Syntax OK
$ ./apachectl restart
现在试试看使用任意浏览器访问URL:http://bb-iit-dev05.bb01.baidu.com:8080/git/,如果弹出提示输入用户名密码则表示配置成功,输入之前htpasswd设置的用户名密码后,登录成功
2. 建立测试用仓库
首先需要建立一个供我们测试用的仓库,这个仓库可以从其他地方clone过来,也可以自己init出来,但前提是必须带有--bare参数,例如:
$ mkdir testproject.git
$ cd testproject.git
$ git init --bare
$ mv hooks/post-update.sample hooks/post-update
$ ./hooks/post-update
3. 测试
首先自然是测试clone功能:
会提示需要输入密码,输入正确后,clone成功
接着测试push功能,这个才是配置WebDAV的重点,接上面:
$ echo this is a testing > a
$ git add a
$ git commit -am "just test"
$ git push origin master
输入密码后如果提交成功则表示测试OK。如果提示下面的错误:
fatal: git-http-push failed
则表示git需要带上USE_CURL_MULTI的flag重新编译才能支持git-http-push功能
4. 权限配置
到此为止我们还只是构建了一个需要认证的,且可以用于push的Git私服,还没有涉及到授权这块。那么下面我们将通过WebDAV为私服增加授权配置
由于权限是基于WebDAV配置的,因此我们主要是修改Apache的httpd-dav.conf文件:
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-write: wujinliang liuou
这样配置表示guolin有读取testproject的权限,却没有写入权限,而wujinliang和liuou却拥有读写权限。至此权限配置完成
可以使用guolin用户测试下效果:
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传输的)
login guolin
password mypass