β

利用gitosis使管理服务器端的git更容易

DevFighter 199 阅读
Git

git可以利用四种协议传输数据:文件协议,HTTP/S协议,SSH和Git
文件协议常用在远程库保存在本地磁盘或网络磁盘上的情况,不适于正式使用。
HTTP/S协议对于用户来说更容易直接使用,但服务搭建较麻烦,客户端也需要对认证进行配置。1.6.6以前的版本只支持只读。
SSH协议搭建方便,传输高效,使用普及,可进行提交和更新,使用最多,特别适合公司内部使用。
Git协议由Git自带程序提供,配置即可使用,传输高效,由于缺乏权限管理,一般仅用于只读,通常需设置防火墙。

综合来看,SSH在服务端和客户端的配置都不是很复杂,功能和兼容性又好。
但管理服务器也有一些麻烦:
每次增加用户需要登录服务器配置用户,并且对于大量用户的权限设置不是很灵活。
每次增加新的库也需要登录服务器调用git init命令。
本文介绍的gitosis就是用于简化服务器的管理。

安装gitosis:

su root #切换为root权限
yum install python-setuptools #先安装python-setuptools
cd /tmp && git clone https://github.com/res0nat0r/gitosis.git #下载源码
cd gitosis && python setup.py install #安装

初始化gitosis:

su git #切换用户为git
ssh-keygen -t rsa #创建密钥对
gitosis-init < /home/git/.ssh/id_rsa.pub #初始化

初始化后,会在/home/git/repositories创建gitosis-admin.git项目,后续我们通过这个git项目就可以完成大部分服务器上库的管理工作

chmod u+x /home/git/repositories/gitosis-admin.git/hooks/post-update 
#增加可执行权限,用于后续提交时触发gitosis更新服务器的authorized_keys 文件

配置gitosis:
首先在客户端上生成密钥:
ssh-keygen -t rsa
获取gitosis-admin的库:
git clone git@devfighter:/home/git/repositories/gitosis-admin.git
此时还是需要输入git@devfighter的密码的,devfighter为服务器的Domain或IP
cd gitosis-admin #进入目录进行后续管理
复制公钥:
cp ~/.ssh/id_rsa.pub keydir/username.pub #注意,这里的username需要与后面配置文件中的username对应
vi gitosis.conf #修改配置文件

[gitosis]
[group gitosis-admin]
writable = gitosis-admin
members = git@nbs username

段[gitosis]用于参数设置,例如添加:loglevel=DEBUG 将会在后续更新代码库时显示调试信息
段[group group_name]为一个权限组,group_name可以随意起,能看明白就好
writable = repo_name 表示当前组的成员对库repo_name有写权限(pull & push)
readonly = repo1 repo2表示当前组对库repo1和repo2有只读权限(pull)
members = user1 user2 @group1表示当前组员为user1和user2,并继承组group1的成员。keydir/目录里需要有对应的user1.pub、user2.pub和其它用户公钥文件
可以增加自己的[group _another_]用于其它项目的管理

提交gitosis的新配置
git push #提交前务必保证当前管理机的pub公钥文件对应的用户有gitosis-admin的写权限,否则后续当前用户就无法管理gitosis了,需要登录服务器手动设置

更新本地gitosis库的远端路径为:git@devfighter:gitosis-admin.git
git remote set-url origin git@devfighter:gitosis-admin.git
由于服务器的git管理已由gitosis接管,默认存放路径为~/repositories/下,而笔者测试下来远端路径只能写~/repositories/下的相对路径。

此时测试一下:
git pull #尝试更新gitosis-admin
也许你发现了错误:

1. 继续要求输入密码:说明服务器端未开启授权认证或当前用户授权未生效
未开启授权的话:
vi /etc/ssh/sshd_config #登录服务器,编辑文件,去除下面内容行的#注释

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

重启服务器
个别用户未生效:
检查客户端~/.ssh/id_rsa私钥文件存在(一般存在)
确认对应的公钥文件以user_name.pub的形式加入到keydir里并提交到服务器
(有一个后缀名敲成.PUB导致死活不行,检查好久才发现这个原因,唉。)

2. 报告无读写权限:说明授权认证无效或远端库名称无效
检查公钥对应的用户名在gitosis.conf文件中已配置对远端库repo_name的读/写权限
检查本地的远端路径为git@devfighter:repo_name.git
检查服务器端存在/home/git/repositories/repo_name.git

至此已学会对权限的管理,下面我们看怎么不登录服务器新建库

在gitosis-admin中的gitosis.conf文件中添加新的库new_repo,设置可读写的人后提交
客户端新建库:

mkdir new_repo && cd new_repo && git init
git add . -f && git commit -m "init" #初始提交
git remote add origin git@devfighter:new_repo.git #手动添加远端库
git push --set-upstream origin master 
#提交并设置Track,同时gitosis自动帮我们创建远端库,最终效果与远端创建后本地git clone效果相同

好了,至此我们完成了从客户端新建远端库的操作,其它有权限的人可以直接git clone了

Git
作者:DevFighter
学习,不能停,探索,不能停
原文地址:利用gitosis使管理服务器端的git更容易, 感谢原作者分享。

发表评论