gitolite 的原理
Feb. 2, 2023
gitolite 的原理。它提供了一个 gitolite-shell。当你使用 ssh 访问 gitolite 时 ssh 服务会启动 gitolite-shell。这个脚本会检查当前用户是否有权限访问对应的仓库。如果用户通过 git push 修改了仓库内容,则会触发 gitolite 预先配置 git hook,这些 hook 会执行创建仓库、添加用户之类的操作。
gitolite 的本质是几个 prel 脚本加一些纯文本配置文件,没有什么魔法。
简单说一下 gitolite 的安装与使用。
先安装好 git 和 openssh,再创建一个 git 系统用户:
-m 表示创建对应的 /home/git 目录
$ userad -m git 把你的 ssh 公钥保存成 yourname.pub 备用。你可以把这个 yourname 改成你喜欢的名字。
这个时候,基础准备工作就完成了,开始安装:
$ su - git $ git clone https://github.com/sitaramc/gitolite $ ./gitolite/src/gitolite setup -pk /tmp/yourname.pub Initialized empty Git repository in /home/git/repositories/gitolite-admin.git/ Initialized empty Git repository in /home/git/repositories/testing.git/ WARNING: /home/git/.ssh missing; creating a new one (this is normal on a brand new install) WARNING: /home/git/.ssh/authorized_keys missing; creating a new one (this is normal on a brand new install) 这里的 -pk 选项是指定管理员的公钥和用户名。git 跟 gitolite 服务器通信用的是 git 这个真正的系统用户,而 gitolite 控制仓库权限则是使用自己的虚拟用户。这里的 yourname 就是虚拟用户。
好了,到此安装完毕。让我们来体验一下。gitolite 默认为大家创建了一个开放的 testing 仓库。
$ git clone git@yourhost:testing.git Cloning into 'testing'... warning: You appear to have cloned an empty repository. 如果你想克隆一个不存在的仓库,则会报错:
$ git clone git@yourhost:foo.git Cloning into 'foo'... FATAL: R any foo yourname DENIED by fallthru (or you mis-spelled the reponame) fatal: Could not read from remote repository.
Please make sure you have the correct access rights and the repository exists. 那怎样添加新仓库呢?这就得用到 gitolite-admin 这个特殊的仓库了,先克隆下来,其目录结构如下:
tree . . ├── conf │ └── gitolite.conf └── keydir └── yourname.pub
2 directories, 2 files
keydir 保存用户的公钥,一个用户对应一个文件。conf/gitolite.conf 保存用户权限。
$ cat conf/gitolite.conf repo gitolite-admin RW+ = yourname
repo testing RW+ = @all 这里配置了两个仓库,gitolite-admin 仓库只有 yourname 用户可以读写。testing 仓库的读写权限则授予了 @all,不用猜就知道是授予所有人可以读写的意思。
如是想添加一个新仓库,则添加一条 repo 配置就行,比如:
$ cat conf/gitolite.conf repo gitolite-admin RW+ = yourname
repo testing RW+ = @all
repo foo RW+ = @all 改好之后提交并推送到远端,gitolite 就会自动创建 foo 仓库。
$ git push Enumerating objects: 7, done. Counting objects: 100% (7/7), done. Delta compression using up to 4 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (4/4), 378 bytes | 378.00 KiB/s, done. Total 4 (delta 0), reused 0 (delta 0) remote: Initialized empty Git repository in /home/git/repositories/foo.git/ To 192.168.56.101:gitolite-admin.git c8a8aa8..d36e1a1 master -> master 显然,gitolite 是利用 git 的 hook 机制自动创建 foo 仓库的。
加人就更简单。如果要添加的用户名是 hello,则只需将将 hello 的公钥保存到 keydir/hello.pub 并推到远端就可以了。就个是候你打开服务端的 /home/git/.ssh/authorized_keys 会发现:
gitolite start
command="/home/git/gitolite/src/gitolite-shell hello",... command="/home/git/gitolite/src/gitolite-shell yourname",...
gitolite end
hello 的用户名已经配置好了。
gitolite 使用 git 来管理 git 的权限,是不是有点自举的意思。
gitolite 还支持仓库分组、用户分组、分支/tag权限控制等高级功能,大家可以移步官方文档,我就不赘述了。
最后总结一下。gitolite 是一个非常轻量级的 git 代码托管方案,只能控制权限,没有 Pull Request/Issue 等功能,有好多大型开源项目在使用。同时,gitolite 也是很好的学习 git 相关知识的平台。