事先强调几个工具的用途

  1. git-core    git工具的主程序

  2. openssh-server openssh-client    ssh工具的主程序,一个是服务端,一个是客户端

  3. python-setuptools    以后安装gitosis要用到的工具


我的系统为ubuntu 12.04.5 server amd64

在搭建git服务器之前先请确认ubuntu系统已经安装成功,由于本文着重强调git服务器的安装就不阐述ubuntu 系统的安装过程,以及git命令的基本语法.以下所以有的命令都是在终端输入窗口输入.(这个其实不用我强调的,对吧.哇咔咔)

目前ubuntu的服务器的全名为ubuntu,用户名:antier

  1. 更新软件

    antier@ubuntu:~$sudo apt-get update

  2. 安装git,ssh协议

    antier@ubuntu:~$sudo apt-get install git-core openssh-server openssh-client

    注:git-core是git版本控制核心软件,安装openssh-server和openssh-client是由于git需要通过ssh协议来在服务器与客户端之间传输文件,安装的过程中有确认操作,输入Y后等待系统自动从镜像服务器中下载软件安装,安装完后会回到用户当前目录

  3. 安装python的setuptools和gitosis,由于gitosis的安装需要依赖于python的一些工具,所以这里需要先安装python的setuptools,

    antier@ubuntu:~$sudo apt-get install python-setuptools

    由于gitosis的安装需要用到git,所以在获取gitosis包时需要先初始化一个服务器的git用户信息

    antier@ubuntu:~$git config --global user.name "YourName"

    antier@ubuntu:~$git config --global user.email "Email@example.com"

    初始化服务器的用户信息后,就可以安装gitosis了.gitosis是用于管理git并给用户授权的工具,设置权限算是很方便的啦.这里我们将gitosis下载到/tmp目录下

    antier@ubuntu:~$git clone https//github.com/res0nat0r/gitosis.git

    获取gitosis文件后.在/tmp目录下就会多出一个文件目录,名为gitosis

    antier@ubuntu:~$cd /tmp/gitosis/

    antier@ubuntu:/tmp/gitosis$sudo python setup.py install

  4. 创建git管理帐户,配置git.这个是一定要做的.这个直接会影响到后期clone

    antier@ubuntu:~$sudo useradd -m git

    antier@ubuntu:~$sudo passwd git

    然后在/home目录下创建一个项目仓库存储点,并设置只有git用户拥有所有权限,其他用户没有任何权限

    antier@ubuntu:~$sudo mkdir /home/gitrepository

    antier@ubuntu:~$sudo chown git:git /home/gitrepository

    antier@ubuntu:~$sudo chmod 700 /home/gitrepository

    由于gitosis初始化时会将仓库放在用户的repositories目录下,例如git用户的仓库地址默认在/home/git/repositories/目录下,这里我们需要创建一个链接映射。让他指向我们前面创建的专门用于存放项目的仓库目录/home/gitrepository。

    antier@ubuntu:~$sudo ln -s /home/gitrepository /home/git/repositories

  5. 初始化gitosis

    由于初始化gitosis时需要用户的ssh公钥,所以这里将在服务器端生成git用户的ssh公钥,如果想在其他机器上管理也可以在其他机器上生成一个ssh公钥

    antier@ubuntu:~$su git        (注:以下的命令符前只有$时,说明当前是用git用户登陆并执行命令操作)

    $ssh-keygen -t rsa

    这里会提示输入密码,我们不输入直接回车即可,git用户的ssh公钥将生成在/home/git/.ssh/id_rsa.pub,为了方便管理,我们将公钥拷贝到服务器的/tmp下

    $cp /home/git/.ssh/id_rsa.pub /tmp

    为了方便管理公钥我们这里将公钥的名字改一下

    $mv /tmp/id_rsa.pub /tmp/git.pub

    如果是其他机器上的ssh公钥可以通过以下方式将公钥拷贝至服务器的/tmp目录

    $scp /home/$username/.ssh/id_rsa.pub git@<server-ip>:/tmp

    antier@ubuntu:~$sudo chmod a+r /tmp/git.pub

    antier@ubuntu:/tmp/gitosis$sudo -H -u git gitosis-init < /tmp/git.pub


    gitosis主要是通过gitosis-admin.git仓库来管理一些配置文件的,如用户权限的管理。这里我们需要对其中的一个post-update文件添加可执行的权限。

    ubuntu:/home/git$ sudo chmod 755 /home/gitrepository/gitosis-admin.git/hooks/post-update

    注:这一段我有看到网上这么处理一下,但我发现,如我之前这样操作后post-update本身的权限就已经是755啦.所以这里只是标注一下.

  6. 服务器上创建项目仓库

    使用git帐户在服务器上创建一个目录(mytestproject.git)并初始化成git项目仓库

    antier@ubuntu:~$su git

    $cd /home/gitrepository

    进入这个目录可以发现该目录里存在一个gitosis-admin.git目录,这个明白是哪里来的嘛,还记得之后做过ln -s xxxx的操作嘛,哇咔咔,是不是秒懂啦.

    $mkdir mytestproject.git

    $cd mytestproject.git

    $git init -- bare

    $exit

    注:执行完init的操作,正常情况下会提示创建了一个暂时为空的仓库,好啦,现在新建的仓库已经创建好了,但目前还不能被客户端clone,还需要对gitosis进行一些配置操作

  7. 使用gitosis管理用户操作项目的权限

    由于gitosis的管理是通过git的clone,然后修改并提交进行管理的,还记得gitosis在服务上安装并初始化嘛?还记得当时gitosis是怎么初始化的嘛?没错,就是用git用户去初始化的,我现在在这里给你申明一下,等下告诉你为什么我要申明哦.哇咔咔...在客户端机器上新建一个目录用于存放gitosis-admin.git仓库,这里由于我想用antier用户进行管理mytestproject.git所以执行以下操作,如果你在客户端机器上,也可以执行类似的操作哦

    antier@ubuntu:~$mkdir workspace

    antier@ubuntu:~$cd workspace

    antier@ubuntu:~/workspace$mkdir gitadmin

    antier@ubuntu:~/workspace$cd gitadmin

    antier@ubuntu:~/workspace/gitadmin$git clone git@<service-ip>:/home/git/repositories/gitosis-admin.git

    注:这下明白我之前申明的用意了嘛!是不是秒懂clone后面地址为什么是这样子了嘛,哇咔咔...

    clone下来有一个gitosis-admin目录,可以看到gitosis-admin目录里有一个配置文件gitosis.conf与一个目录keydir.

    gitosis.conf用于配置用户的权限信息,keydir主要用户存放ssh公钥文件(一般以"用户名@机器名.pub"命名,gitosis.conf配置文件中必须使用相同用户名),用于认证请求的客户机器

    antier@ubuntu:~/workspace/gitadmin/keydir$ssh-keygen -t rsa

    antier@ubuntu:~/workspace/gitadmin/keydir$cp /home/antier/.ssh/id_rsa.pub ./

    antier@ubuntu:~/workspace/gitadmin/keydir$mv id_rsa.pub antier@ubuntu.pub

    antier@ubuntu:~/workspace/gitadmin/keydir$cd ../

    antier@ubuntu:~/workspace/gitadmin/keydir$vim gitosis.conf

    编辑gitosis.conf文档,在文档最后添加以下内容

    [group mytestproject]

    members = git@ubuntu antier@ubuntu

    writable = mytestproject

    这样修改已经完成了,而这些修改只是在本地哦,还需要推送到服务器中才能生效,可别忘记啦.

    antier@ubuntu:~/workspace/gitadmin$git add .

    antier@ubuntu:~/workspace/gitadmin$git commit -m "add a user antier@ubuntu permission"

    antier@ubuntu:~/workspace/gitadmin$git push origin master

    现在服务器中的mytestporjetc仓库就算是搭建好了.接下来有对应权限的成员就可以各自从服务器上clone对应仓库并进行相关操作啦.

  8. 测试

    antier@ubuntu:~/workspace$git clone git@<server-ip>:mytestproject.git mytestproject

    这时可以看到在workspace目录下就多出一个mytestproject空目录,其实它并不是一个空目录,你可以使用ll命令查看,目录下对应有一个.git目录.哇咔咔...这个空目录就是当初我们在服务上的新仓库/home/git/repositories/mytestproject.git,为了进一步验证,我们在本地添加一个文件

    antier@ubuntu:~/workspace/mytestproject$touch test.txt

    antier@ubuntu:~/workspace/mytestproject$git add .

    antier@ubuntu:~/workspace/mytestproject$git commit -m "add test.txt for test"

    antier@ubuntu:~/workspace/mytestproject$git push origin master

    antier@ubuntu:~/workspace$git clone git@<server-ip>:mytestproject.git mytestproject_2

    这下我们去看mytestproject_2的目录,有发现什么,是不是相对之前取的mytestproject多了一个test.txt文档.或者我们查看一下git log信息,是不是有一条信息为"add test.txt for test"

  9. 完结,到此算是说完了.感觉好啰嗦啊!!哇咔咔...文章中有些文字排版有采纳了部分网络博文的描述方式,每个操作我都是经过自己测试过,才敢负责任的阐述出来,如果还有什么不明白的,请参数我的另外一篇博文"说在前面的话"