您的位置:首页 > 其它

Gitosis配置

2016-01-03 00:26 197 查看
主要步骤参考: http://www.tuicool.com/articles/fqUvQvr
注意点:

1. 通过git clone 将gitosis-admin 从服务器端克隆到本地客户端。本地目录如下: 

gitosis.conf  keydir


本地修改,然后提交到服务器,这样git hooks才会自动更新服务器端的authorized_keys。在服务器端直接修改不会调用hooks!

2. git remote add -f  origin git@115.29.138.242:Geekkitchen.git,而不是 git remote add -f origin git@115.29.138.242:/home/git/repositories/Geekkitchen.git。

正常情况下,如果没有gitosis,url应该是后者。但gitosis权限设置后,不需要全路径,只需要project名字。

3. 

git hook 配置完成,之后代码只需上传到git服务器即可。 

附 git hook 设置过程: 

1). (git Server) /home/git/repositories/Geekkitchen.git/hooks 

unset GIT_DIR 

cd /scratch/web/Geekkitchen/ 

env -i git pull 

2). (work dir/git client) /scratch/web/Geekkitchen/.git


url = git@115.29.138.242:Geekkitchen.git

url = /home/git/repositories/Geekkitchen.git/


3). chmod -R 777 /scratch/web/Geekkitchen

----------------------------------------

Git是目前世界上最先进的分布式版本控制系统。大名鼎鼎的GitHub就是一个免费托管开源代码的远程仓库。但既不想公开源代码,又舍不得给GitHub交保护费,那需要我们自己搭建一台Git服务器作为私有仓库使用。下面我们使用gitosis(https://github.com/res0nat0r/gitosis )这个服务器来配置这个私有仓库。简单地说,Gitosis
就是一套用来管理 authorized_keys文件和实现简单连接限制的脚本,它是Python开发的,所以要保证Python和Python setuptools提前安装好。
apt-get install python-setuptools


1. gitosis安装

(1). 首先要保证openssh的服务器和客户端已经被安装,并安装git
apt-get install openssh-server openssh-client
 
apt-get
install git-core


(2). git配置准备

# 创建git仓库存储目录
sudo mkdir -p /app/git/repositories
# 设置git仓库权限
sudo chown -R git:git /app/git/repositories
sudo chmod -R 755 /app/git/repositories
sudo useradd -d /app/git -m git
sudo passwd git


创建gitosis管理员的个人公钥和私钥。首先su到git用户下面
su - git


默认生成2048位,可以提高到4096位来提高安全级别,通过下面的命令创建公钥和私钥
ssh-keygen -t rsa -b 4096


默认情况下,公钥和私钥会保存在~/.ssh目录下,如下所示:

id_rsa  id_rsa.pub  known_hosts


初始化全局设置

git config --global user.name "git"
git config --global user.email "git@test.com"



(3)、获取并安装gitosis

cd /tmp
git clone https://github.com/res0nat0r/gitosis.gitcd gitosis
sudo python setup.py install



2、管理gitosis

首先要用之前创建的管理员公钥初始化gitosis。

su - git
$ gitosis-init < ~/.ssh/id_rsa.pub
Reinitialized existing Git repository in /app/git/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /app/git/repositories/gitosis-admin.git/
chmod 755 /app/git/repositories/gitosis-admin.git/hooks/post-update


下面用用初始化 Gitosis 的公钥的拥有者身份 SSH 登录服务器,会显示下面的报错信息。

$ ssh -p 9999 git@localhost
PTY allocation request failed on channel 0
ERROR:gitosis.serve.main:Need SSH_ORIGINAL_COMMAND in environment.
Connection to localhost closed.


Gitosis 认出了该用户的身份,但由于没有运行任何 Git 命令,所以它断开了连接。下面通过git clone命令来连接并克隆gitosis的控制仓库。首先创建一个目录来

mkdir myrepo

这里我把服务器默认的ssh端口修改了,所以要在客户端中创建~/.ssh/config,并添加Port 12345这一行。然后执行下面语句克隆

git clone git@localhost:gitosis-admin.git
Cloning into 'gitosis-admin'...
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 0), reused 5 (delta 0)
Receiving objects: 100% (5/5), done.
Checking connectivity... done.


