(注:官网:https://github.com/sitaramc/gitolite 有时间再重新梳理本文)
准备
一台服务器 - Linux(最好是 Ubuntu 最新版本,比如现在的 Ubuntu 14.04 LTS)
一台个人机 - Unix 内核的都可以(我的是 OS X 10.10.4)
*注:如果不好去服务器旁边操作的话,从个人电脑上ssh到服务器上去也可以的。
*又注:想要 ssh 到服务器,当然前提是服务器上装有 ssh 服务啦!如果没有的话,怎么着也得想招在服务器上 sudo apt-get install openssh-server 一下。
*再注:如果是ssh到服务器上的话,一般都会有缓存在捣乱的。举个栗子,你刚刚 sudo apt-get install git 了一下,然后你会发现,git 怎么也 tab 不出来。不要着急,exit 出来,再重新 ssh 上就可以了。(有没有不用 exit 出来的解决方案啊,谁知道谁知道~)
Action!
[服务器 - 默认用户]
1. 安装 git
sudo apt-get install git
2. 创建 git 用户
su -
(是不是按 tab 没有提示很蛋疼呢?目测当前 shell 是sh,可以 bash 一下换成 bash 来继续操作哦。或者可以修改默认 shell,请自行 google。)
[服务器 - root 用户]
useradd -m git
passwd git
3. 安装 gitolite
退出 root 用户:
exit
进入 git 用户:
su git
(如果是 ssh 到服务器上的,这时候你会发现,你 su 不到 git 上。还是因为缓存问题,只能退了重新 ssh 过来。ssh 缓存问题以下不再赘述。)
[服务器 - git 用户]
cd ~
递归创建目录:
mkdir -p ~/bin/gitolite/share/gitolite/conf/ ~/bin/gitolite/share/gitolite/hooks/
从 GitHub 上下载官方 Gitolite:
git clone git://github.com/ossxp-com/gitolite.git
cd ~/gitolite/src/
执行:
./gl-system-install ~/bin/gitolite ~/bin/gitolite/share/gitolite/conf/ ~/bin/gitolite/share/gitolite/hooks/
然后会看到提示:
修改配置:
vim ~/bin/gitolite/gl-setup
找到:
GL_PACKAGE_CONF=/usr/share/gitolite/conf
改为:
GL_PACKAGE_CONF=/home/git/bin/gitolite/share/gitolite/conf/
添加系统变量:
echo "PATH=/home/git/bin/gitolite:$PATH" >> ~/.bashrc
重新加载使之生效:
source ~/.bashrc
[客户端 - 默认用户]
cd ~
生成 ssh 密匙:
ssh-keygen -t rsa
把生成的 ssh 公匙传到服务器端:
scp ~/.ssh/id_rsa.pub git@<ip address>:~/tmp/
[服务器 - git 用户]
cd /tmp
将刚传过来的公匙文件名修改成规范化的名字:
mv id_rsa.pub <name>.pub
(如果你的 git 仓库实际位置不在 ~/repositories/ 下,那么你需要将你的仓库实际位置做个软链到 ~/repositories。比如我的仓库位置是 /opt/git/:
ln -s /opt/git ~/repositories
)
将该公匙添加到 Gitolite:
cd ~/bin/gitolite/
./gl-setup /tmp/<name>.pub
敲回车键,进行编辑自动打开的 .gitolite.rc 文件
找到:
$GL_PACKAGE_HOOKS = "/usr/share/gitolite/hooks";
改为:
$GL_PACKAGE_HOOKS = "/home/git/bin/gitolite/share/gitolite/hooks";
保存退出后会继续自动执行
==============自此,Gitolite 安装完成==============
4. 权限管理
[客户端 - 默认用户]
找一个合适的目录来存放 git 权限管理的项目(后面的 .git 可省略):
git clone git@<ip address>:gitolite-admin[.git]
现在让我们测试一下权限管理有没有安装好
我们可以 clone 一份 Gitolite 自带的一个代码仓库进行测试:
git clone git@<ip_address>:testing[.git]
然后发现 clone 下来了,而且还有这个提示:
提示是说,你 clone 的项目是空的。
我们 cd 进这个 testing 项目:
cd testing
在里面随便改点什么,比如创建个文件什么的:
vim abc
随便写点什么,保存退出。
将所有新增修改文件添加到HEAD缓存区:
git add .
将所有修改提交到本地缓存:
git commit -m "add file"
将所有提交的版本 push 到服务器:
git push
然后 push 成功
现在让我们修改一下权限:
进入刚刚 clone 下来的 gitolite-admin:
cd gitolite-admin
编辑权限配置文件:
vim conf/gitolite.conf
我将 testing 项目配成我只读:
然后也同样 push 到服务器上(意味着权限将会更改):
git add .
git commit -m "changed"
git push
push 成功后,我们回过头进刚刚 clone 下来的testing 项目
我们 pull 一下:
git pull
理论上没人动过 testing 的话,会显示:
Already up-tp-date.
说明 pull 功能正常。
我们再修改一下刚刚创建的 abc 文件,随便加点什么,然后 add、commit、再 push 到服务器不再赘述。
push 后,会发现:
push 不过去。这说明修改的“只读权限”生效了。
我们看一下连只读权限都不给的情况会怎样。
回到 gitolite-admin:
vim conf/gitolite.conf
repo testing
# 下面什么权限都不给
保存、退出、add、commit、push 到服务器,使权限生效。
我们再回 testing 项目里,pull 一下:
git pull
pull 没有成功,说明没有权限的时候,连 pull 都不会生效。
如果有心情的童鞋,可以重新 clone 一下这个 testing,你会发现,clone 不下来。
The End.
建议看下:
https://www.bootcss.com/p/git-guide/
https://www.ruanyifeng.com/blog/2014/06/git_remote.html
顺带一提:各位还在搜 gitosis 的童鞋,放弃吧,gitosis 的作者已经从 09 年开始就放弃对 gitosis 进行维护了。