gitolite 是方便通过 Git 与 ssh 架设中央服务器的软件。
首先看看github上对gitolite的介绍
它的具体安装方法和用法都在github上README.txt里有详细介绍(这也是我刚开始觉得简单的原因)。那我们看一看它的基础文档:(为了方便,在此是翻译后的文档),本篇主要关注安装部署和基本用法
- 安装和部署
- 添加新用户或代码库
安装和部署
服务器环境
- 任意UNIX操作系统
- SH
- git 1.6.6+
- perl 5.8.8+
- openssh 5.0+
- 一个独立的用户(本文中假定该用户名为git), 仅在shell中被其他用户的'su git'命令使用
安装步骤
- 登录系统, 打开shell, 并切换到git(即前面提到的独立用户, 译者注)用户
- 确保~/.ssh/authorized_keys文件不存在或为空文件. (gitolite使用此文件保存公钥文件)
- 确保您的公钥文件已经准备好, 如: ~/YourName.pub (创建公钥文件的方法: ssh-keygen -t rsa -f ~/.ssh/YourName, 其中YourName为一个对您来说有意义的名字, 译者注)
- 执行以下命令:如果最后一行命令出错的话, 可能是因为'bin'目录不在你的PATH中, 您可以选择将bin加入或直接执行:
1
git clone git:
/
/
github.com
/
sitaramc
/
gitolite
2
mkdir
-
p $HOME
/
bin
3
gitolite
/
install
-
to $HOME
/
bin
4
gitolite setup
-
pk YourName.pub
1
$HOME
/
bin
/
gitolite setup
-
pk YourName.pub
添加新用户或代码库
1 | git clone git@host :gitolite - admin |
1 | repo foo |
2 |
RW + = alice |
3 |
RW = bob |
4 |
R = carol |
1 | git add conf |
2 | git add keydir |
3 | git commit -m 'added foo, gave access to alice, bob, carol' |
4 | git push |
一定要注意这里面提到的安装的准备条件的第三步(确保公钥文件已经准备好),我因为对这个的理解有误,造成了我很多的麻烦:
先谈谈正确的做法,把你作为管理员的公钥文件上传到git服务器上(注意名字,否则生成的配置文件会读错你本地的用户名,但实际上只要你通过了本地ssh到git服务器的认证,便不妨碍管理员进行管理)
1 | git clone git: / / github.com / sitaramc / gitolite |
2 | mkdir - p $HOME / bin |
3 | gitolite / install - to $HOME / bin |
4 | gitolite setup - pk YourName.pu |
git clone git@host:
gitolite
-
admin
进行管理了。
以上是正确的方法设置,你的push及客户端clone均不受限制,可谓风雨无阻。
下面聊聊我出现的毛病啊,真是整死我了:
我准备的公钥文件是git服务器上git用户的公钥(真不知道当时怎么想的),然后做了和大家一样的操作,然后我在本地clone的时候必须跟上gitolite-admin的路径才能clone下来,不但如此啊,我在配置文件里新建的库,clone的时候也必须是完整的路径,并且当我的客户端有修改要更新,push不上去,一直在报各种各样的错,各种百度谷歌啊,主要有句提示是remote: Empty compile time value given to use lib at hooks/update line 6
相关信息有:
Empty compile time value given to use lib at hooks/update line 6
-
(followed by
Can't locate Gitolite/Hooks/Update.pm in @INC
a couple of lines later).You're bypassing gitolite. You cloned the repo using the full path (i.e., including therepositories/
prefix), either directly on the server, or via ssh but with a key that gives you shell access.Solution: same as for the previous bullet.NOTE: If you really must do it, and this is a one-time thing, you can trygitolite push
instead ofgit push
. BUT... this defeats all gitolite access control, so if you're going to do this often, maybe you don't need gitolite!
如此看来需要在有gitolite的环境里执行gitolite push才能完成push的动作;
虽然这样也可以对git库进行管理,但是中间却增添了诸多的麻烦步骤,实在是有违人道,因为这个弱智的错误导致我用了一晚上的时间才搞出来,希望大家引以为戒。。。