搭建Git服务器
之前写过一篇介绍搭建svn的博客,这些天公司要迁移到git上,我帮公司搭建了Git服务器,记录下来。
###1. SSH公钥认证 Git可以使用很多协议,比如本地文件协议File://,HTTP协议http://,https://,Git协议git://,ssh协议ssh://, 本文主要介绍ssh协议的使用。ssh协议安全,可靠,部署方便。
SSH公钥认证的基本知识可以参考这里,大家主要了解如何产生ssh私有和公开key对,如何使用ssh主机别名。
###2. Gitolite安装 Git服务器最早的是Gitosis,后来不更新的,现在较为流行的是Giolite,貌似一直在更新,用的人很多,比较可靠。
##1.1依赖安装
- any unix system
- sh
- git 1.6.6+
- perl 5.8.8+
- openssh 5.0+
$sudo apt-get install openssh-server openssh-client perl git git-core
##1.2创建git专用用户
$ sudo adduser –disabled-password –system –shell /bin/bash –group git
$ sudo adduser git ssh
$ sudo passwd -l git
git用户不需要密码登陆,只需要ssh公钥登陆,如果想要在服务器上以git用户登陆,请用:
$ sudo su - git
##1.3初始安装gitolite
由于gitolite的初始安装会自动创建gitolite-admin版本库(用于管理员配置git版本库),所以需要一个可以访问
该版本库的用户。假设在A这台机器上搭建gitolite,并且在B机器上管理gitolite。注意B和A可以是同一台机器。
首先登陆B这台机器,创建ssh key
#on B machine
$sudo ssh-keygen -f ~/.ssh/git-admin
然后不管你用什么方法,需要把B机器上的生成的git-admin.pub拷贝到A机器git用户的根目录下。登陆A机器,确保
/home/git/.ssh/authorized_keys为空,或者不存在。
# on A machine
$ sudo su - git
$ cd ~
#make sure ~/.ssh/authorized_keys is empty or non-existent
$ git clone git://github.com/sitaramc/gitolite
$ mkdir -p $HOME/bin
$ gitolite/install -to $HOME/bin
$ HOME/bin/gitolite setup -pk git-admin.pub
##1.4管理gitolite
登陆B机器,创建ssh主机别名,在~/.ssh/config(没有则创建该文件)中添加:
host gitadmin_HOSTNAME(A)
user git
hostname HOSTNAME(A)
port 22
identityfile ~/.ssh/git-admin
将HOSTNAME(A)替换为A机器的ip地址或者主机名(如果主机名可以正确解析)。
然后在bash shell中:
$ git clone gitadmin_HOSTNAME(A):gitolite-admin.git
$ cd gitolite-admin
gitolite-admin目录中包含conf和keydir两个目录,conf用于配置版本库和用户权限,keydir用于管理ssh key。
如果需要添加用户,就需要把用户的ssh public key拷贝到keydir目录下,然后commit, push到服务器即可。
gitolite的钩子程序会自动把keydir下新增的public key添加到服务器的authorized_keys中。
conf目录中的gitolite.conf是配置版本库,基本语法如下:
@alldev = dev1 dev2
repo testing
RWC+ master = @all
@可以表示用户组,上面表示dev1 dev2是alldev组中的,并且alldev组队testing这个版本库的master分支具有RWC+权限。
详细的配置文档参见这里。
##1.5使用git
git客户端windows用户推荐使用Github for windows,linux用户直接安装git, git-core, git-doc即可。
用户使用ssh-keygen -f $HOME/.ssh/USERNAME来创建ssh key,并把$HOME/.ssh/USERNAME.pub邮件发送给管理员即可。
##1.6Gitolite高级
默认情况下git允许用于随意设置user.name, user.email,推送的时候gitolite并不检查commit的user.name是否和username相同,这样是为了
git修改历史命令的,例如git rebase, git cherry-pick等。但是gitolite也在自己的log中忠实的记录的每个commit的推送人(pusher)。想要
知道特定commit的推送人,可以使用git用户登录到git服务器:
$cd ~
$bin/gitolite who-pushed
http://www.ossxp.com/doc/git/gitolite.html
http://blog.chinaunix.net/uid-20940095-id-3340707.html
comments powered by Disqus