menu Hyou
主页
分类
标签
关于
color_lens

... Rei ...

... cjlmonster@163.com ...

... 白开水与方便面 ...

home
主页
chevron_right
local_library
分类
chevron_right
local_offer
标签
chevron_right
brightness_auto
关于
chevron_right

标签云

Gitosis使用教程

2021-06-17 约 376 字 预计阅读 2 分钟 Git

简述

gitosis 是一个用Python写的git权限管理工具,可以用来管理开发团队,比如为一个项目分配开发人员,即一个仓库的可访问操作人员,或者简单的控制某些用户对某个仓库只有可读权限,即只能查看或拷贝,但不能修改。下面,接着上篇的 自定义git服务器 开始讲。ps: git服务器是 Linux Mint 虚拟机,ip是 192.168.2.178 ​

安装

上一篇我们讲到 配置 git用户免密码登录时,往 .ssh/authorized_keys 这个文件里添加需要参与到项目管理的用户的公钥进来,往后这些用户就可以通过git用户拷贝项目到本地进行开发了,现在我们用 gitosis 来管理用户的公钥,将 .ssh/authorized_keys 文件交给 gitosis 管理。 ​

先把旧的 .ssh/authorized_keys 给删除掉,或备份起来,因为初始化 gitosis 会重新创建 .ssh/authorized_keys 文件

$ sudo mv .ssh/authorized_keys .ssh/authorized_keys.bak

image.png 然后将 git用户的登录shell改回来,即改成/bin/bash,让其具有登录权限

$ sudo usermod -s /bin/bash git
$ cat /etc/passwd

image.png 接着用root用户登录并切换到root家目录,安装 gitosis一定要用 root用户,否则安装失败

$ sudo su -

image.png 拷贝 gitosis 到root用户的家目录下

$ git clone https://github.com/res0nat0r/gitosis

image.png 进入刚刚拷贝的 gitosis 目录里,然后使用 Python 安装 gitosis(注意:一定要进入 gitosis 目录再执行Python安装命令,还有就是一定要使用Python2来执行,不能用Python3,否则安装失败)

$ python2 setup.py install

image.png 拷贝本地的公钥到服务器来,假设拷贝到临时目录/tmp,其中 192.168.2.178为服务器地址

$ scp ~/.ssh/id_rsa.pub git@192.168.2.178:/tmp

image.png 切回 git 用户登录,然后用刚刚上传的公钥初始化 gitosis

#####切换 git用户并回到 git用户家目录#####
$ su - git

#######初始化 gitosis#########
$ gitosis-init < /tmp/id_rsa.pub

image.png 可以看到git家目录里,自动生成了一些文件,其中 repositories 是用来存放仓库的,往后新建的仓库都放这里, .gitosis.conf 文件链接到了管理员仓库 gitosis-admin.git 的 gitosis.conf 配置文件,管理员修改 gitosis.conf 文件后会反映到 .gitosis.conf 文件里 image.png 查看 repositories ,可以看到里面已经有一个仓库 gitosis-admin.git,这个仓库就是gitosis用来管理其它仓库的,刚刚初始化用的 公钥 就是管理员,其可以修改这个仓库,设置用户等权限 image.png 切换回 root 用户,然后查看 gitosis-admin.git 仓库的钩子脚本是否可执行

$ cd gitosis-admin.git/hooks
$ ll

image.png

修改 gitosis-admin.git 仓库的钩子脚本可执行,否则 gitosis 不能完成自动化操作

$ chmod a+x post-update
$ ll

image.png 至此,gitosis 安装并初始化完成,下面说说使用 ​

使用

上面安装完后,在git用户的家目录里生成如下文件:

  • gitosis文件夹
  • repositories:gitosis管理的仓库都保存在这个文件夹里
  • repositories/gitosis-admin.git:gitosis自身的管理仓库
  • .gitosis.conf:这个文件是链接到 gitosis-admin.git 管理库的 gitosis.conf 文件的

image.png image.png 同时,使用上传的公钥初始化后,会自动生成 .ssh/authorized_keys 文件,里面已经自动保存了初始化时用的公钥 image.png 查看 .ssh/authorized_keys 文件 image.png 可以看到,这是 gitosis 自动生成的,不能手动修改,往后上传的其他用户的公钥都会由 gitosis 自动保存到这,即由gitosis管理公钥,接着尝试使用git用户登录

$ ssh git@192.168.2.178

image.png 出现上图提示,说明 gitosis 认出了该用户的身份,但由于没有运行任何 Git 命令所以它切断了连接。 ​

上传公钥到服务器端初始化gitosis的本地电脑,此时被服务器设为gitosis的管理员,有权限读写 gitosis-admin.git 仓库,拷贝 gitosis-admin.git 仓库到本地

$ git clone git@192.168.2.178:gitosis-admin.git

