当前位置: 首页 > 工具软件 > Gitosis > 使用案例 >

gitosis上手指南

苏胤
2023-12-01

此文章要求你会一些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

总结:当你创建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: 'test@4587821.com'

原因可能是gitosis不接受username中包含这种数字开头的字符串
回想生成公钥的过程, test@4587821.com 是我在参数设置中添加的注释,理论上注释是可以为任意值的,所以我们修改为纯字符,如’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 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

 类似资料: