gitosis上手指南

此文章要求你会一些git的基本知识,并且有需求自己搭建一个基于gitosis的git服务器 
如果你不需要复杂的权限管理,可以按照此教程搭建git服务器:搭建Git服务器,也强烈建议阅读此文后再继续浏览下文

简介
Gitosis 是一套用来实现对Git仓库用户权限管理的脚本。是为了解决用户规模增长带来的Git管理复杂度上涨的痛点而实现的。它的实现是通过一个特殊的Git仓库来实现的,管理员只需要在此Git仓库中进行相应配置,再推送到服务器上,Gitosis就会相应的修改运行策略。

环境说明
git服务器:Ubuntu16.04 
git客户端:一般windows即可

生成ssh密钥
先要在客户端(即要使用git的环境,本次案例是在windows中)生成相应的公钥私钥,公钥将来会发给git服务器,用来进行验证 
1.在windows上安装git,下载地址: http://git-scm.com/download/win 或 http://git-scm.com/download/win 
2.右击空白处打开git-bash,输入ssh-genkey -C ‘邮箱’ 
参数说明:

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
1
2
3
4
5
6
7
8
9
10
总结:当你创建ssh的时候:-t 表示密钥的类型 ,-b表示密钥的长度,-C 用于识别这个密钥的注释 ,这个注释你可以输入任何内容,很多网站和软件用这个注释作为密钥的名字,有些应用也会使用这个注释作为用户标注,此时对此注释格式会有要求(gitosis配置时要求不能以数字开头) 
在windows系统中,默认生成的密钥地址为:C:\Users\用户名\.ssh\ 目录下。

Git服务端配置
安装git
sudo apt-get update
sudo apt-get install git
1
2
创建git用户,来运行git服务
sudo adduser git
1
安装gitosis 
gitosis依赖于某些python工具库,所以先安装python工具库
sudo apt-get install python-setuptools
1
然后下载gitosis

cd ~
git clone https://github.com/tv42/gitosis.git
cd gitosis
1
2
3
安装gitsois,这里我的python版本是2.7

sudo python setup.py install
1
上传管理员公钥到服务器,例如上传到/tmp/id_rsa.pub
初始化gitosis并添加管理员
sudo -H -u git gitosis-init < /tmp/id_rsa.pub
1
在初始化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: '[email protected]'
1
2
3
4
5
6
7
8
9
10
11
12
原因可能是gitosis不接受username中包含这种数字开头的字符串 
回想生成公钥的过程, [email protected] 是我在参数设置中添加的注释,理论上注释是可以为任意值的,所以我们修改为纯字符,如’test’,然后重新生成一对公钥和私钥,然后上传公钥进行同样的操作,即可成功。

需要手工对该仓库中的 post-update 脚本加上可执行权限(我在实际中发现,权限已经是755了,这样的话可以跳过这一步)
sudo chmod 755 /home/git/gitosis-admin.git/hooks/post-update
1
将gitosis-admin这个特殊的Git仓库克隆到本地中 
在windows中选择一个目录作为gitosis-admin目录,右击打开git-bash,将这个仓库克隆到本地
git clone git@GITSERVER:gitosis-admin.git
1
其中 GITSERVER为你的服务器IP地址。不需要输入绝对路径,gitosis会自动帮助我们定位仓库基准地址。 
这会得到一个名为 gitosis-admin 的工作目录,目录下包括:

.git/
keydir/         用户公钥目录
gitosis.conf    gitosis配置,用来设置用户、仓库和权限的控制文件
1
2
3
这一步可能遇到如下报错

扫描二维码关注公众号,回复: 5395914 查看本文章

    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.
1
2
3
4
5
原因是有的同学按照其他的教程,为了安全性将git用户使用的shell由/bin/bash改为了/usr/bin/git-shell。在gitosis中,需要的功能(例如clone、push)仅仅使用git-shell是不够的,所以需要将shell改为/bin/bash

如此就gitosis就安装配置成功了

使用说明
添加新用户 
- 将用户的公钥文件 keydir/USER.pub 
- 添加他们的项目权限到gitosis.conf文件中

用户权限配置 
gitosis.conf中分为三个对象:组、仓库、用户 
组中的用户可以按照固定的读写规则访问组中的仓库

例如我们要给仓库project1配置两个组,一个可以读写,一个只读 
用户test1,test2可以读写,test3只可以读,可以配置如下

[group project_all]
members = test1 test2
writable = project1

[group project-_ro]
members = test3
readonly = project1
1
2
3
4
5
6
7
如何创建一个项目 
使用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
1
2
3
4
5
6
番外篇
禁用git用户的shell登录权限

cat /etc/passwd
1
找到git那一行,将

git:x:1000:1000:,,,:/home/git:/bin/bash
1
改为

git:x:1000:1000:,,,:/home/git:/usr/bin/git-shell
1
这样,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
1
配置用户信息 
当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。 这样做很重要,因为每一个 Git 的提交都会使用这些信息,并且它会写入到你的每一次提交中,不可更改:

git config --global user.name "somehow"
git config --global user.email '[email protected]'
1
2
可以使用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
--------------------- 
作者:somehow1002 
来源:CSDN 
原文:https://blog.csdn.net/somehow1002/article/details/81427508 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/u013408061/article/details/87695653