欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

gitosis上手指南

程序员文章站 2022-03-30 16:37:42
...

此文章要求你会一些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/winhttp://git-scm.com/download/win
2.右击空白处打开git-bash,输入ssh-genkey -C ‘邮箱’
参数说明:

ssh-****** -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-******默认使用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\ 目录下。

Git服务端配置

  • 安装git
sudo apt-get update
sudo apt-get install git
  • 创建git用户,来运行git服务
sudo adduser git
  • 安装gitosis
    gitosis依赖于某些python工具库,所以先安装python工具库
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
  • 上传管理员公钥到服务器,例如上传到/tmp/id_rsa.pub
  • 初始化gitosis并添加管理员
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: '[email protected]'

原因可能是gitosis不接受username中包含这种数字开头的字符串
回想生成公钥的过程, [email protected] 是我在参数设置中添加的注释,理论上注释是可以为任意值的,所以我们修改为纯字符,如’test’,然后重新生成一对公钥和私钥,然后上传公钥进行同样的操作,即可成功。

  • 需要手工对该仓库中的 post-update 脚本加上可执行权限(我在实际中发现,权限已经是755了,这样的话可以跳过这一步)
sudo chmod 755 /home/git/gitosis-admin.git/hooks/post-update
  • 将gitosis-admin这个特殊的Git仓库克隆到本地中
    在windows中选择一个目录作为gitosis-admin目录,右击打开git-bash,将这个仓库克隆到本地
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就安装配置成功了

使用说明

添加新用户
- 将用户的公钥文件 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

如何创建一个项目
使用gitosis后,创建仓库时就不用事先到服务器上手工创建该项目的裸仓库了- Gitosis 会在第一次遇到推送时自动创建
具体来说,一次创建过程如下

mkdir myproject
cd mypyroject
git init
git remote add origin [email protected]: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 '[email protected]'

可以使用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