搭建小型 Git 服务器

作者 huhamhire,暂无评论,2013年3月9日 16:13 折腾历程

Git是一个分布式版本控制软件,原来是linux内核开发者Linus Torvalds为了更好地管理linux内核开发而创立的。发展至今,Git已经成为了一个相当好用的版本管理工具。相比于SVN,如果想要保存一些微小的修改也必须得提交服务器保存才可以,这样使服务器的版本号过多,而Git解决了这个问题,一些小的修改只在本地提交即可,只需最后修改完成后再提交服务器。正是由于这样的便捷性,现在越来越多的社区项目都开始使用Git来取代SVN之类较为传统的版本管理工具进行开发。

git-flow

既然是折腾VPS,利用VPS搭建一个小型代码托管服务器可以给日常的小程序的开发维护带来很多的方便。必要时还可以将VPS用作小组级的Git服务器,作为多人协作开发的版本库进行小组开发协调。

使用CentOS搭建Git服务器是一件比较轻松的事儿,本次折腾主要涉及 git, gitosis, gitweb 的安装配置。其中,gitosis 和 gitweb 是两种比较常用的方式,gitosis 是以 SSH 方式访问和管理 git,gitweb 是通过 http 的方式访问和管理。利用这些工具即可满足Git服务器的基本功能。此外比较好的一点是,Git的管理工具几乎不会给服务器带来较大的性能压力。下面正式开始我们的Git安装配置记录。

一、安装Git

由于VPS的系统一般不会执行完整安装,默认情况下需要单独安装一下 Git。不过这一步相当简单,一条安装命令即可:


yum install git

接下来再进行一些配置,为了方便git的管理并增强安全性,可以首先建立 git 账户:


useradd --home /home/git git
passwd git

创建完用户后就可以切换到git用户下进行后面的设置:


su git

使用git之前还需设置用户名和邮箱两个变量:


git config --global user.name "somebody"
git config --global user.email "somebody@example.com"

设置默认将会保存在 ~/.gitconfig 文件中。

此时,Git 的功能就已经可以使用了。为了方便后面的操作,可以先来创建一个空版本库。同上一文章一样,本篇还将使用 huhamhire-hosts 的项目来做为配置样例。

为了方便管理,首相创建版本库目录:


mkdir ~/repo

然后创建项目目录:


mkdir ~/repo/huhamhire-hosts

切换到项目目录:


cd ~/repo/huhamhire-hosts

初始化:


git init -bare

至此,一个初始的空项目版本库就配置完成了,后面安装了 gitosis 之后便可向库中推送我们的代码库内容。

二、安装gitosis

因为gitosis安装的时候需要使用python-setuptools,所以首先要安装python-setuptools:


yum install python-setuptools

然后开始安装gitosis,值得注意的是gitosis的安装程序本身就是由git管理的,需要使用git来获取。这里在/tmp目录下进行相关的安装操作:


cd /tmp
git clone https://github.com/res0nat0r/gitosis.gitt

接下来进入下载的gitosis版本库进行安装,同样是傻瓜化的操作,一条命令即可:


cd gitosis
python setup.py install

安装完成后,便进入对gitosis的设置阶段。由于gitosis需要通过SSH进行管理,所以需要创建SSH密钥对,并将公钥放在服务器端,私钥放在客户端。一般的流程是客户端创建完密钥后,将公钥传到服务器上生效。不过,偷懒的话直接在服务器上操作问题也不大。

切换到git用户:


su git

在git用户的主目录下建立.ssh目录:


mkdir /home/git/.ssh

进入~/.ssh目录并使用ssh-keygen生成公钥:


cd /home/git/.ssh
ssh-keygen -t rsa

注意不能忘记私钥的密码。默认会生成~/.ssh/id_rsa.pub公钥文件。

有了密钥以后便可初始化gitosis,使gitosis获得对Git的管理权限:


gitosis-init < /home/git/.ssh/id_rsa.pub

初始化之后,会在`/home/git/repositories创建gitosis-admin.git`项目,可以通过维护这个项目来对gitosis进行配置。

除此以外,还需要对`gitosis-admin.git/hooks/post-update`目录赋上权限:


chmod u+x /home/git/repositories/gitosis-admin.git/hooks/post-update

至此,服务器端的gitosys配置就完成了。

三、设置并使用gitosys

在服务器端完成了gitosys的配置之后,便可在客户端进行接下来的设置,以便使用Git服务器。

较为正规的做法是在客户端通过gitosis-admin版本库做管理设置,之后提交到服务器使项目权限生效,当然也可以使用操作系统的ssh登录方式进行验证,不过这里仅介绍前面一种方法。

