看到标题,最容易想到的问题就是:“为什么不用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创建用户

useradd git passwd git su git cd ~

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

mkdir projects cd projects mkdir work.git cd work.git git --bare init

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

# 在 John 的电脑上 
cd work
git init
git add .
git commit -m 'initial commit'
git remote add origin git@gitserver:/home/git/projects/work.git
git push origin master

简单的获取该项目:

git clone git@gitserver:/home/git/projects/work.git

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

ssh-keygen

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

cat id_rsa.pub >> /home/git/.ssh/authorized_keys

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

git:x:1000:1000::/home/git:/bin/sh

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

git:x:1000:1000::/home/git:/usr/bin/git-shell

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

fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.

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

cp -r /usr/share/doc/git/contrib/git-shell-commands /home/git/
chown -R git.git git-shell-commands
chmod +x /home/git/git-shell-commands/help
chmod +x /home/git/git-shell-commands/list

su git测试下,应该能看见

Run ‘help’ for help, or ‘exit’ to leave. Available commands:list` 

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

yum install gitweb

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

<VirtualHost *:80>
  ServerName gitserver
  DocumentRoot /var/www/git
 
  <Directory /var/www/git>
    Options +ExecCGI
    AddHandler cgi-script .cgi
    DirectoryIndex gitweb.cgi
  </Directory>
 
</VirtualHost>

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

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

重启httpd,访问域名查看效果:

gitweb

如果提示无法找到项目,不要忘记检查项目目录的读权限以及上级目录的执行权限~

Tags:

Categories:

Updated:

Comments