`
wbj0110
  • 浏览: 1598280 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

服务器上的 Git - Gitosis

    博客分类:
  • Git
Git 
阅读更多

 

Gitosis

把所有用户的公钥保存在 authorized_keys 文件的做法,只能凑和一阵子,当用户数量达到几百人的规模时,管理起来就会十分痛苦。每次改删用户都必须登录服务器不去说,这种做法还缺少必要的权限管理 — 每个人都对所有项目拥有完整的读写权限。

幸好我们还可以选择应用广泛的 Gitosis 项目。简单地说,Gitosis 就是一套用来管理 authorized_keys 文件和实现简单连接限制的脚本。有趣的是,用来添加用户和设定权限的并非通过网页程序,而只是管理一个特殊的 Git 仓库。你只需要在这个特殊仓库内做好相应的设定,然后推送到服务器上,Gitosis 就会随之改变运行策略,听起来就很酷,对吧?

Gitosis 的安装算不上傻瓜化,但也不算太难。用 Linux 服务器架设起来最简单 — 以下例子中,我们使用装有 Ubuntu 8.10 系统的服务器。

Gitosis 的工作依赖于某些 Python 工具,所以首先要安装 Python 的 setuptools 包,在 Ubuntu 上称为 python-setuptools:

$ apt-get install python-setuptools

接下来,从 Gitosis 项目主页克隆并安装:

$ git clone https://github.com/tv42/gitosis.git
$ cd gitosis
$ sudo python setup.py install

这会安装几个供 Gitosis 使用的工具。默认 Gitosis 会把 /home/git 作为存储所有 Git 仓库的根目录,这没什么不好,不过我们之前已经把项目仓库都放在 /opt/git 里面了,所以为方便起见,我们可以做一个符号连接,直接划转过去,而不必重新配置:

$ ln -s /opt/git /home/git/repositories

Gitosis 将会帮我们管理用户公钥,所以先把当前控制文件改名备份,以便稍后重新添加,准备好让 Gitosis 自动管理 authorized_keys 文件:

$ mv /home/git/.ssh/authorized_keys /home/git/.ssh/ak.bak

接下来,如果之前把 git 用户的登录 shell 改为 git-shell 命令的话,先恢复 'git' 用户的登录 shell。改过之后,大家仍然无法通过该帐号登录(译注:因为 authorized_keys 文件已经没有了。),不过不用担心,这会交给 Gitosis 来实现。所以现在先打开 /etc/passwd 文件,把这行:

git:x:1000:1000::/home/git:/usr/bin/git-shell

改回:

git:x:1000:1000::/home/git:/bin/sh

好了,现在可以初始化 Gitosis 了。你可以用自己的公钥执行 gitosis-init 命令,要是公钥不在服务器上,先临时复制一份:

$ sudo -H -u git gitosis-init < /tmp/id_dsa.pub
Initialized empty Git repository in /opt/git/gitosis-admin.git/
Reinitialized existing Git repository in /opt/git/gitosis-admin.git/

这样该公钥的拥有者就能修改用于配置 Gitosis 的那个特殊 Git 仓库了。接下来,需要手工对该仓库中的 post-update 脚本加上可执行权限:

$ sudo chmod 755 /opt/git/gitosis-admin.git/hooks/post-update

基本上就算是好了。如果设定过程没出什么差错,现在可以试一下用初始化 Gitosis 的公钥的拥有者身份 SSH 登录服务器,应该会看到类似下面这样:

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

说明 Gitosis 认出了该用户的身份,但由于没有运行任何 Git 命令,所以它切断了连接。那么,现在运行一个实际的 Git 命令 — 克隆 Gitosis 的控制仓库:

# 在你本地计算机上
$ git clone git@gitserver:gitosis-admin.git

这会得到一个名为 gitosis-admin 的工作目录,主要由两部分组成:

$ cd gitosis-admin
$ find .
./gitosis.conf
./keydir
./keydir/scott.pub

gitosis.conf 文件是用来设置用户、仓库和权限的控制文件。keydir 目录则是保存所有具有访问权限用户公钥的地方— 每人一个。在 keydir 里的文件名(比如上面的 scott.pub)应该跟你的不一样 — Gitosis 会自动从使用 gitosis-init 脚本导入的公钥尾部的描述中获取该名字。

看一下 gitosis.conf 文件的内容,它应该只包含与刚刚克隆的 gitosis-admin 相关的信息:

$ cat gitosis.conf
[gitosis]

[group gitosis-admin]
members = scott
writable = gitosis-admin

它显示用户 scott — 初始化 Gitosis 公钥的拥有者 — 是唯一能管理 gitosis-admin 项目的人。

现在我们来添加一个新项目。为此我们要建立一个名为 mobile 的新段落,在其中罗列手机开发团队的开发者,以及他们拥有写权限的项目。由于 'scott' 是系统中的唯一用户,我们把他设为唯一用户,并允许他读写名为 iphone_project 的新项目:

[group mobile]
members = scott
writable = iphone_project

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

$ git commit -am 'add iphone_project and mobile group'
[master 8962da8] add iphone_project and mobile group
 1 file changed, 4 insertions(+)
$ git push origin master
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 272 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@gitserver:gitosis-admin.git
   fb27aec..8962da8  master -> master

在新工程 iphone_project 里首次推送数据到服务器前,得先设定该服务器地址为远程仓库。但你不用事先到服务器上手工创建该项目的裸仓库— Gitosis 会在第一次遇到推送时自动创建:

$ git remote add origin git@gitserver:iphone_project.git
$ git push origin master
Initialized empty Git repository in /opt/git/iphone_project.git/
Counting objects: 3, done.
Writing objects: 100% (3/3), 230 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@gitserver:iphone_project.git
 * [new branch]      master -> master

请注意,这里不用指明完整路径(实际上,如果加上反而没用),只需要一个冒号加项目名字即可 — Gitosis 会自动帮你映射到实际位置。

要和朋友们在一个项目上协同工作,就得重新添加他们的公钥。不过这次不用在服务器上一个一个手工添加到 ~/.ssh/authorized_keys 文件末端,而只需管理 keydir 目录中的公钥文件。文件的命名将决定在 gitosis.conf 中对用户的标识。现在我们为 John,Josie 和 Jessica 添加公钥:

$ cp /tmp/id_rsa.john.pub keydir/john.pub
$ cp /tmp/id_rsa.josie.pub keydir/josie.pub
$ cp /tmp/id_rsa.jessica.pub keydir/jessica.pub

然后把他们都加进 'mobile' 团队,让他们对 iphone_project 具有读写权限:

[group mobile]
members = scott john josie jessica
writable = iphone_project

如果你提交并推送这个修改,四个用户将同时具有该项目的读写权限。

Gitosis 也具有简单的访问控制功能。如果想让 John 只有读权限,可以这样做:

[group mobile]
members = scott josie jessica
writable = iphone_project

[group mobile_ro]
members = john
readonly = iphone_project

现在 John 可以克隆和获取更新,但 Gitosis 不会允许他向项目推送任何内容。像这样的组可以随意创建,多少不限,每个都可以包含若干不同的用户和项目。甚至还可以指定某个组为成员之一(在组名前加上 @ 前缀),自动继承该组的成员:

[group mobile_committers]
members = scott josie jessica

[group mobile]
members   = @mobile_committers
writable  = iphone_project

[group mobile_2]
members   = @mobile_committers john
writable  = another_iphone_project

如果遇到意外问题,试试看把 loglevel=DEBUG 加到 [gitosis] 的段落(译注:把日志设置为调试级别,记录更详细的运行信息。)。如果一不小心搞错了配置,失去了推送权限,也可以手工修改服务器上的 /home/git/.gitosis.conf 文件 — Gitosis 实际是从该文件读取信息的。它在得到推送数据时,会把新的 gitosis.conf 存到该路径上。所以如果你手工编辑该文件的话,它会一直保持到下次向 gitosis-admin 推送新版本的配置内容为止。

http://git-scm.com/book/zh/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-Gitosis

分享到:
评论

相关推荐

    git-1.7.12.2 gitosis setuptools 软件

    Gitosis-1.7.12.2可能包含针对该服务的配置和管理工具,帮助系统管理员设置和管理多个用户的Git仓库。 Setuptools是一个Python包管理器,它扩展了Python的distutils模块,使得创建、打包和分发Python软件变得更加...

    progit-zh git官方文档-中文版

    ### Git官方文档中文版知识点概览 #### 一、起步 **1.1 关于版本控制** - **本地版本控制系统**:早期版本控制...- 本章讨论了如何在服务器上部署和管理Git仓库,以及如何利用各种协议和技术来支持远程访问和协作。

    Git-1[1].7.4-preview20110204.exe

    实际上内核开发团队决定开始开发和使用 Git 来作为内核开发的版本控制系统的时候,世界开源社群的反对声音不少,最大的理由是 Git 太艰涩难懂,从 Git 的内部工作机制来说,的确是这样。但是随着开发的深入,Git 的...

    git+repo+gerrit代码服务器搭建

    1. 使用 `sudo gitosis-init` 执行 Gitosis-init。 2. 查看 Gitosis 的配置文件 gitosis.conf,以便了解用户和权限的配置。 配置 Gitosis 配置 Gitosis,以便添加组成员: 1. 查看 gitosis.conf 文件,以便了解...

    gitosis git服务器架设软件

    git clone git@主机名:gitosis-admin.git cd gitosis-admin 9. 安装完成 通过修改gitosis-admin管理gitosis用户权限 添加公密到keydir,添加用户 修改完后commit,push到中服务器即可完成仓库权限的相关操作。 二、...

    在 Ubuntu 下搭建 git gitosis.docx

    为了控制访问权限,你需要在本地机器上克隆`gitosis-admin.git`: ```bash git clone git@your-server-ip:gitosis-admin.git ``` 编辑`gitosis-admin.git/conf/gitosis.conf`文件,定义用户组和仓库权限,如示例中的...

    Ubuntu-12.04-Server-amd64-git-gitolite安装.docx

    git clone git@ip:/home/git/repositories/gitosis-admin ``` 至此,您已经在Ubuntu 12.04服务器上成功安装了Git并配置了gitolite,可以开始管理多个用户的Git仓库并控制权限了。记住,公钥的名称将作为用户的...

    在 Ubuntu 下搭建 git gitosis.pdf

    在Git管理账户的PC上,我们需要克隆gitosis-admin.git仓库,`git clone git@IP:gitosis-admin.git`,这样就可以编辑权限设置。打开`gitosis.conf`文件,配置仓库访问权限,例如: ```conf [gitosis] gitweb = yes ...

    Git-1.7.6-preview20110708(windows版)

    实际上内核开发团队决定开始开发和使用 Git 来作为内核开发的版本控制系统的时候,世界开源社群的反对声音不少,最大的理由是 Git 太艰涩难懂,从 Git 的内部工作机制来说,的确是这样。但是随着开发的深入,Git 的...

    git代码服务器搭建步骤.pdf

    - 对于服务器上的其他用户要拥有对`gitosis-admin.git`仓库的读写权限,需要设置其仓库的钩子(hook)文件的权限。 4. **Git仓库守护进程的配置与管理** - `git-daemon-run`是一个用于管理git-daemon进程的脚本...

    Ubuntu下git服务器的搭建和基本使用[参考].pdf

    git clone git@Ubuntu_server:gitosis-admin.git 八、Git管理员修改gitosis.conf权限文档 在~/teamwork/gitosis-admin目录下有gitosis.conf文件,该文件用于管理每个仓库对不同的用户的访问权限。增加一个用户...

    Git-2.9.2-64-bit(GIT for windows)

    实际上内核开发团队决定开始开发和使用Git来作为内核开发的版本控制系统的时候,世界开源社区的反对声音不少,最大的理由是Git太艰涩难懂,从Git的内部工作机制来说,的确是这样。但是随着开发的深入,Git的正常使用...

    ubuntu 完整安装git服务器

    git clone git@192.168.1.100:gitosis-admin.git cd gitosis-admin ``` 3. **编辑 gitosis.conf 文件**: - **用户权限配置**: - 每个用户权限配置格式: ```conf [repo lrc@ubuntu] RW+ = lrc@ubuntu ``` -...

    git详解-PDF

    - **在服务器上部署Git**:包括将裸仓库移到服务器、设置权限等步骤。 - **生成SSH公钥**:为了安全地通过SSH协议进行数据传输,需要在本地生成SSH密钥对,并将公钥上传到服务器。 - **架设服务器**:包括安装必要的...

    CentOS下的Git服务器

    - 这一步会创建一个名为`gitosis-admin`的仓库,并将其克隆到用户的本地计算机上。 ``` git clone ssh://git@yourserver.example.com:2222/gitosis-admin.git ``` - 编辑`conf/gitolite.conf`文件以配置管理员...

    Ubuntu下用Gitosis搭建GIT代码服务器及Eclipse下的Git操作

    Ubuntu下用Gitosis搭建GIT代码服务器及Eclipse下的Git操作

    Win32下git客户端安装及基本使用

    cd ~/home/git/repositories/gitosis-admin.git vi gitosis.conf 将以下内容添加到gitosis.conf文件中: [gitosis-admin] members = Admin members = PcnameA PcnameB 保存退出,并执行以下命令: git add ...

    ubuntu 安装git 服务器.pdf

    首先,需要将管理员生成的公钥上传或拷贝到服务器上,然后使用 `gitosis-init` 命令来初始化 Gitosis。在初始化 Gitosis 时,需要将公钥文件传递给 `gitosis-init` 命令,例如 `sudo -H -u git gitosis-init 。 ...

Global site tag (gtag.js) - Google Analytics