此文章要求你会一些git的基本知识,并且有需求自己搭建一个基于gitosis的git服务器
如果你不需要复杂的权限管理,可以按照此教程搭建git服务器:搭建Git服务器,也强烈建议阅读此文后再继续浏览下文
Gitosis 是一套用来实现对Git仓库用户权限管理的脚本。是为了解决用户规模增长带来的Git管理复杂度上涨的痛点而实现的。它的实现是通过一个特殊的Git仓库来实现的,管理员只需要在此Git仓库中进行相应配置,再推送到服务器上,Gitosis就会相应的修改运行策略。
git服务器:Ubuntu16.04
git客户端:一般windows即可
先要在客户端(即要使用git的环境,本次案例是在windows中)生成相应的公钥私钥,公钥将来会发给git服务器,用来进行验证
ssh-keygen -t rsa -b 4096 -C "邮箱"
-t rsa:t是type的缩写
-t即指定密钥的类型,密钥的类型有两种,一种是RSA,一种是DSA:
RSA:RSA加密算法是一种非对称加密算法,是由三个麻省理工的牛人弄出来的,RSA是他们三个人姓的开头首字母组合。
DSA:Digital Signature Algorithm (DSA)是Schnorr和ElGamal签名算法的变种。
为了让两个linux机器之间使用ssh不需要用户名和密码。所以采用了数字签名RSA或者DSA来完成这个操作。ssh-keygen默认使用rsa密钥,所以不加-t rsa也行,如果你想生成dsa密钥,就需要加参数-t dsa。
-b 4096:b是bit的缩写
-b 指定密钥长度。对于RSA密钥,最小要求768位,默认是2048位。命令中的4096指的是RSA密钥长度为4096位。
-C "邮箱":C是comment的缩写
-C表示要提供一个新注释,用于识别这个密钥,所以“”里面**不一定非要填邮箱**,可以是任何内容,邮箱仅仅是识别用的key
总结:当你创建ssh的时候:-t 表示密钥的类型 ,-b表示密钥的长度,-C 用于识别这个密钥的注释 ,这个注释你可以输入任何内容,很多网站和软件用这个注释作为密钥的名字,有些应用也会使用这个注释作为用户标注,此时对此注释格式会有要求(gitosis配置时要求不能以数字开头)
在windows系统中,默认生成的密钥地址为:C:\Users\用户名\.ssh\ 目录下。
sudo apt-get update
sudo apt-get install git
sudo adduser git
sudo apt-get install python-setuptools
然后下载gitosis
cd ~
git clone https://github.com/tv42/gitosis.git
cd gitosis
安装gitsois,这里我的python版本是2.7
sudo python setup.py install
sudo -H -u git gitosis-init < /tmp/id_rsa.pub
在初始化gitosis的过程中可能户遇到如下问题:
Traceback (most recent call last):
File "/usr/local/bin/gitosis-init", line 9, in <module>
load_entry_point('gitosis==0.2', 'console_scripts', 'gitosis-init')()
File "/usr/local/lib/python2.7/dist-packages/gitosis-0.2-py2.7.egg/gitosis/app.py", line 24, in run
return app.main()
File "/usr/local/lib/python2.7/dist-packages/gitosis-0.2-py2.7.egg/gitosis/app.py", line 38, in main
self.handle_args(parser, cfg, options, args)
File "/usr/local/lib/python2.7/dist-packages/gitosis-0.2-py2.7.egg/gitosis/init.py", line 126, in handle_args
user = ssh_extract_user(pubkey)
File "/usr/local/lib/python2.7/dist-packages/gitosis-0.2-py2.7.egg/gitosis/init.py", line 39, in ssh_extract_user
raise InsecureSSHKeyUsername(repr(user))
gitosis.init.InsecureSSHKeyUsername: Username contains not allowed characters: 'test@4587821.com'
原因可能是gitosis不接受username中包含这种数字开头的字符串
回想生成公钥的过程, test@4587821.com 是我在参数设置中添加的注释,理论上注释是可以为任意值的,所以我们修改为纯字符,如’test’,然后重新生成一对公钥和私钥,然后上传公钥进行同样的操作,即可成功。
sudo chmod 755 /home/git/gitosis-admin.git/hooks/post-update
git clone git@GITSERVER:gitosis-admin.git
其中 GITSERVER为你的服务器IP地址。不需要输入绝对路径,gitosis会自动帮助我们定位仓库基准地址。
这会得到一个名为 gitosis-admin 的工作目录,目录下包括:
.git/
keydir/ 用户公钥目录
gitosis.conf gitosis配置,用来设置用户、仓库和权限的控制文件
这一步可能遇到如下报错
fatal: unrecognized command 'gitosis-serve test'
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
原因是有的同学按照其他的教程,为了安全性将git用户使用的shell由/bin/bash改为了/usr/bin/git-shell。在gitosis中,需要的功能(例如clone、push)仅仅使用git-shell是不够的,所以需要将shell改为/bin/bash
如此就gitosis就安装配置成功了
添加新用户
用户权限配置
gitosis.conf中分为三个对象:组、仓库、用户
组中的用户可以按照固定的读写规则访问组中的仓库
例如我们要给仓库project1配置两个组,一个可以读写,一个只读
用户test1,test2可以读写,test3只可以读,可以配置如下
[group project_all]
members = test1 test2
writable = project1
[group project_ro]
members = test3
readonly = project1
如何创建一个项目
使用gitosis后,创建仓库时就不用事先到服务器上手工创建该项目的裸仓库了- Gitosis 会在第一次遇到推送时自动创建
具体来说,一次创建过程如下
mkdir myproject
cd mypyroject
git init
git remote add origin git@GITSERVER:myproject.git
# do some work, git add and commit files
git push origin master:refs/heads/master
###番外篇
禁用git用户的shell登录权限
cat /etc/passwd
找到git那一行,将
git:x:1000:1000:,,,:/home/git:/bin/bash
改为
git:x:1000:1000:,,,:/home/git:/usr/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。
但是,这样的话就无法正常使用gitosis了,所以一般不建议修改git用户的默认shell
初始化Git仓库
选定一个目录作为git仓库地址,例如:/home/git/reposities/sample.git 然后初始化
sudo git init --bare /home/git/reposities/sample.git
配置用户信息
当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。 这样做很重要,因为每一个 Git 的提交都会使用这些信息,并且它会写入到你的每一次提交中,不可更改:
git config --global user.name "somehow"
git config --global user.email '2534872584@qq.com'
可以使用git config --list来检查配置信息
参考文档:
https://git-scm.com/book/zh/v1/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-Gitosis
https://github.com/tv42/gitosis.git