gitolite – 搭建授权管理

平时在github上创建仓库、推拉代码、创建 Pull/Merge Request、发起 Issue 。
如果是本地代码 git 只能跟踪的代码信息,无法完成如上操作。本文介绍利用 gitolite 搭建本地git存档信息平台,可以实现类似功能。


提示:此文章仅为搭建gitolite,下一篇为 gitote 托管 Android 代码仓库repo。


文章目录

  • gitolite -- 搭建授权管理
  • Gitolite 实现目标
  • 1. 创建gitolite 管理用户
  • 2. 安装 gitolite
  • 2.1 gitolite 管理服务端
  • 2.2 gitolite 管理客户端
  • `Tips 同步代码异常`
  • 总结



Gitolite 实现目标

a) 搭建本地git 或 repo 仓库,拉去云仓,管理本地代码
b) 用最小的配置完成安全的权限管理;管控连接代码仓授权密钥
c) 用户密钥一对一,根据分配用户在各个代码仓不同权限


1. 创建gitolite 管理用户

如果使用当前用户可以跳过此步骤;如果新建用户的话,建议用户为 git,方便代码维护下载。此前因新未新建用户,搭建完成后使用 URL git@IP/xxx.git 始终无法同步代码,原因为ssh 连接用户并非 gitolite 管理用户名。

sudo useradd git

如果分配空间指定目录 给用户 git, 例如 /build 目录

sudo useradd -d /build -m -s /bin/bash git

设置用户密码,并切换用户

sudo passwd
su - git

2. 安装 gitolite

2.1 gitolite 管理服务端

安装ssh git keychain (私钥管理工具)

sudo apt-get install openssh-server git keychain

克隆gitolite安装包

cd ~
git clone git://github.com/sitaramc/gitolite

创建安装bin目录 并安装gitolite

mkdir -p ~/bin
./gitolite/install -to ~/bin

用户下重新生成一个密钥,生成密钥用作 gitolite 服务端管理员密钥

ssh-keygen -t rsa -f ~/.ssh/git

设置刚生成密钥为管理员密钥。如果使用公钥路径为~/.ssh/git.pub,如果使用私钥 ~/.ssh/git

~/bin/gitolite setup -pk ~/.ssh/git.pub
已初始化空的 Git 仓库于 /home/git/repositories/gitolite-admin.git/
已初始化空的 Git 仓库于 /home/git/repositories/testing.git/

此时gitolite 配置成功。此时用户目录生成projects.list(项目列表) repositories(代码仓库)。如果出现如下错误,说明你在使用和登录用的同一个key。

WARNING: keydir/git_key.pub duplicates a non-gitolite key, sshd will ignore it

a) 前面的设置一般情况下是通过ssh连接到服务器,故需要用户名(即git)和 key(通过ssh-keygen 命令生成),因为此key可直接登录服务器,不适合做git管理员。
b) ~/.ssh/authorized_keys 中,git授权的格式和ssh授权的格式不同,做了扩展,无法通用。
想回退上面的命令发现失效,按照文档说的去做(文档写的是直接重新执行,就会覆盖)也是失效的,删掉gitolite,重新操作一遍。
主要的配置在 $HOME/.gitolite 和 $HOME/.gitolite.rc 连同repositories 需要一并删掉,否则还是会出现上面的错误。

此时查看 .ssh/authorized_keys 授权文件。

$ cat /home/git/.ssh/authorized_keys
ssh-rsa ************************************** git@namenode
# gitolite start
command="/home/git/gitolite/src/gitolite-shell git_admin",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa ***************************** git@namenode
# gitolite end

2.2 gitolite 管理客户端

客户端的key需要是git的管理员key,即上面的 git.pub。
clone时git仓库需要写相对于repository的相对路径。格式为 ssh://userName@IP:port/gitolite-admin.git。
以本机用户(git)获取管理终端为例

cd ~
git clone git@127.0.0.1:gitolite-admin.git

以testing仓库为例添加新 用户user。repo testing 用户被授权的代码仓,R为权限,W为写权限。
修改conf/gitolite.conf 文件,添加 user用户仓库读写权限。

diff --git a/conf/gitolite.conf b/conf/gitolite.conf
index ae1dc08..96517a3 100644
--- a/conf/gitolite.conf
+++ b/conf/gitolite.conf
@@ -1,2 +1,8 @@
repo xxx
-    RW+     =   git
+    RW+     =   git user

将用户密钥(user.pub)拷贝到 gitolite-admin/conf/,提交时需要一并提交。
修改提交到远程分支后,需等待gitolite遍历完成方可生效。

Tips 同步代码异常

首次使用密钥未验证无法同步

The authenticity of host '192.168.33.22 (192.168.33.22)' can't be established.
ECDSA key fingerprint is SHA256:Hp2H8uiwD1LAcFECVy/T94KwxZ6rsasrj+k5hwtmDWk.
Are you sure you want to continue connecting (yes/no)?
ssh -Tvv git@localhost #(localhost 为 repository 服务器 ip)

未配置 git 信息导致无法同步

Traceback (most recent call last):
  File "/home/pps/.repo/repo/main.py", line 531, in <module>
    _Main(sys.argv[1:])
  File "/home/pps/.repo/repo/main.py", line 507, in _Main
    result = repo._Run(argv) or 0
  File "/home/pps/.repo/repo/main.py", line 180, in _Run
    result = cmd.Execute(copts, cargs)
  File "/home/pps/.repo/repo/subcmds/init.py", line 404, in Execute
    self._ConfigureUser()
  File "/home/pps/.repo/repo/subcmds/init.py", line 298, in _ConfigureUser
    name  = self._Prompt('Your Name', mp.UserName)
  File "/home/pps/.repo/repo/project.py", line 784, in UserName
    self._LoadUserIdentity()
  File "/home/pps/.repo/repo/project.py", line 797, in _LoadUserIdentity
    u = self.bare_git.var('GIT_COMMITTER_IDENT')
  File "/home/pps/.repo/repo/project.py", line 2747, in runner
    (self._project.name, name, p.stderr))
error.GitError: manifests var: 
*** 请告诉我你是谁。

运行

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

来设置您账号的缺省身份标识。
如果仅在本仓库设置身份标识,则省略 --global 参数。

按照 log 提示配置 email 和 name 即可。

总结

以上为 gitolite 服务端和授权管理终端待建过程。