背景 | 今天在阿里云上申请了一个Ubuntu的云服务器,准备搭建一个git服务器作为管理代码的远程仓库 |
使用有sudo
权限的用户账号,下面,正式开始安装。
sudo apt-get update
sudo apt-get install git
sudo adduser git
sudo apt-get install git-core openssh-server openssh-client
sudo apt-get install python-setuptools
Ⅰ、把所有用户的公钥保存在 authorized_keys 文件的做法,只能凑和一阵子,当用户数量达到几百人的规模时,管理起来就会十分痛苦。每次改删用户都必须登录服务器不去说,这种做法还缺少必要的
权限管理 — 每个人都对所有项目拥有完整的读写权限。
Ⅱ、简单地说,Gitosis 就是一套用来管理 authorized_keys 文件和实现简单连接限制的脚本。有趣的是,用来添加用户和设定权限的并非通过网页程序,而只是管理一个特殊的Git仓库。
你只需要在这个特殊仓库内做好相应的设定,然后推送到服务器上,Gitosis 就会随之改变运行策略
Pre:安装gitosis之前,需要检查是否初始化过git服务器用户信息。
git config --list
若没有以上现象则,输入命令:
git config --global user.name ”用户名”;
git config --global user.email ”邮箱”。
Next: 获取gitosis版本文件;/tmp是Ubuntu各种安装包与文件的存放的目录
cd /tmp
git clone https://github.com/res0nat0r/gitosis.git
Final: 进入gitosis目录,使用python命令安装目录下的setup.py的python脚本进行安装gitosis.
cd /tmp/gitosis
sudo python setup.py install
/home/目录下创建一个目文件夹作为仓库sudo mkdir /home/gitrepository,并修改用户组和权限
由于gitosis默认状态下会将仓库放在用户的repositories目录下,这里我们需要创建一个链接映射。让他指向我们前面创建的专门用于存放项目的仓库目录/home/gitrepository
sudo mkdir /home/gitrepository
sudo chown git:git /home/gitrepository/
sudo ln -s /home/gitrepository/ /home/git/repositories/
Gitosis服务初始化,就是初始化一个gitosis-admin库,并为管理员分配权限,gitosis-admin库非常重要,以后我们建的所有库的权限分配都要通过此库来进行操作。
接下来我们将Gitosis管理员的公钥添加到专用账号的宿主目录下的公钥存放目录下,在此对应的是/home/git/.ssh/authrized_keys文件中,具体操作过程如下:
(1) 在你要进行操作gitosisi-admin库的windows客户端机器上生成密钥
下载安装windows版本的git客户端软件,下载地址:http://msysgit.github.io/
如果客户端是windows,在windows安装git后,对应开始菜单里GIT目录里会有Git Bash
运行此命令会打开仿unix命令行窗口,可以在此执行ssh-keygen命令:
ssh-keygen
命令行会提示如下:
-
Generating public/private rsa key pair.
- Enter file in which to save the key (/c/Users/Administrator/.ssh/id_rsa):
上面提示我们是否需要自定义公钥和密钥的生成目录,这里我们保持默认即可,上面的括号里是默认存放的目录。接下来按回车,命令行会提示如下,
- Enter passphrase (empty for no passphrase):
为了防止我们的私钥被盗用的可能,上面提示我们为私钥输入使用密码,如果我们设置上密码后,以后每次我们要push或pull远程库的时候都会提示我们输入密码,不过再此我们可以不用输入密码,直接回车就可以。一路回车后,我们的密钥和公钥就会生成了,命令提示符下会输出它们保存的目录,其中id_rsa为私钥,id_rsa.pub为公钥。
(2)上传管理员公钥到服务器。
可以采用任何可行的方式(xshell的文件传输、FTP等)将公钥上传至服务器,此外我们把公钥id_rsa.pub保存在服务器的/tmp目录下。
su - git #切换到git用户身份下,不然执行下面的初始化后客户端管理员是无法通过密钥来访问的,权限的问题
gitosis-init < /tmp/id_rsa.pub #出现下面的提示表示成功 注意要设置为git权限
Reinitialized existing Git repository in /home/git/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /home/git/repositories/gitosis-admin.git/
cd ~ #回到git用户的宿主目录
ls #查看目录文件
gitosis repositories #自动生成两个目录|目录repositories是用来存放所有的git版本库
(4)确保gitosis-admin版本库的钩子脚本可执行。
chmod a+x ~git/repositories/gitosis-admin.git/hooks/post-update
git clone [email protected]:gitosis-admin.git
cd gitosis-admin/
克隆完成后,进入gitosis-admin目录下,看有哪些文件:
.git (隐藏的目录, 如果在windows下看不见,ls -all”)
keydir (目录,存放用户的公钥,刚开始只有一个管理员公钥)
gitosis.conf (授权文件)
授权文件gitosis.conf,初始内容:
整个授权文件以用户组为核心,而版本库为核心。
- 第3行开始定义了一个用户组gitosis-admin。
- 第4行设定了该用户组对哪些版本库具有写操作。
- 第5行设定了该用户组包含的用户列表。初始时只有一个用户,即管理员公钥所属的用户。
su git
cd ~/respositories
mkdir test.git
cd test.git
git init --bare
ssh-keygen #此操作为新客户端
#第一个客户端(管理员)将新客户端的公钥添加至本地库,再上传
[gitosis]
[group gitosis-admin]
writable = gitosis-admin
members = Administrator@PC20150615111
[group common]
writable = test
members = 用户1 用户2
提交gitosis-admin版本库的更改
git add .
git commit -m "增加新成员xxx,yyy对test测试库的访问权限"
git push
/etc/init.d/ssh restart #服务器端重启下ssh服务
此时新的客户端就拥有对测试库的操作权限了,在客户端执行git clone命令,clone下来测试库。
git clone ssh://[email protected]/test.git #新客户端操作
mkdir projectgit
cd projectgit/
git init
echo "this is a first project file,will push to server" > readme.txt
git add .
git config --global user.name "yhc"
git config --global user.email "[email protected]"
git commit -am "init a base version,add a first file for push to server"
git remote add origin [email protected]:yhcproject.git
git push origin master