Gitolite是功能非常强大的Git服务器构建工具,可以比较方便地实现用户权限管理等功能。但是Gitolite是一个纯粹的Git服务器,不像Gitlab等项目,自身不具备其它的访问和浏览方式。

之前的服务器上也配置过Gitolite,同时配合Redmine来用。对我来说不管是Gitlab还是Redmine功能都太过丰富了。实际上自己的服务器上装Gitolite只是放一些私有库,我只需要一个简单直观的Web浏览功能而已。论项目协作的话,不管是Github还是国内的Gitcafe和OSC都是很不错的选择。

所以这次挑来挑去选择了最简单的Gitweb来实现。所搜索到的教程大部分是基于Apache+Gitweb的,nginx在与Gitweb的结合上则有一些额外需要配置的内容。所以写下这篇文章稍作记录。


目录

  1. Gitolite的安装和配置
  2. Gitweb的安装和配置
  3. nginx的配置

1.Gitolite的安装和配置

①基本安装配置

Gitolite的安装其实很简单。官方文档写的相当详细了。

首先把代码克隆下来,用自带的安装脚本安装到/usr/local/gitolite然后再做软连接。

然后添加一个禁用密码的用户:

1
2
3
4
5
6
sudo adduser \
--system \
--shell /bin/bash \
--group \
--disabled-password \
--home /home/git git

切换到该用户并gitolite setup。admin.pub是管理员的公钥,提前scp到服务器上。

1
2
su - git
gitolite setup --pubkey admin.pub

此时本机已经可以克隆gitolite-admin的repo了。

②Gitweb额外配置

为了准备Gitweb访问,还需要一些额外的配置。主要是处理文件系统的权限和repo的权限问题。

首先要修改/home/git/.gitolite.rc中的UMASK,将0007修改为0027。同时执行:

1
2
3
sudo usermod -a -G git www #www是我运行服务器的用户,自行修改
sudo chmod g+r /home/git/projects.list
sudo chmod -R g+rx /home/git/repositories

将Web服务器的执行用户添加到git组,并保证文件系统权限对现有文件也起效。

另外要注意的一点是Gitweb通过projects.list读取并决定哪些repo能够显示(确切说是显示在首页,后面Gitweb配置部分会提到),在Gitolite中,需要对特定repo设置权限 R = gitweb 才能使该repo被加入到projects.list当中。


2.Gitweb的安装和配置

①Gitweb的安装

Gitweb直接通过包管理软件安装就可以。但一般来说软件源中gitweb会把apache列为依赖,如果已经先安装好了nginx要记得把apache的服务禁用掉。
以Debian系为例,执行:

1
sudo apt-get install gitweb highlight

其中highlight用于提供代码高亮的功能。

②Gitweb的配置

gitweb的配置文件默认位置是/etc/gitweb.conf。下面是配置文件的范例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# path to git projects (<project>.git)
$projectroot = "/home/git/repositories/";
# directory to use for temp files
$git_temp = "/tmp";
# target of the home link on top of all pages
#$home_link = $my_uri || "/";
# html text to include at home page
#$home_text = "indextext.html";
# file with project list; by default, simply scan the projectroot dir.
$projects_list = "/home/git/projects.list";
$strict_export = 1;
# stylesheet to use
#@stylesheets = ("static/gitweb.css");
# javascript code for gitweb
$javascript = "static/gitweb.js";
# logo to use
$logo = "static/git-logo.png";
# the 'favicon'
#$favicon = "static/git-favicon.png";
# git-diff-tree(1) options to use for generated patches
#@diff_opts = ("-M");
@diff_opts = ();
$feature {'blame'}{'default'} = [1];
$feature {'blame'}{'override'} = 1;
$feature {'snapshot'}{'default'} = ['zip', 'tgz'];
$feature {'snapshot'}{'override'} = 1;
$feature{'highlight'}{'default'} = [1];

其中$projectroot$projects_list很好理解,指定repo的目录和projects.list的位置。如果不指定projects.list的话,gitweb会自动在$projectroot定义的目录下递归查找合法的git repo来显示。

$strict_export参数规定只有显示在首页上的repo才能够被访问。换句话说在有projects.list的情况下,该文件列出的repo才能被访问。没有这一项的话,尽管gitolite-admin这个重要目录不会在projects.list里列出(谁会干这种事……),但是可以直接通过修改url参数进行访问。默认这个选项是没有开的,真的是非常不安全……翻了翻开发者的意见似乎是是确实应该默认打开以增强安全性,但是考虑到兼容性问题没有修改。

$feature数组启用了一些插件或者说特性。blame可以显示代码来源人,snapshot提供repo的打包下载,highlight提供代码高亮。


3.nginx的配置

nginx的安装没有什么特殊要求,教程一大把就不讲了。主要讲一下如何用nginx跑起来gitweb。

nginx跑gitweb需要spawn-fcgi和fcgiwrap的辅助。

1
sudo apt-get install spawn-fcgi fcgiwrap

安装好之后修改/etc/init.d/fcgiwrap,把FCGI_USER FCGI_GROUP FCGI_SOCKET_OWNER FCGI_SOCKET_GROUP都修改为运行Web服务器的用户(我服务器上是www)。

然后在nginx的配置文件中添加一个新的server段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 80;
server_name gitweb.example.com;
access_log /home/wwwlogs/access.log main;
location / {
root /usr/share/gitweb;
index index.cgi;
include fastcgi_params;
gzip off;
fastcgi_param GITWEB_CONFIG /etc/gitweb.conf;
if ($uri ~ "/index.cgi") {
fastcgi_pass unix:/var/run/fcgiwrap.socket;
}
}
}

这种使用fcgiwrap的方式是很简单粗暴的,跟用php-fpm不分pool一样。不过这里fcgiwrap仅用来跑gitweb一个,就凑合着用吧。

重启一下fcgiwrap和nginx,就可以看到效果了。

如果是私用的站点,可以考虑添加robots.txt以及用nginx的auth_basic添加简单的http认证。


参考资料

Git, Gitweb, and Gitolite setting on Nginx inside Ubuntu
Gitweb - Archlinux Wiki
fcgiwrap setup for gitweb + gitolite
Gitolite 3 的配置