分类: Linux

架设简单git服务器

看到标题,最容易想到的问题就是:“为什么不用github?”。
确实github十分好用,但在如下一些情况下你确实需要一个自己的git服务器:

  1. 自己的代码太丑,羞于放在github上…
  2. 我很自私,不想开源,又很穷,买不起github付费服务…
  3. 开发环境不能连接外网(这是真实存在的)…
  4. 我就是想玩一下…

假设现在已经有了需求,其实实际操作的过程还是很简单,参照《Pro Git》所述即可。

首先要明白搭建git服务器可以使用的协议有三种:ssh、http和git,为了简单起见我选择最容易使用的ssh协议进行搭建。各种协议的优缺点在书中有详细叙述,摘出关于ssh的一段:

优点
使用 SSH 的好处有很多。首先,如果你想拥有对网络仓库的写权限,基本上不可能不使用 SSH。其次,SSH 架设相对比较简单—— SSH 守护进程很常见,很多网络管理员都有一些使用经验,而且很多操作系统都自带 了它或者相关的管理工具。再次,通过 SSH 进行访问是安全的——所有数据传输都是加密和授权的。最后, 类似 Git 和 本地协议,SSH 很高效,会在传输之前尽可能的压缩数据。
缺点
SSH 的限制在于你不能通过它实现仓库的匿名访问。即使仅为读取数据,人们也必须在能通过 SSH 访问主 机的前提下才能访问仓库,这使得 SSH 不利于开源的项目。如果你仅仅在公司网络里使用,SSH 可能是你唯 一需要使用的协议。如果想允许对项目的匿名只读访问,那么除了为自己推送而架设 SSH 协议之外,还需要 其他协议来让别人获取数据。

下面开始行动,首先在服务器上为git创建用户

然后创建自己的仓库根目录,并创建项目

到这一步其实你的git仓库已经初步可用了,将本地已有工程上传到新建的空项目中:

简单的获取该项目:

虽然git基本操作已经可用了,但是有一个问题…这样做所有的项目成员都需要知道服务器git用户的密码…这很不合理,解决方案是使用RSA密钥对为每个开发成员添加信任关系,这也是github使用的方案。
所有开发者首先需要生成自己的密钥对

该指令可以生成一对密钥,默认生成在~/.ssh目录下,开发成员将自己的公钥(id_rsa.pub)发给服务器管理员,由服务器管理员为其添加git用户的信任关系

有了这个信任关系,开发成员就可以正常的使用git服务而无需知道git用户的密码。更进一步,可以通过修改git用户的shell来防范git用户的ssh行为。编辑/etc/passwd文件,其中类似如下的行:

修改为(用git-shell替换sh):

这样如果有人尝试通过ssh登录git用户,则只能使用git-shell服务,而保护了ssh安全。
在这里可能会出现如下报错:

这是因为没有找到对应的git-shell-commands文件,手动解决方案如下:

su git测试下,应该能看见

如果你顺利完成了上面的步骤并且还没尽兴,那就再为你的git服务器添加一个图形化界面吧:GitWeb

安装后修改httpd的配置文件,增加如下内容:

修改/etc/gitweb.conf让gitweb指向你的仓库根目录

重启httpd,访问域名查看效果:
gitweb
如果提示无法找到项目,不要忘记检查项目目录的读权限以及上级目录的执行权限~