在 Fedora 中用 Gitolite 搭建 GIT 服务器
Gitolite 是一款由 Perl 语言开发的 Git 服务管理工具,通过 SSH 公钥对用户进行认证,并能够通过配置文件对版本库的写操作进行基于分支、标签以及文件路径等的权限控制。 gitweb 为 Gitolite 提供了版本库的 Web 界面,方便用户浏览版本库的变更与版本打包;另一方面,由于 Gitolite 并没有提供匿名用户的读权限,因此,需要借助 git-daemon 来弥补这一缺陷。
1、Gitolite 的安装与配置
$ sudo yum install gitolite
$ cat /etc/passwd | grep -i gitolite gitolite:x:976:971:git repository hosting:/var/lib/gitolite:/bin/sh
$ cp ~/.ssh/id_rsa.pub /tmp/james.pub
$ chmod a+r /tmp/james.pub
$ systemctl status sshd
如果没有运行的话,请执行下述命令行,至于 SSH 端口之类的问题就不做赘述了:
$ sudo systemctl start sshd $ sudo systemctl enable sshd
$ sudo -u gitolite -H gl-setup /tmp/james.pub
$ sudo ls /var/lib/gitolite/repositories gitolite-admin.git testing.git
$ cd $ git clone gitolite@serverIP:gitolite-admin.git $ cd gitolite-admin $ cat conf/gitolite.conf repo gitolite-admin RW+ = james repo testing RW+ = @all
@testings testing james/testing repo @testings
repo james/.+
repo james/.+$
perms [regex ...] = user1 [user2 ...]
@mainstream master developing testing
- -:不能写入、但是可以读取;
- C:仅在通配符版本库中可以使用。用于指定谁可以创建和通配符匹配的版本库。
- R, RW, 和 RW+:R 为只读。RW 为读写权限。RW+ 含义为除了具有读写外,还可以对 rewind 的提交强制 PUSH。
- RWC, RW+C:只有当授权指令中定义了 regex 列表才可以使用该授权指令。其中 C 的含义是允许创建与 regex 匹配的分支、标签、文件名或者路径。
- RWD, RW+D:只有当授权指令中定义了 regex 列表才可以使用该授权指令。其中 D 的含义是允许删除与 regex 匹配的分支、标签、文件名或者路径。
- RWCD, RW+CD:只有当授权指令中定义了 regex 列表才可以使用该授权指令。
@myteam james alice
@admin james @myteam james alice @test alice @testings james/testing alice/testing @mainstream master developing repo james/.+$ C = @admin R @mainstream = @test - = bob RW = @myteam bob repo testing @testings RW+ = @admin RW master = bob RW developing$ = alice - = bob RW tmp/ = @all RW refs/tags/v[0-9] = alice
$ cd ~/gitolite-admin $ cp /path/to/alice.pub keydir/ $ cp /path/to/bob.pub keydir/ $ nano -w conf/gitolite.conf @admin james @myteam james alice repo gitolite-admin RW+ = @admin repo testing RW+ = @all repo myproj RW+ = @myteam RW+CD = @admin R = bob $ git add conf/gitolite.conf keydir/alice.pub keydir/bob.pub $ git commit -m 'new user and repo created.' $ git push origin master
$ mkdir -p ~/myproj $ cd ~/myproj $ git init $ echo "hello, Gitolite!" >> hello.txt $ git add hello.txt $ git commit -m 'initial commit.' $ git remote add origin gitolite@serverIP:myproj.git $ git push origin master
$ cd ~ $ git clone gitolite@serverIP:myproj.git $ cd myproj $ echo "hi, I'm Alice." >> hello.txt $ git add hello.txt $ git commit -m 'say hello to Git Server." $ git push origin master
再来让 Bob 试试 GIT 服务器的情况:
$ cd ~ $ git clone gitolite@serverIP:gitolite-admin.git
正常情况,Bob 无法克隆该仓库;
$ git clone gitolite@serverIP:testing.git $ cd testing $ echo 1 > index.txt $ git add index.txt $ git commit -m 'write permission for testing repo.' $ git push origin master
这表明 Bob 拥有 testing.git 的读写权限;再来看
$ cd $ git clone gitolite@serverIP:myproj.git $ myproj $ echo "hello, I'm Bob." >> hello.txt $ git add hello.txt $ git commit -m 'say hello to Gitolite.' $ git push origin master
这表明 Bob 只能读取 myproj 但没有写权限。这几个操作表明 Gitolite 比较完美的控制了用户操作 GIT 服务器的权限。
$ sudo yum install highlight gitweb
$ rpm -qc gitweb /etc/gitweb.conf /etc/httpd/conf.d/git.conf
$ sudo nano -w /etc/gitweb.conf
our $projectroot="/var/lib/gitolite/repositories"; our $projects_list="/var/lib/gitolite/projects.list";
# Add highlighting at the end $feature{'highlight'}{'default'}= [1];
$ sudo usermod -a -G gitolite apache $ sudo chmod g+r /var/lib/gitolite/projects.list $ sudo chmod -R g+rx /var/lib/gitolite/repositories
$ sudo nano -w /var/lib/gitolite/.gitolite.rc
#$REPO_UMASK = 0077; # gets you 'rwx------' #$REPO_UMASK = 0027; # gets you 'rwxr-x---' $REPO_UMASK = 0022; # gets you 'rwxr-xr-x'
$ sudo service httpd restart
$ cd $ cd gitolite-admin $ nano -w conf/gitolite.conf repo gitolite-admin RW+ = james repo testing testing "James" = "Git repository for testing" RW+ = @all R = gitweb $ git add conf/gitolite.conf $ git commit -m 'gitweb support for Gitolite.' $ git push origin master
很明显,'R = gitweb' 这一行告诉 Gitolite 版本库 testing.git 启用 gitweb,这样 Gitolite 就会把 testing.git 写入 projects.list 文件;而 'testing "James" = "git repository for testing"' 这一行则是为了在网页中显示 testing 仓库的额外信息,也即仓库的创建者以及仓库的概述。其他版本库启用 gitweb 的设置完全类同,这里就不一一修改了。实际上,版本库的信息的设定也通过如下的命令来完成:
repo testing config gitweb.owner = some person's name config gitweb.description = some description config gitweb.category = some category
$ sudo yum install git-daemon
$ mv /usr/lib/systemd/system/git.service /usr/lib/systemd/system/git@.service
$ cat /usr/lib/systemd/system/git@.service [Unit] Description=Git Repositories Server Daemon Documentation=man:git-daemon(1) Wants=git.socket [Service] User=nobody ExecStart=-/usr/libexec/git-core/git-daemon --base-path=/var/lib/gitolite/repositories --export-all --user-path=public_git --syslog --inetd --verbose StandardInput=socket
$ ls -ald /var/lib/gitolite drwxr-xr-- 5 gitolite gitolite 4096 Jul 29 22:31 /var/lib/gitolite
$ sudo usermod -a -G gitolite nobody $ sudo chmod g+r -R /var/lib/gitolite/repositories
$ sudo systemctl start git.socket $ sudo systemctl enable git.socket
$ netstat -nat | grep 9418
$ nano -w /etc/sysconfig/iptables
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 9418 -j ACCEPT
$ sudo service iptables restart
$ cd $ cd gitolite-admin $ nano -w conf/gitolite.conf repo gitolite-admin RW+ = james repo testing RW+ = @all R = daemon $ git add conf/gitolite.conf $ git commit -m 'git daemon support for Gitolite.' $ git push origin master
'R=daemon' 这一行就是告诉 Gitolite 为 git-daemon 生成 git-daemon-export-ok 文件。
好了,现在让我们做简单的测试:
$ git clone git://serverIP/testing.git