Git, 一个分布式的版本管理工具,我认为其革命性的点:在于改变了用户协作的方式,使得协作更简单。
下面讲述 使用一个开源软件 Gitolite搭建一个Git Sever, 并给了一个推荐的团队协助方式。
[ ~]# useradd git
[
~]# passwd git
```
# 切换为 git 用户
# su git
[git@server ~]$ cd ~
[git@server ~]$ git clone git://github.com/sitaramc/gitolite
# 创建 ~/bin 目录
[git@server ~]$ mkdir bin
# 把 /home/git/bin 添加到环境变量里, 通过修改git 家下面的.bashrc
[git@server ~]$ vim .bashrc
# 在文件最后添加
export PATH=/home/git/bin:$PATH
# Install gitolite into $HOME/git/bin
[git@server ~]$ gitolite/install -ln
[git@server ~]$
客户端如果生成ssh key, 参考: Github - Generating SSH Keys
[ahnniu@client ~] cd ~/.ssh
[ahnniu@client .ssh] ls -al
# 如果不存在 id_rsa, id_rsa.pub 则运行下面的命令创建
[ahnniu@client .ssh] ssh-keygen -t rsa -C "[email protected]"
# 复制一份id_rsa.pub并重命名为 ahnniu.pub, 注 ahnniu为 gitolite管理员的用户名
[ahnniu@client .ssh] cp id_rsa.pub ahnniu.pub
# 通过ssh上传到服务器上(/home/git/),特别注意文件的owern应该为git
[ahnniu@client .ssh] scp ~/.ssh/ahnniu.pub [email protected]:/home/git/
Refrence: 官方 - setting up gitolite
[git@server ~]$ cd ~
# 基于提供的ahnniu.pub 创建 gitolite-admin 管理仓库
[git@server ~]$ gitolite setup -pk $HOME/ahnniu.pub
Initialized empty Git repository in /home/git/repositories/gitolite-admin.git/
Initialized empty Git repository in /home/git/repositories/testing.git/
WARNING: /home/git/.ssh missing; creating a new one
(this is normal on a brand new install)
WARNING: /home/git/.ssh/authorized_keys missing; creating a new one
(this is normal on a brand new install)
至此,SSH方式的Git服务已经搭建好了
# 首先需确保,上传的管理员key ahnniu.pub是在这台电脑上生成的,否则是没有权限的
[ahnniu@client ~] git clone [email protected]:gitolite-admin.git
Cloning into 'gitolite-admin'...
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (6/6), done.
Checking connectivity... done.
将在最后一节详细介绍。
[root@server ~]# yum install httpd
Apache几个重要的路径:
[root@server ~]# /etc/httpd/conf/httpd.conf
# 修改下面2个变量
Listen 192.168.2.223:80
ServerName 192.168.2.223:80
添加一个index.html, 看是否可访问
[root@server ~]# cd /var/www/html/
[root@server html]# vim index.html
# 添加以下内容.
Hello World!
# 需把index.html的所有权转为apache用户
[root@server html]# chown apache:apache index.html
# 开启 httpd
# 这里可能会有端口被占用的一些问题,使用命令netstat 查看是哪个命令
[root@server html]# /usr/sbin/apachectl -k start
从客户端访问 http://192.168.2.223/index.html, 如果可能,说明apache安装成功
[git@server ~]$ cd
# 编辑 ~/.gitolite.rc, 设置PATH变量:(添加gitolite 所在的bin到$PATH)
[git@server ~]$ vim .gitolite.rc
# 添加下面一句道文件最__前面__
$ENV{PATH} .= ":/home/git/bin";
[root@server ~]# suexec -V
-D AP_DOC_ROOT="/var/www"
-D AP_GID_MIN=100
-D AP_HTTPD_USER="apache"
-D AP_LOG_EXEC="/var/log/httpd/suexec.log"
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
-D AP_UID_MIN=500
-D AP_USERDIR_SUFFIX="public_html"
[root@server ~]# install -d -m 0755 -o git -g git /var/www/bin
[root@server ~]# install -d -m 0755 -o apache -g apache /var/www/git
[root@server ~]# cd /var/www/bin
[root@server bin]# vim gitolite-suexec-wrapper.sh
# 内容为
#!/bin/bash
#
# Suexec wrapper for gitolite-shell
#
export GIT_PROJECT_ROOT="/home/git/repositories"
export GITOLITE_HTTP_HOME="/home/git"
# 为gitolite 下载目录 git clone git://github.com/sitaramc/gitolite
exec ${GITOLITE_HTTP_HOME}/gitolite/src/gitolite-shell
# git为owner
[root@server bin]# chown git:git gitolite-suexec-wrapper.sh
# 修改执行权限
[root@server bin]# chmod 0700 gitolite-suexec-wrapper.sh
# 查看权限有无修改正确
[root@server bin]# ls -al
NOTE: gitolite-suexec-wrapper.sh 文件中不能出现中文,包括空格,否则会出现format错误。
如果遇到问题,可以参考:http://stackoverflow.com/questions/14860166/solved-gitolite-and-http-error-500-permission-issue-in-setup
[root@server ~]# cd /etc/httpd/conf.d
# 在 conf.d 添加 gitolite的配置
[root@server conf.d] vim gitolite.conf
# 内容为
<Directory /var/www/git>
Options None
AllowOverride none
Order allow,deny
Allow from all
</Directory>
SuexecUserGroup git git
ScriptAlias /git/ /var/www/bin/gitolite-suexec-wrapper.sh/
ScriptAlias /gitmob/ /var/www/bin/gitolite-suexec-wrapper.sh/
<Location /git>
AuthType Basic
AuthName "Git Access"
Require valid-user
AuthUserFile /etc/httpd/git.passwd
</Location>
我们在上面的配置:AuthUserFile /etc/httpd/git.passwd
[ahnniu@server ~] cd /etc/httpd/
# 创建git.passwd, 并创建 ahnniu的用户
[ahnniu@server ~] htpasswd -c git.passwd ahnniu
#接下来输入密码
gitolite log文件:/home/git/.gitolite/logs
[root@server ~]# /usr/sbin/apachectl -k stop
[root@server ~]# /usr/sbin/apachectl -k start
[ahnniu@client ~] git clone http://192.168.2.223/git/testing.git
我认为Gitolite是典型的吃自己的狗粮,他的管理完全是操作Git来完成, 他可以允许多个管理员同时管理,因为是基于一个git仓库,那么通过merge可以解决冲突的问题
Gitolite有一个gitolite-admin.git的仓库, 通过操作:
下面我们探讨如果通过gitolite打造Github那样的Git Server.
Public: 仓库可以给任何人Clone,pull
Private: 仓库只能给指定的人Clone,pull
仓库的拥有者,可以对仓库做任何想做的事情,比如push, 修改其它人访问这个仓库的权限,甚至删除,至少需要有一个人
可读写组, clone, push, pull
可读组, clone, pull
其中 Owner包含 RW, RW权限 包含 R
克隆gitolite管理仓库
NOTE: 需使用安装Gitolite指定的SSH Key对应的电脑(或者Copy 对应的 id_rsa到你使用的电脑~/.ssh), HTTP方式好像不能操作gitolite-admin.git仓库。
[ahnniu@client ~] $ git clone [email protected]:gitlite-admin.git gitolite-admin
[ahnniu@client ~] tree
├── conf
│ └── gitolite.conf
└── keydir
└── ahnniu.pub
2 directories, 2 files
Refernce: Gitolite官方 - adding and removing users
建议的用户名:尽可以由 字母,数字, - , _ 来组成,最少3个字符,不能包括#,$,@等特殊符号
举例: paul
用户名的用途:
SSH协议很安全,另外,配置好之后也无需输入密码什么的,也很方便。
假定新增 用户名: paul
Step1: paul 在他本机电脑上:生成SSH Key
参考 文章的上部
Step2: paul 把生成的 paul.pub 发给管理员,由管理员添加
Step3: 管理员在Client端 gitolite-admin仓库,复制 paul.pub 到 ./keydir中
Step4: 管理员commit仓库,并push, gitolite配置生效
[ahnniu@client gitolite-admin] git commit -m "add user: paul"
[ahnniu@client gitolite-admin] git push origin
Step5: 管理员可以 使用 paul 这个用户名 配件权限了
一个人经常会有几个办公的场所/电脑,比如公司,家,笔记本,那么如果需要在这些电脑上操作Git的话,都需要配置SSH Key, 并把这些Key发给管理员添加
建议的SSH Public Key的命名为:
需管理员登录到服务器操作:
[ahnniu@server ~] cd /etc/httpd/
# 基于git.passwd文件, 并创建 paul的用户
[ahnniu@server ~] htpasswd git.passwd paul
#接下来输入密码
假定删除 paul 用户,gitolite-admin仓库中
一个Team表示一些具备同类属性的人,如果就Git仓库来说,他们操作的是同一些Git仓库。
一个Team也是一个实体,他可以拥有Git仓库。Team的成员可以按照Owern, RW, R三个不同的权限分成3组。
Github的做法:首先是一个Orignization, Orignization下再分多个Team, 每个Team对应一个权限组,或者Owern, 或者RW, 或者R, 那么这个Github下面的Team的共性在于:操作同一些Git仓库,而且具有相同的权限操作。这对大公司而言,比较合适,比如一个公司研发团队很大,又分为了研发一部,研发二部等等。
详细可参考:
对于小公司而言,直接按照我上面提到的应该更合适一些。
在Gitolite中,推荐的团队呈现方式:
# coocox team owner组
@coocox_owner = paul
# coocox team 读写组
@coocox_rw = tom jim
# coocox team 只读组
@coocox_r = alice sky
# 三个小组合并起来,就是coocox这个team
@coocox = @coocox_owner @coocox_rw @coocox_r
NOTE: 新建仓库 无需 在Server端 repositories 中 运行
git init --bare
, 直接在gitolite.conf中添加下面配置语句,gitolite会帮我们做到
# cox 是要创建的仓库名称, 对应url: [email protected]: cox.git
repo cox
RW+ = ahnniu
R = @all
我们看到github上的仓库命名: :coocox/cox.git, 很清晰,一样可以看到仓库的owner, gitolite是否支持这样的? 答案是支持的。
# cox 是要创建的仓库名称, 对应url: [email protected]: cox.git
# ahnniu是用户名,用户名是不可能更改的
repo ahnniu/cox
RW+ = ahnniu
R = @all
Refrence: Gitolite官方 - adding and removing repos
# 用于归纳
@coocox_repo = coocox/cox coocox/coide
repo coocox/cox
RW+ = @coocox_owner @coocox_rw
R = @coocox_r
repo coocox/coide
RW+ = @coocox_owner @coocox_rw
# 除coocox team的人可Read外,paul这个个人也是可以读的
R = @coocox_r paul
# 不推荐下面 大锅饭的管理方式:
# 这样不允许特例的出现,比如Team下的仓库还希望可以被某个个人访问
repo @coocox_repo
RW+ = @coocox_owner @coocox_rw
R = @coocox_r
#
我们用到gitolite仓库的权限主要有两个:
repo ahnniu/cox
RW+ = ahnniu
# R组, 添加@all 就是 Public
# R组, 移除 @all 就是 Private
R = @all