image.png 可以看到, 通过 gitosis 管理的仓库,ssh地址直接用仓库名就可以了,前面不用加 repositories,进入 gitosis-admin,查看

$ cd gitosis-admin
$ ll

image.png 里面有一个配置文件和一个用于存放公钥的文件夹

  • gitosis.conf:gitosis的配置文件,通过修改它,可以控制用户的读写权限
  • keydir:存放用户电脑公钥的文件夹,公钥的命名方式为 username.pub,username用户电脑的别名,每个用户都是唯一的

gitosis管理员通过上传需要参与开发的人员的电脑的公钥到 gitosis-admin/keydir里,然后在 gitosis.conf 文件里配置开发人员对相应仓库的控制权限,修改完后,提交并同步到服务器,就完成了gitosis的一次配置

默认情况下,gitosis初始化后,便会把初始化用的公钥存到 keydir里了 image.png 且会在gitosis.conf里配置好这个公钥对应用户的权限,即对 gitosis-admin.git 有修改权限

$ cat gitosis.conf

image.png 解释 gitosis.conf 配置文件:

  • [group gitosis-admin]:意思是创建一个用户组,格式为[group groupname] ,groupname,组名,如上面设为 gitosis-admin,这里其实就是管理员组了
  • members = Android2@Android2-PC:用户组成员,格式为members = username1 username2 ...,这里设置了一个成员 Android2@Android2-PC,多个成员以空格间隔,成员的名字是对应 keydir 文件夹存放的公钥的名字的,假如公钥存放的名字设为 developer1.pub,则配置文件里,配置成员时,就要用 developer1 这个名字
  • writable = gitosis-admin:用户组管理的仓库和其权限,格式为权限 = 仓库名1 仓库名2 ...这里权限为writable,即对仓库的权限为可读写,gitosis-admin为仓库名,管理多个仓库,仓库名用空格隔开

模拟开发,在服务端用 git用户创建一个新的仓库 sample.git 放到 repositories 里 image.png 假设有三个用户共同开发 sample.git 这个项目,分别是:developer1, developer2和developer3,其中developer1, developer2对仓库有读写权限,developer3只有读取权限,不能修改仓库,条件有限,这里用 ssh-keygen 命令在本机上分别生成这三个用户的公私钥(正式环境下是,三个用户分别对应三台电脑,每台电脑通过 ssh-keygen 命令生成各自的公私钥,然后把公钥发给 gitosis管理员保存和配置项目权限,私钥自己保存) ​

首先在 c盘里新建 keys 文件夹 ,然后在里面新建 developer1, developer2和developer3 三个文件夹,分别保存三个用户的公私钥

$ ssh-keygen -t rsa -C “developer1” -f /c/keys/developer1/id_rsa
$ ssh-keygen -t rsa -C “developer2” -f /c/keys/developer2/id_rsa
$ ssh-keygen -t rsa -C “developer3” -f /c/keys/developer3/id_rsa

上面生成命令一路回车就可以 image.png 然后将各自的公钥复制到 keydir 文件夹里,并分别重新命名为 developer1.pub, developer2.pub和developer3.pub

$ cp /c/keys/developer1/id_rsa.pub developer1.pub
$ cp /c/keys/developer2/id_rsa.pub developer2.pub
$ cp /c/keys/developer3/id_rsa.pub developer3.pub

image.png 接着修改 gitosis.conf 文件

$ vim gitosis.conf

image.png 可以看到,添加了两个用户组,sample-developer 和 sample-custom,其中 sample-developer 为开发者群,可以修改sample仓库,sample-custom 为只读群组,智能拷贝和查看 sample仓库,不能修改,这里我把管理员Android2@Android2-PC也添加进 sample-custom 了,等下用来测试只读权限 ​

最后提交更改并更新到服务器

$ git add -A
$ git commit -m “添加sample项目开发组”
$ git push origin master

image.png 服务器查看 gitosis-admin.git 仓库的提交日志,可以看到提交日志已经有了 image.png 查看 .gitosis.conf 文件,可以看到修改的配置已更新上来了 image.png 查看 .ssh/authorized_keys,可以看到三个开发者的公钥已经保存到这里了 image.png

测试

上面把管理员Android2@Android2-PC添加进 sample-custom 了,这个组对 sample.git 仓库的权限为只读,下面拷贝下来,测试下修改

$ git clone git@192.168.2.178:sample.git

image.png 可以看到是可以拷贝查看的,接着修改看看

$ cd sample
$ echo “test edit” > test.txt
$ git add -A
$ git commit -m “添加文件”
$ git push origin master

image.png 可以看到,在本地上添加修改提交都可以,但更新到服务器时就报错了,提示该仓库没有写的权限

copyright 2021 cjlmonster | 粤ICP备2021067029号 | 粤公网安备 44132302100200号
设置文档主题

主题色

主色

强调色