第一步:安装git服务器所需软件
1. 安装git-core,openssh-server,openssh-client
打开终端输入以下命令:
ubuntu:~$ sudo apt-get install git-core openssh-server openssh-client
git-core是git版本控制核心软件。
openssh-server和openssh-client是由于git需要通过ssh协议来在服务器与客户端之间传输文件
然后中间有个确认操作,输入Y后等待系统自动从镜像服务器中下载软件安装,安装完后会回到用户当前目录。如果安装提示失败,可能是因为系统软件库的索引文件太旧了,先更新一下就可以了,更新命令如下:
ubuntu:~$ sudo apt-get update
更新完软件库索引后继续执行上面的安装命令即可。
2. 安装python-setuptools和gitosis
安装Python的setuptools和gitosis,由于gitosis的安装需要依赖于python的一些工具,所以我们需要先安装python的setuptools。执行下面的命令:
ubuntu:~$ sudo apt-get install python-setuptools
这个工具比较小,安装也比较快,接下来准备安装gitosis,安装gitosis之前需要初始化一下服务器的git用户信息,这个随便填。
ubuntu:~$ git config --global user.name "myname"
ubuntu:~$ git config --global user.email "******@gmail.com"
初始化服务器用户信息后,就可以安装gitosis了,gitosis主要是用于给用户授权,设置权限也算是很方便的。可以通过以下命令获取gitosis版本文件(该命令是直接去网上获取gitosis.git)
ubuntu:~$ git clone https://github.com/res0nat0r/gitosis.git
注意:中间有两个是数字零,上述命令去github上面把gitosis的文件夹下载下来,位置位于执行该命令的文件夹位置,比如如下:
解释:因为执行该clone命令的时候是在root账户下,而且在root用户的根目录下面执行的,所以就把文件clone到了root用户的根目录下面。
获取gitosis文件后,进入到文件目录下面:
ubuntu:/tmp$ cd gitosis/
接着使用python命令安装目录下的setup.py的python脚本进行安装ubuntu:/tmp/gitosis$ sudo python setup.py install
到这里,整个安装步骤就完成了,下面就开始对git进行一些基本的配置。
第二步:创建git管理员账户、配置git
1. 创建一个专门用来管理git服务器的账户
创建一个账户(git)作为git服务器的管理员,可以管理其他用户的项目权限。(理解:在Ubuntu里面创建一个用户,该用户专门用来操作仓库,远程用户即通过该用户来使用git服务器软件)
ubuntu:/tmp/gitosis$ sudo useradd -m git
ubuntu:/tmp/gitosis$ sudo passwd git
2. 然后创建一个项目仓库存储点
然后再/home目录下创建一个项目仓库存储点,并设置只有git用户拥有所有权限,其他用户没有任何权限。
ubuntu:/tmp/gitosis$ sudo mkdir /home/gitrepository
ubuntu:/tmp/gitosis$ sudo chown git:git /home/gitrepository/
ubuntu:/tmp/gitosis$ sudo chmod 700 /home/gitrepository/
理解:这个实际的仓库存储点目前放在/home根目录下面,如下图所示:
但是不代表repository文件夹只能在/home目录下面,而是放在系统磁盘任意位置都可以。无论在任何位置,关键是这个目录需要链接到gitosis的默认仓库目录下面才是关键。这个目录才会被gitosis管理起来。
3. 添加实际repository到gitosis默认仓库的链接
由于gitosis默认状态下会将仓库放在用户的repositories目录下(重要),例如git用户的仓库地址默认在/home/git/repositories/目录下,这里我们需要创建一个链接映射。让他指向我们前面创建的专门用于存放项目的仓库目录/home/gitrepository。
ubuntu:/tmp/gitosis$ sudo ln -s /home/gitrepository /home/git/repositories
上述命令执行的效果是会在git账户目录下面生成一个蓝绿色的目录,代表的就是软链接,如下图所示:
4. 生成管理员公钥
在想要作为管理员账户的机器上生成相应的管理员公钥,执行如下的命令:
ubuntu:/home/git$ ssh-keygen -t rsa
这里会提示输入密码,我们不输入直接回车即可。然后用刚生成公钥id_rsa.pub来对gitosis进行初始化。注释:生成的密钥位于当前账户的用于目录下面。详细情况见章节2生成密钥:
初始化Gitosis ,需要通过一个公钥来运行gitosis-init,首先将我本地的公钥复制到服务端。
理解:这个用来初始化gitosis仓库的公钥可以理解为管理员公钥,该公钥的拥有者就能够修改包含gitosis设置的那个git仓库。这个公钥可以由其他远程终端提供,也可以由服务器自身的其他用户来提供。比如,在我的使用中,通过Ubuntu系统中的sample账户产生了一个rsa密钥,并使用这个密钥来初始化gitosis。那么sample账户就可以完全控制gitosis-admin.git仓库。
5. 初始化Gitosis
然后,服务端执行如下命令初始化gitosis:(应该说任何用户都可以执行此初始化命令)
root@ubuntu:/home/git/.ssh#sudo -H -u git gitosis-init < /home/username/.ssh/id_rsa.pub
出现如上信息说明gitosis已经初始化成功。gitosis主要是通过gitosis-admin.git仓库来管理一些配置文件的,如用户权限的管理。这里我们需要对其中的一个post-update文件添加可执行的权限。
ubuntu:/home/git$ sudo chmod 755 /home/gitrepository/gitosis-admin.git/hooks/post-update
解析:
sudo -H -u git gitosis-init < /home/username/.ssh/id_rsa.pub命令,有两个关键参数:
l Git:被初始化的账户。初始化该账户后,在该账户下面将创建repositories目录作为默认工作目录。如果已经存在该目录,则把该目录作为默认工作目录。(在本应用中,在git账户下放了一个repositories链接,实际的目录为/home/repository,链接到git目录下的)
l Id_rsa.pub:该密钥被用于初始化gitosis后,只有该密钥的拥有账户能够修改gitosis-admin,即完成授权等。这样该公钥的拥有者就能修改包含着gitosis 设置的那个Git 仓库了。本应用中是用服务器上自带的账户username账户的密钥初始化的,则只有username账户才能够修改这个管理库。如果这个密钥是客户端一个账户生成的,则只有该客户端才能够整改gitosis-admin.git账户。
总结:
执行初始化gitosis的过程,其实就是读取密钥,创建gitosis的工作目录,然后在该工作目录下面创建了一个gitosis-admin.git管理员仓库。
gitosis的工作目录是被初始化账户(sudo -H -u git gitosis-init)即git账户下的repositories目录。可以这么认为:执行了(sudo-H -u git gitosis-init),把gitosis和/home/git/repositories目录关联了起来,然后在repositories目录下面就生成了对应的管理目录gitosis-admin.git,这个目录只有公钥所有者才能够对其进行修改。
第三步:服务器上创建项目仓库
使用git账户在服务器上创建一个目录(mytestproject.git)并初始化成git项目仓库。
ubuntu:/home/git$ su git
$ cd /home/gitrepository
$ mkdir mytestproject.git
$ git init --bare
$ exit
如果出现以下信息就说明已经成功创建了一个名为mytestproject.git的项目仓库了,新建的这个仓库暂时还是空
的,不能被客户端clone,还需要对gitosis进行一些配置操作。
第四步:使用gitosis管理用户操作项目的权限
1. Clone gitosis管理仓库
首先需要在前面生成ssh公钥(用来初始化gitosis)的机器(关键)上将gitosis-admin.git的仓库clone下来(理解:把提供初始化rsa的机器称为服务器管理机器)。在服务器管理机器上新建一个目录用于存放gitosis-admin.git仓库。
ubuntu:~$ mkdir gitadmin
ubuntu:~$ cd gitadmin/
ubuntu:~/gitadmin$ git clone git@192.168.1.106:gitosis-admin.git
clone正确会显示一下信息
注意:在什么地方执行的clone命令,则下载下来的文件就位于什么位置。
错误操作:在一台不是生成管理密钥的电脑上面执行命令克隆gitosis-admin.git仓库,会触发错误,详细解析见“使用git,clone时报does notappear to be a git repository”章节。
clone下来会有一个gitosis.conf的配置文件和一个keydir的目录。gitosis.conf用于配置用户的权限信息,keydir主要用户存放ssh公钥文件(一般以“用户名.pub”命名,gitosis.conf配置文件中需使用相同用户名),用于认证请求的客户端机器。
2. 添加新的用户并分配权限
1. 待授权用户生成rsa文件,并提供给管理员,放到keydir目录下。
现在让需要授权的用户使用前面的方式各自在其自己的机器上生成相应的ssh公钥文件,管理员把他们分别按用户名。命名好,复制到keydir目录下。复制的方法很多,如下是Ubunt中通过命令复制,甚至可以直接鼠标拷贝过去。
ubuntu:~$ cp /home/aaaaa/Desktop/zhangsan.pub /home/aaaaa/gitadmin/gitosis-admin/keydir/
ubuntu:~$ cp /home/aaaaa/Desktop/lisi.pub /home/aaaaa/gitadmin/gitosis-admin/keydir/
2. 继续编辑gitosis.conf文件,配置对应用户的权限
[gitosis]
[groupgitosis-admin] ####管理员组
members =charn@ubuntu ####管理员用户名,需要在keydir目录下找到相应的.pub文件,多个可用空格隔开(下同)
writable = gitosis-admin ####可写的项目仓库名,多个可用空格隔开(下同)
[grouptestwrite] ####可写权限组
members= zhangsan ####组用户,多个用户的话通过空格隔开
writable= mytestproject ####可写的项目仓库名
[grouptestread] ####只读权限组
members=lisi ####组用户
readonly=mytestproject ####只读项目仓库名
3. 把修改后的管理员仓库推送到服务器
因为这些配置的修改只是在本地修改(管理员账户是远程)的,还需要推送到服务器中才能生效。
ubuntu:~/gitadmin/gitosis-admin$ git add .
ubuntu:~/gitadmin/gitosis-admin$ git commit -am "add a user permission"
ubuntu:~/gitadmin/gitosis-admin$ git push origin master
推送成功会显示下面提示信息
4. 重启sshd服务,让配置生效
又是后新增的用户不能立即生效,这时候需要重新启动一下sshd服务
ubuntu:~/gitadmin/gitosis-admin$ sudo /etc/init.d/ssh restart
现在,服务端的git就已经安装和配置完成了,接下来就需要有权限的组成员在各自的机器上clone服务器上的相应项目仓库进行相应的工作了。
第五步:客户端(windows)使用git
下载安装windows版本的git客户端软件,下载地址:http://msysgit.github.io/安装完成后右键菜单会出现几个git相关的菜单选项,我们主要使用其中的gitbash通过命令行来进行操作。在本地新建一个目录,使用git初始化这个目录,然后再里面新建一个文本文件用于测试,最后关联到git服务器仓库中的相关项目,最后上传本地版本到服务器。
$ mkdir testgit
$ cd testgit
$ git init
$ echo "this is a test text file,will push to server" > hello.txt
$ git add .
$ git commit -am "init a base version,add a first file for push to server"
$ git remote add origin git@服务器IP地址:mytestproject.git
$ git push origin master
这样服务端就创建好了一个mytestproject.git的仓库的基础版本了,现在其他组员只要从服务端进行clone就可以
了。window下面进入到需要克隆的本地目录下面右键选择gitbash选项,输入
$ git clone git@serverip:mytestproject.git
就可以把项目clone到本地仓库了。
下面进行简单的修改和提交操作
$ cd mytestproject
$ echo "this is another text file created by other" >another.txt
$ git add .
$ git commit -am "add a another file by other"
$ git push origin master
最后推送到服务器成功会显示如下信息
第六步:Gitosis带来的变化
使用了gitosis,执行git命令的时候,gitosis自动完成了两件事情:
1. 目录管理
Git命令的默认目录变成了gitosis的默认目录,比如这里是/git/repositories.
以clone命令为例,如果没有gitosis,则执行命令如下:
git clone git@192.168.1.106:/home/git/repositories/gitosis-admin.git
使用了gitosis,则执行命令如下:
git clone git@192.168.1.106:gitosis-admin.git
2. 权限管理:为每一个用户设置对对应项目的读写权限。
Warning:
如果该客户端没有被认证过,则会触发如下所示的错误:使用git,clone时报does not appear to be a git repository
3. 如果一个账户如git账户被gitosis初始化了,则该账户此时的任何ssh通讯都被gitosis托管。直接使用ssh命令都会触发gitosis的权限管理,直接输入密码的方式反而不被接受了。
举例:想通过scp命令传输本地文件到服务器。
如果选择scp的接收用户为git账户(该账户已经被gitosis初始化):
但是如果把接收的用户替换成username用户,则不会触发此错误