deploy with gitosis

没想到一开学之后就那么久没有写新的博客了

由于项目开发的需要,我们小团队需要搭建一台git仓库服务器,虽然用git那么长时间,但是搭建git服务器还是 第一次,毕竟平时使用只要在github上面托管就OK了。下面介绍一下自己使用gitosis搭建git服务器的过程。

###gitosis介绍

应该也会有像我一样对gitosis只是知道名字,然后潜意识的认为它是一个软件。其实这么想也没有什么大的错误, 但是当我使用它的时候,我还是有点惊喜。仿佛形成了这样的一条规律,但是和git相关的都要使用“版本库” 这个东西,就像博客一样,对于gitosis,我们所要维护的就是一个特殊的版本库。

###gitosis配置过程

一台服务器,当然我使用的是ubuntu服务器。其他linux系统的服务器的方法应该也是打通小异。

下面讲述它神奇的使用方式了

###ssh访问

其实我自己对ssh也不时研究很多,讲一讲我自己的了解吧,举个例子:你有一台linux服务器,上面运行 openssh程序,那么你使用 youname@servername命令就可以登录远程主机,当然这里面有验证的方式,主要有两种, 一种是基于password的,也就是在你输入上面这条命令之后,再输入密码。另外一种是应用最广泛也最安全的, 使用公钥和私钥方法,使用ssh-keygen命令可以在~/.ssh/目录下产生一对公钥和私钥,正常情况下名字分别为 id_rsaid_rsa.pub,你可以使用文本查看器来观看里面的内容。这两个文件一个是公钥,一个是私钥。 这两个文件不能被别人知道。尤其是私钥。下面使用网上的一张图片说明一下它们的认证原理。

ssh

我们使用ssh公钥私钥机制进行认证的时候,需要将公钥文件上传到服务器,在服务器的~/.ssh/目录下面会有一个 authorized_keys文件,我们需要把上传到服务器的公钥放到这个里面就可以了。多个用户可以顺序将各自的公钥 放在这个文本文件里面。

###添加一个git用户

我们需要在服务器上面添加一个git用户,以后凡是访问这个服务托管代码的都需要使用这个 用户名,我们想一下github是不是也是如此呢?添加用户的命令sudo useradd git.gitosis wiki上的方法应该 是

    sudo adduser \
    --system \
    --shell /bin/sh \
    --gecos 'git version control' \
    --group \
    --disabled-password \
    --home /srv/example.com/git \
    git

使用这两种方法添加用户都可以,其中注意一点:git用户是否可以使用sudo。如果不能,在后面初始化gitosis-admin 仓库的时候会出错,解决办法是visudo,在打开的文件的最后一行加入git ALL = (ALL) ALL

###执行gitosis-init命令

执行该命令就相当于是初始化一个管理仓库,执行这条命令前,我们需要准备一个公钥, 以后,你也将使用这个公钥和私钥对管理这个gitosis服务器。现在我们执行下面这条命令:

sudo -H -u git gitosis-init < /tmp/id_dsa.pub

其中id_dsa.pub是你的公钥的名字。这条命令会在你的git 用户的目录下面新建一个repositories的目录,并且初始化出一个gitosis-admin.git的仓库。在这里说一下, gitosis的管理主要就是维护这个仓库。另外一点:以后新建的一些仓库都会在repositories的目录下面。显然, 这个gitosis-admin是一个特殊的仓库,或者可以说是一个管理员维护的仓库。最后,还要执行下面命令, 给post-update加上权限。 sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update

###维护gitosis-admin仓库

在上面的操作基础上,执行ssh git@gitserver,如果出现类似 PTY allocation request failed on channel 0的信息,则表示用户身份已经识别,因为没有运行git命令,所以 链接断开。现在把远程的gitosis-admin仓库克隆到本地:git clone git@gitserver:gitosis-admin.git。 就像使用github一样,你会得到一个gitosis-admin的目录。里面的内容也是非常简单,基本上显示的目录如下:

    |-- gitosis.conf
    `-- keydir

其中gitosis.conf是一个配置文件,keydir是一个目录。查看gitosis.conf文件,

    [gitosis]
    
    [group gitosis-admin]
    writable = gitosis-admin
    members = cloudaice@gmail.com

配置文件可读性也非常强,它显示了gitosis-admin仓库的管理者cloudaice@gmail.com。并且具有写权限 writable

现在我们新建立一个仓库,仓库的名字叫web-project,并且添加开发者:cloudaice@gmail.com

    [group web-developer]
    writable = web-project
    members = cloudaice@gmail.com

修改配置之后就可以像提交普通仓库一样

    git add .
    git commit -m "message"
    git push

在这里,我们不需要到服务器上面建立仓库。只要将gitosis-admin推送到远程服务器上面就可以。然后在你真正 推送项目的时候,会自己自动建立仓库,想一想,github是不是也是这么使用的? 现在我们切换到web-project项目的目录下面。

    cd web-project
    git remote add origin git@gitserver:web-project
    git push origin master

这里填写版本库的名字的时候,直接在服务器名字的后面用冒号引出来就可以了。到这里都没有出现错误的话, 基本就已经OK了。 现在,我们要进行团队之间的协作了,我们为john,josie和jessica添加公钥,把john.pub,josie.pub, jessica.pub添加到keydir目录下面.接下来把这里人加入到web-developer团队当中。编辑gitosis.conf文件

    [group web-developer]
    writable = web-project
    members = john josie jessica

最后提交这个修改。这些新成员也可以对版本库拥有推送的权限了。


:这里添加的用户的名字,应该要和公钥文件的名字对应,另外,gitosis仓库比较特殊,因为是使用gitosis-init命令初始化建立的,因此就使用了公钥里面最后的邮箱地址。

###简单的权限控制

如果想让john只有读取的权限,可以建立另外一个组

    [group web-developer]
    writable = web-project
    members = josie jessica
    
    [group web-developer-ro]
    readonly = web-project
    members = john

另外还有可以让一个组作为另外一个组的成员,在组名的前面加上@

    [group python-developer]
    members = lucy lily
    
    [group web-developer]
    writable = web-project
    members =@python-developer josie jessica

gitosis的简单应用就这些,另外还有更加深入的用法有待以后探究

Xiang Chao 19 April 2012
blog comments powered by Disqus
Fork me on GitHub