在客户机上下载gitosis-admin版本库,这里以linux客户机为例:


git clone git@VPS的IP:/home/git/repositories/gitosis-admin.git

下载完成后,编辑gitosis-admin/gitosis.conf:


nano gitosis-admin/gitosis.conf

在文件中对项目权限进行相关的设置,依旧以huhamhire-hosts项目为例,可写入一下内容:


[group huhamhire-hosts]
writable = huhamhire-hosts
members = hamhire@myhost

随后要将客户端的公钥放到keydir目录下:


cp ~/.ssh/id_rsa.pub ~/gitosis-admin/keydir/hamhire@myhost.pub

随后提交设置到服务器:


cd ~/gitosis-admin
git add ./
git commit -a
git push

由于之前已经在 /home/git/repo/ 目录下设置了 huhamhire-hosts 的版本库位置,所以可以直接进行推送操作。

在本例中可以通过 hamhire@myhost:/home/git/repo/huhamhire-hosts 的路径来提交项目。

至此,gitosys的配置全部完成。

四、安装gitweb

在配置完成了git服务器以后,如果需要方便在线查看,使用gitweb来提供一个简单网页版的版本显示界面是一个不错的选择。

在服务器上运行以下命令安装gitweb:


yum install gitweb

安装完成后,需要对gitweb进行一些配置。首先是`/etc/gitweb.conf`:


nano /etc/gitweb.conf

修改版本库主目录等内容:


$projectroot = "/home/git/repo";
$feature{'blame'}{'default'} = [1];

此外,还需编辑gitweb主程序gitweb.cgi,这是一个使用Perl编写的脚本。


nano /var/www/git/gitweb.cgi

修改关联的版本库主目录:


our $projectroot = "/home/git/repo";

值得注意的是,由于 gitweb 是 cgi 程序,而我们的 web 服务器 lighttpd 默认情况下没有包含 cgi 的解释程序,还需要设置一下 web 服务器以启用 cgi 模块。编辑 /etc/lighttpd/modules.conf


nano /etc/lighttpd/modules.conf

取消以下内容前的注释符:


include "conf.d/cgi.conf"

接下来,还需要配置 gitweb 的站点。可以建立新的 vhosts 文件:


nano /etc/lighttpd/vhosts.d/gitweb.conf

输入类似于下面的内容:


1 setenv.add-environment = ( "GITWEB_CONFIG" =&gt; "/etc/conf.d/gitweb.conf" )
2 $HTTP["host"] == "git.huhamhire.com" {
3     server.document-root = "/var/www/git/"
4     server.name = "git.huhamhire.com"
5     cgi.assign = (".cgi" => "")
6     server.indexfiles = ( "gitweb.cgi" )
7     accesslog.filename = "/var/www/logs/git_access.log"
8 }

当然,如果设置了 IPv6,还可使用之前的文章中提到的方法对 IPv6 的访问做 https 的设置:


 1 # IPv6 Connection to huhamhire-git with SSL
 2 $SERVER["socket"] == "[2604:180::30f7:3210]:443" {
 3     server.document-root = "/var/www/git/"
 4     server.name = "git.huhamhire.com"
 5     cgi.assign = (".cgi" => "")
 6     server.indexfiles = ( "gitweb.cgi" )
 7     accesslog.filename = "/var/www/logs/git_v6_access.log"
 8 
 9     ssl.engine = "enable"
10     ssl.ca-file = "/etc/lighttpd/certs/ca-certs.crt"
11     ssl.pemfile = "/etc/lighttpd/certs/git/ssl.crt"
12 }

随后重启 lighttpd 使站点生效,然后就可以直接通过域名来访问 Gitweb 站点了。

五、Gitweb的界面美化与中文化

个人觉得 Gitweb 默认的用户界面是在是有点简陋地惨不忍睹,实在觉得不舒服的话,完全可以使用样式表进行适当的装饰。建议可以参考 Github 上的" gitweb-theme"项目进行美化: http://kogakure.github.com/gitweb-theme/

还有一个问题是是先Gitweb中文界面的中文化,其实这对于大部分人来说也是无所谓的了。由于Gitweb的设计结构比较简单,没有独立的语言文件,所以汉化需要直接修改程序代码,前段时间我也小小地折腾了一下Gitweb的汉化,有兴趣的朋友可以参考 http://git.huhamhire.com/?p=gitweb-cn 项目。那个展示页面其实就是最终的成果,只能说马马虎虎吧,还不是很完美,有时间的话准备再继续折腾一下。

具体效果也可参考下图:

gitweb

参考文章:http://blog.sina.com.cn/s/blog_591e8adf0100vlzs.html

关键词:git , 虚拟主机
登录后进行评论