这样gitosis的控制目录gitosis-admin就被clone下了。里面结构如下:

cd gitosis-admin/
$ ls -R
.:
gitosis.conf  keydir

./keydir:
git@my-server.pub


其中:

gitosis.conf 文件是用来设置用户、仓库和权限的配置文件。

keydir 目录则是保存所有具有访问权限用户公钥的地方,允许访问gitosis的用户的公钥都保存在这里。

$ cat gitosis.conf
[gitosis]

[group gitosis-admin]
members = git@my-server
writable = gitosis-admin


这表明了用户git(初始化 Gitosis 公钥的拥有者)是拥有唯一管理 gitosis-admin这个仓库的权限。下面我们可以新增一个项目。为此我们要建立一个名为dev的组(group),以及他们拥有写权限的项目。并允许’debugo’这个用户有权利读写’proj1’这个新项目:

[group dev]
members = debugo@my-server
writable = proj1


debugo虽然已经添加到了配置文件中,但它的公钥还没有被gitosis获知。所以我们要将debugo的公钥改名为debugo.pub,拷贝到keydir中。

cp /tmp/id_rsa.pub keydir/debugo@my-server.pub
git add keydir/debugo@my-server.pub


修改完之后,提交 gitosis-admin 里的改动,并push到服务器使其生效。

$ git commit -am 'add new group'
[master 36fc5a9] add new group
2 file changed, 3 insertions(+)
$ git push origin master
Counting objects: 5, done.
......
9bc77eb..36fc5a9  master -> master



3. git项目管理

在debugo用户目录下,首先先初始化用户信息。

$ git commit -am 'add new group'
[master 36fc5a9] add new group
2 file changed, 3 insertions(+)
$ git push origin master
Counting objects: 5, done.
......
9bc77eb..36fc5a9  master -> master


debugo用户已经有对proj1这个项目有读写权限了,但是proj1这个项目并没有任何内容。下面我们首先初始化一个本地项目。

$ mkdir proj1
$ cd proj1/
$ git init
Initialized empty Git repository in /home/debugo/proj1/.git/
# 添加几个新文件,并将所有文件列入索引中。
$ touch main.py hello.py
$ git add .
# 添加文件内容并进行一次提交
$ echo 'print "hello world"' > hello.py

$ git commit -a -m "origin"
[master (root-commit) b9ecf8e] origin
2 files changed, 1 insertion(+)
create mode 100644 hello.py
create mode 100644 main.py
# 检查该git仓库状态,保证它是最新的。
$ git status
On branch master
nothing to commit, working directory clean
# 下面push到远程的server上。
$ git remote add origin git@localhost:proj1.git
$ git push origin master
Initialized empty Git repository in /app/git/repositories/proj1.git/
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 261 bytes | 0 bytes/s, done.
Total 4 (delta 0), reused 0 (delta 0)
To git@localhost:proj1.git
* [new branch]      master -> master


OK!下面添加一个新的只读账户qa。在控制仓库中编辑一个新的组qa

$ cp /tmp/qa@my-server.pub keydir/

$ vim gitosis.conf
[group qa]
members = qa@my-server
readonly = proj1

$ git commit  -am 'add new group and key'
[master 6da3ce2] add new group and key
1 file changed, 4 insertions(+)

$ git push origin master
Counting objects: 5, done.
......


下面在qa用户中,可以checkout这个项目了。

#初始化客户端
$ echo "port 12345" > .ssh/config
$ git config --global user.name "qa"
$ git config --global user.email "qa@test.com"


下面成功从server上clone下项目,并检查是否能进行提交。

$ git clone git@localhost:proj1.git
Cloning into 'proj1'...
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (4/4), done.
Checking connectivity... done.
$ git push origin master
.......
Please make sure you have the correct access rights
and the repository exists.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  gitosis