运行环境

操作系统:CentOS 7.4 64bit

git:1.8.3.1

gitolite:3.6.10

需求说明

git原生不支持权限管理,gitolite可实现git的权限管理

Control access to many git repositories:
read access controlled at the repo level,
and write access controlled at the branch/tag/file/directory level, including who can rewind, create, and delete branches/tags.

办公室有两台服务器,安装git服务,用于研发产物的版本管理,为保证数据安全,安装gitolite,配置双机镜像。

配置过程

安装gitolite

在服务器上新建 git 用户,在两台服务器上安装 gitolite。

git clone git://github.com/sitaramc/gitolite
mkdir -p ~/bin
gitolite/install -to $HOME/bin

安装过程中出现异常信息:

Can't locate Data/Dumper.pm in @INC (@INC contains: /work/git/gitolite/src/lib /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /work/git/gitolite/src/lib/Gitolite/Common.pm line 67.
BEGIN failed--compilation aborted at /work/git/gitolite/src/lib/Gitolite/Common.pm line 67.
Compilation failed in require at gitolite/install line 15.
BEGIN failed--compilation aborted at gitolite/install line 15.

安装 perl 包后,再次执行 gitolite/install -to $HOME/bin

yum install 'perl(Data::Dumper)'

为管理员授权

~/bin/gitolite setup -pk admin.pub

admin.pub为gitolite管理员计算机的公钥

在gitolite管理员计算机上执行

git clone git@host:gitolite-admin

check 出来 gitolite-admin 库,在 conf 配置库访问权限,keydir 保存使用者公钥,commit 并 push 到服务端即可生效。

镜像配置

设置服务器别名

服务器 server1,别名为 git1,修改 ~/.gitolite.rc 文件

# the Mirroring feature needs this
HOSTNAME => "git1",

服务器 server2,别名为 git2,修改 ~/.gitolite.rc 文件

# the Mirroring feature needs this
HOSTNAME => "git2",

生成密钥对

服务器 server1

ssh-keygen
cd .ssh/
cp id_rsa.pub server-git1.pub

服务器 server2

ssh-keygen
cd .ssh/
cp id_rsa.pub server-git2.pub

将 server-git1.pub 和 server-git2.pub 推送到两个 gitolite-admin 中。

配置 ssh 连接

在服务器上,为访问其他服务器,设置 ssh 连接

服务器 server1

新建文件 ~/.ssh/config

host git2
user git
hostname git2.xxx.com
port 22
identityfile ~/.ssh/id_rsa

服务器 server2

新建文件 ~/.ssh/config

host git1
user git
hostname git1.xxx.com
port 22
identityfile ~/.ssh/id_rsa

将文件的权限设置为 644

chmod 644 ~/.ssh/config

否则会有错误信息:

Bad owner or permissions on /work/git/.ssh/config

在服务器 server1 上 访问服务器 server2

ssh git2 info

第一次访问后,需要手动输入 yes 确认

结果返回如下信息,才算正常,再执行后面的步骤

hello server-git2, ...

在服务器 server2 上 访问服务器 server1,同理

同步配置

修改两台服务器的 ~/.gitolite.rc 文件

................
# Uncomment or add new commands here.
# 'create',
# 'fork',
'mirror',
# 'readme',
# 'sskm',
# 'D',

.................
# enable mirroring (don't forget to set the HOSTNAME too!)
'Mirroring',

修改两台服务器的 gitolite 配置文件,增加下列配置:

repo @all
option mirror.master = git1
option mirror.slaves = git2

上述配置,对于所有库,均配置为 git1 为源,git2 为镜像。

配置后,git2 服务器不再接受 git push,而所有推送到 git1 的请求,将会自动同步至 git2 服务器。

参考资料

mirroring using gitolite