看到标题,最容易想到的问题就是:“为什么不用github?”。
确实github十分好用,但在如下一些情况下你确实需要一个自己的git服务器:
- 自己的代码太丑,羞于放在github上…
- 我很自私,不想开源,又很穷,买不起github付费服务…
- 开发环境不能连接外网(这是真实存在的)…
- 我就是想玩一下…
假设现在已经有了需求,其实实际操作的过程还是很简单,参照《Pro Git》所述即可。
首先要明白搭建git服务器可以使用的协议有三种:ssh、http和git,为了简单起见我选择最容易使用的ssh协议进行搭建。各种协议的优缺点在书中有详细叙述,摘出关于ssh的一段:
优点
使用 SSH 的好处有很多。首先,如果你想拥有对网络仓库的写权限,基本上不可能不使用 SSH。其次,SSH 架设相对比较简单—— SSH 守护进程很常见,很多网络管理员都有一些使用经验,而且很多操作系统都自带 了它或者相关的管理工具。再次,通过 SSH 进行访问是安全的——所有数据传输都是加密和授权的。最后, 类似 Git 和 本地协议,SSH 很高效,会在传输之前尽可能的压缩数据。
缺点
SSH 的限制在于你不能通过它实现仓库的匿名访问。即使仅为读取数据,人们也必须在能通过 SSH 访问主 机的前提下才能访问仓库,这使得 SSH 不利于开源的项目。如果你仅仅在公司网络里使用,SSH 可能是你唯 一需要使用的协议。如果想允许对项目的匿名只读访问,那么除了为自己推送而架设 SSH 协议之外,还需要 其他协议来让别人获取数据。
下面开始行动,首先在服务器上为git创建用户
1 2 3 4 |
useradd git passwd git su git cd ~ |
然后创建自己的仓库根目录,并创建项目
1 2 3 4 5 |
mkdir projects cd projects mkdir work.git cd work.git git --bare init |
到这一步其实你的git仓库已经初步可用了,将本地已有工程上传到新建的空项目中:
1 2 3 4 5 6 7 |
# 在 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 |
简单的获取该项目:
1 |
git clone git@gitserver:/home/git/projects/work.git |
虽然git基本操作已经可用了,但是有一个问题…这样做所有的项目成员都需要知道服务器git用户的密码…这很不合理,解决方案是使用RSA密钥对为每个开发成员添加信任关系,这也是github使用的方案。
所有开发者首先需要生成自己的密钥对
1 |
ssh-keygen |
该指令可以生成一对密钥,默认生成在~/.ssh目录下,开发成员将自己的公钥(id_rsa.pub)发给服务器管理员,由服务器管理员为其添加git用户的信任关系
1 |
cat id_rsa.pub >> /home/git/.ssh/authorized_keys |
有了这个信任关系,开发成员就可以正常的使用git服务而无需知道git用户的密码。更进一步,可以通过修改git用户的shell来防范git用户的ssh行为。编辑/etc/passwd文件,其中类似如下的行:
1 |
git:x:1000:1000::/home/git:/bin/sh |
修改为(用git-shell替换sh):
1 |
git:x:1000:1000::/home/git:/usr/bin/git-shell |
这样如果有人尝试通过ssh登录git用户,则只能使用git-shell服务,而保护了ssh安全。
在这里可能会出现如下报错:
1 2 |
fatal: Interactive git shell is not enabled. hint: ~/git-shell-commands should exist and have read and execute access. |
这是因为没有找到对应的git-shell-commands文件,手动解决方案如下:
1 2 3 4 |
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测试下,应该能看见
1 |
Run ‘help’ for help, or ‘exit’ to leave. Available commands:list |
如果你顺利完成了上面的步骤并且还没尽兴,那就再为你的git服务器添加一个图形化界面吧:GitWeb
1 |
yum install gitweb |
安装后修改httpd的配置文件,增加如下内容:
1 2 3 4 5 6 7 8 9 10 11 |
<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指向你的仓库根目录
1 |
our $projectroot = "/home/git/projects"; |