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 服务端和授权管理终端待建过程。