使⽤ Gitosis 搭建私有 Git 服务器

软件安装

安装 ssh 与 git
sudo apt-get install git-core openssh-server openssh-client 
	//设置 git 全局的⽤⼾名与邮箱 
	git config --global user.name "myname" 
	git config --global user.email "myemail@gmail.com"
安装 Gitosis
//先安装 python-setuptools,再⽤ python 安装 gitosis 
	sudo apt-get install python-setuptools 
	//clone 官⽅ github 仓库,⾃⾏选择 clone 到哪个⽬录 
	git clone https://github.com/res0nat0r/gitosis.git //注意:中间有两个是数字零
	cd gitosis/ 
	sudo python setup.py install

Gitosis 的使⽤

通常情况下,⾄少需要两个⽤⼾来使⽤ gitosis 来管理 git 仓库,⼀个是仓库服务器的所有者,⼀个是仓库成员。
. 仓库服务器的所有者能够创建新的仓库
.仓库成员可以拉取⾃⼰所在的仓库,如果有写权限,可以将修改提交到到服务端上去
gitosis 的配置⽂件也是以 git 仓库的形式存储的,所以需要⼀个仓库成员来管理这些配置⽂件,初始化gitosis 需要指定⼀个公钥⽂件,该⽂件的所有者就是配置⽂件仓库的成员,可以把他当做是管理员,负责收集其他仓库成员的公钥与编辑配置⽂件。

创建仓库成员

仓库成员只需要将本地的 ssh 公钥,提交给管理管理 gitosis 的配置⽂件的⼈即可,管理员负责仓库成员的配置。

⽣成公钥
ssh-keygen -t rsa 
    //到⽬标 ~/.ssh/ 下可以看到⽣成的公钥⽂件 id_rsa.pub 
    cd ~/.ssh 
    //将公钥⽂件复制⼀份,⽂件名修改为本地的⽤⼾名与主机名,类似 name@computer.pub 这种形式 
    cp ./id_rsa.pub name@computer.pub 
    //发送到到 gitosis 配置管理员的⼿上 
    scp ~/.ssh/name@computer.pub [管理员⽤⼾名]@[管理员的IP]:[要发送到的⽬标⽬录]
创建仓库服务器所有者
# ⼀般是⼀个新的系统⽤⼾ 
    sudo useradd -m git 
    # 设置密码 
    sudo passwd git 
    # 切换到该⽤⼾ 
    su git 
    # 初始化 gitosis 
    sudo -H -u git gitosis-init < [负责管理配置⽂件的⼈的公钥] 
    # 初始化完成后,进⼊到⽤⼾⽬录下,可以看到⽣成了两个新⽬录,其中的 repositories/ 是⽤来存放 git 仓库 
    的
    # 修改 repositories/ ⽬录的⽤⼾权限,仅允许 git ⽤⼾即仓库服务器所有者进⾏操作 
    sudo chown git:git /home/git/repositories 
    sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update 
    sudo chmod 755 /home/git/repositories
配置文件的使用
以下操作均由配置⽂件仓库 gitosis-admin 的成员来完成
# 管理配置⽂件的⽤⼾,将服务器上的配置⽂件仓库 clone 下来 
    git clone git@[服务器的地址]:gitosis-admin.git 
    # 进⼊ gitosis-admin ⽬录中,可以看到⼀个配置⽂件 gitosis.conf 与⼀个⽬录 keydir/ 
    # gitosis.conf 中可以为每⼀个仓库配置成员与权限等信息 
    # keydir/ ⽬录储存所有仓库成员的 ssh 公钥 
    vim gitosis.conf 
    # 打开 gitosis.conf
    
    # 其中的 group 标签是分组; 
    # writable 的值是仓库的名称,需要 repositories/ ⽬录下存在同样名称的仓库⽬录,并以“.git”作为⽬录名 
    的后缀; 
    # member 的值是该标签下分组下的所有仓库的成员,多个成员⽤空格隔开,成员的名称需要与 keydir/ ⽬录 
    下的公钥⽂件名相同; 
    # 修改 gitosis.conf 或者添加了新的公钥到 keydir/ ⽬录下后,只需要像⼀般的 git 仓库⼀样将修改提交到远程 
    仓库即可应⽤新的配置; 
    git add . 
    git commit -m "描述改变的内容" 
    git push origin master
创建新的仓库

创建仓库需要两个⽤⼾进⾏操作,git ⽤⼾创建新的仓库,配置⽂件管理员为新仓库编写新的配置项并提交修改。

# git ⽤⼾创建新仓库 
    su - git 
    cd ~/repositories/ 
    git init --bare [仓库名].git
    # 配置⽂件管理员修改配置项 
    su - [管理员账号] 
    cd [gitosis-admin 仓库所在的⽬录] 
    vim gitosis.conf 
    # 为新仓库添加分组和成员

例如添加了新仓库 test,并将成员 member1@group1 与 member2@group1 设置为仓库成员,在gitosis.conf ⽂件中添加:

[group test] 
	wirtable = test 
	members = member1@group1 member2@group1
权限管理

gitosis 仅仅提供了⾮常简单的权限控制,默认情况下,仓库成员拥有仓库的读写权限,可通过添加配置项,让⼀部分成员只能够读取仓库,⽆法提交修改。例如把上⾯例⼦中的成员 member2@group1,设置为只读权限,在配置⽂件中可以这样写:

[group test] 
    wirtable = test 
    members = member1@group1 
    [group test_readonly] 
    readonly = test 
    members = member2@group1
仓库成员 clone 仓库
git clone git@[服务器地址]:[仓库名].git

具有读权限的成员才能够成功 clone 到本地。
具有写权限的成员可以将修改提交到服务器的仓库上。