git安装完毕后只是一个简单的版本控制,还没有权限管理,常用git权限管理工具有gitosis和gitolite,后者是在前者基础上改进而来,这里我安装gitolite
gitolite最终要实现的目标:
1、通过远程连接能够对服务器上仓库进行读写操作;
2、安全的权限管理,最小化的配置;一般连接服务器都是用key控制。
3、通过同一个用户名,不同的key来划分权限,拥有此key和用户名无法登陆服务器,服务器通过一个管理员key登陆。
官方文档里的一句话: Gitolite does not do authentication. It only does authorisation. gitolite 不进行身份验证,仅是授权。
$ cd /home/git/ $ git clone git://github.com/sitaramc/gitolite
$ mkdir bin ##文档要求,gitolite在家目录要有bin文件夹,或者自己指定,我选择创建家目录下bin目录
$ gitolite/install -ln
此时发现 /home/git/bin/ 目录下多了软连接。
$ ls -la total 0 lrwxrwxrwx 1 git users 31 May 27 16:28 gitolite -> /home/git/gitolite/src/gitolite
git用户下重新生成一个key,区别于上一篇文章中git私有key,前面的key用来用户登录,去服务器端管理,现在生成的key是作为gitolite的管理员key。
$ ssh-keygen -t rsa -f ~/.ssh/git_admin
$ cd bin
$ ./gitolite setup -pk /home/gita/.ssh/git_admin.pub
初始化空的 Git 版本库于 /home/git/repositories/gitolite-admin.git/
初始化空的 Git 版本库于 /home/git/repositories/testing.git/
此时gitolite 配置成功。如果出现如下错误,说明你在使用和登录用的同一个key。
WARNING: keydir/git_key.pub duplicates a non-gitolite key, sshd will ignore it
查文档,说不能使用登录用的keypair,需要重新生成ssh的keypair,原因如下:
1、前面的设置一般情况下是通过ssh连接到服务器,故需要用户名(即git)和key(通过ssh-keygen 命令生成),因为此key可直接登录服务器,不适合做git管理员
2、在 ~/.ssh/authorized_keys 里,git授权的格式和ssh授权的格式不同,做了扩展,无法通用。
我这样操作了一次,想回退上面的命令发现失效,按照文档说的去做(文档写的是直接重新执行,就会覆盖)也是失效的,删掉gitolite,重新操作一遍
发现最主要的配置在 $HOME/.gitolite 和 $HOME/.gitolite.rc 不删掉还是会出现上面的错误,一并删掉,连同repositories。
此时查看 .ssh/authorized_keys 授权文件。
$ cat /home/git/.ssh/authorized_keys ssh-rsa ************************************** git@namenode # gitolite start command="/home/git/gitolite/src/gitolite-shell git_admin",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa ***************************** git@namenode # gitolite end
开始配置管理员:
Strictly speaking, gitolite doesn't know where users come from. 官方文档的一句话 “ 严格来说gitolite不知道用户从哪里来 ” 。
不要手动的在服务器上添加用户或仓库,gitolite是通过对gitolite-admin这个仓库的操作来进行管理的。
在eclipse 上clone下来服务器端的gitolite-admin.git ,这里颇费了一番周折。
官方要求:
1、客户端的key需要是git的管理员key,即上面的 git_admin 。
2、clone时,git仓库需要写相对路径,相对于repository。
故,最终的路径为: ssh://git@我的ip:端口/gitolite-admin.git 。
我的eclipse已经设置过ssh,并且将git_key导入到ssh配置中,具体参看第一篇文章 “git 安装笔记”,注意这里是git_key 即用户私有key,不是管理员key git_admin。
在eclipse的egit插件中,使用如下设置,点next,最终success。 经过测试 clone 和 pull 正确,具体内容在“git权限管理工具gitolite使用笔记(二)”。
补充一下安装使用过程中出现的问题。
错误一:WARNING: Can't exec "git": Permission denied at /home/git/gitolite/src/lib/Gitolite/Common.pm line 144, <DATA> line 1.
这是由于安装时没有指定 prefix=/usr/local ,导致无法找到命令,解决方案,重新指定;或者增加软连接,但是不建议,因为后续会出现一系列各种奇怪的问题。建议重装,指定 prefix=/usr/local
$ cd /usr/bin $ ln -s /home/server/git/git git