架设简单git服务器
看到标题,最容易想到的问题就是:“为什么不用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创建用户
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,访问域名查看效果:
如果提示无法找到项目,不要忘记检查项目目录的读权限以及上级目录的执行权限~
Comments