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

Gitolite轻松部署/管理git server

 
阅读更多

对于今天越来越受欢迎的Git,相信做开发的朋友都基本有所耳闻。它最大的便利就是分布式的开发库,让使用git作为源码管理库的开发者可以在本地提交代码的修改而不用提交到远程的库,同时需要和团队协作、同步代码时,也仅仅是多一条指令而已。如果你想了解git的全貌,可以看《Pro git》,他有中文版,貌似没有维护到最近的,需要的可以google it。

Git 使用者的日常流程:

1、从git server远程库上clone一个副本到本地库(git clone),

2、本地开发,然后本地提交修改(git add 改动的文件;git commit 提交);无限循环这个周期。

3、第3、4步是和服务器同步。先把远程库的改动抓下来,本地解决版本合并有问题的地方(git pull)

4、然后把合并后的本地代码库提交到远程库(git push);按你的团队计划,也许每天一次。

5、另外,user除了与服务器同步外,也可以与其他协作者直接同步;如上图左和中间的头像标示。

以下介绍的,是使用gitolite管理git server,进行源代码的团队协作。本文的读者最好有linux的经验。

Gitolite介绍

其实,每一个Git库只需要–bare -shared就可以简单实现类似共享代码库服务器的功能,在git的世界,代码都是自由share的,每个人扮演的角色,和linux系统赋予这个用户的权限有关。但如果采用这种SSH authorized_keys的方式,直接系统通过shell进行 git clone的方法,会缺少了一项很必须的权限管理——每个用户对某个repository中所有项目均拥有完整的读写权限(可通过linux系统的权限设定,但依然麻烦),如果在一些大项目,涉及到多种角色权限,并要指定访问路径时,直接管理authorized_keys的方式,就显得力不从心,试想一下如果你要管理超过1000号人的authorized_keys?

Gitolite,是一套用来管理 authorized_keys 文件的,为git server实现了细粒度的访问控制的perl脚本。它的官方网址是: http://github.com/sitaramc/gitolite,起先,gitolite受到gitosis的影响而开发,其命名就是gitosis+lite的意思,轻量版的gitosis,目标是打造比gitosis更人性化和更稳定的软件套件。如今,gitolite不仅早已超过它的前辈gitosis,还占据了众多大型开源社区的一席之地,由它为git server管理着代码仓库的ACL,其中包括Fedora社区(管理着超10000个仓库)、KDE社区、Gentoo社区、MeeGo社区以及Kernel.org。Gitolite进行用户管理和访问控制设定的方法,是通过管理一个指定的 Git 仓库来实现。你只需要在这个指定的仓库内做好相应的设定,然后推送到服务器上,Gitolite就会随之改变运行策略。

Gitolite安装步骤

gitolite的安装其实非常简单,官方网址上给出的quick install仅仅4步,需要的可以看这里。另外,gitolite也有多种安装模式,例如

1、使用安装包自动安装; apt-get install / yum install

2、使用root帐号手动安装为全局应用,这样每一个服务器上的用户都可以开设代码仓库;

3、或手动在指定的普通用户帐号下安装。

以下的安装使用上述第三种方法,这样会最小程度“污染”你的server运行环境,并且能随时更新到最新版本的gitolite。

安装环境

1、假设我们现在有两台机器,server and client;

2、我们指定管理git server的管理员叫sunny;

3、并有一个普通的client user帐号jacob

下面的步骤,只是step-by-step的how-to,没有太多的why,如果要详细研究,请看gitolite的官方文档,或蒋鑫的编著《git权威指南》。

另外,gitolite的安装,会依赖git,如果你的服务器上还没安装git套件,请先自行安装。

for deb系: apt-get install git-core 或 apt-get install git

for RH系: yum install git

步骤

1.先登录到服务器,让root新建一个gituser帐号,因为我们希望源代码仓库放在服务器的普通帐号下:

root@server# adduser --system --shell  /bin/bash --group gituser

2.给用户gituser设定密码,在SSH公钥建立后可以把这个密码禁掉

root@server# passwd gituser

3.管理员在本地创建一个ssh key pair对

sunny@client$ ssh-keygen

如果你不想影响本机现有的一些key pair,可用-f参数

sunny@client$ ssh-keygen -f sunny_key

4.推送管理员的公钥到remote server

sunny@client$ ssh-copy-id -i ~/.ssh/id_rsa.pub  gituser@server

如果是用带有-f参数生成的,注意这里要指向正确的文件

5.以gituser用户身份登录到服务器上

sunny@client$ ssh gituser@server

6.执行

gituser@server$ mv .ssh/authorized_keys sunny.pub

7.下载源码安装,或自动安装;推荐源码安装,也就三个命令;如install时候提示git版本too old, 可以下载旧版本的gitolite,例如2.1的,或者1.5.9之后的,如需要下载旧版本,点击这里

gituser@server$ git clone git://github.com/sitaramc/gitolite #下载源码
gituser@server$ gitolite/src/gl-system-install  #如果提示git too old,请下载旧版本的gitolite
gituser@server$ gl-setup -q ~/sunny.pub

执行gl-setup时几点注意:

gl-setup要放到$PATH,请确定~/bin已放在PATH变量,如没有,请编辑~/.bashrc,最后面添加

PATH=~/bin:$PATH

并执行以下命令生效:

sh ~/.bashrc

旧版本的gl-setup,没有-q参数,如使用旧版本gitolite(例如1.5.9),直接赋参数即可

gituser@server$ gl-setup ~/sunny.pub

8.直接package管理工具安装 (如不需要的请跳过)

gituser@server$ sudo apt-get install gitolite或gituser@server$ sudo yum install gitolite

如果不能sudo,请登录到root帐号再执行安装

Gitolite的管理及权限设定

gitolite的管理,包括用户管理和代码库管理,都是通过操作一个指定名称的库来实现:gitolite-admin仓库。因此gitolite的管理员sunny需要先把这个库抓到本地,进行必要的配置后,再push到remote 服务器,让设定生效:

抓取gitolite-admin仓库到本地

sunny@client$ git clone gituser@server:gitolite-admin
sunny@client$ cd gitolite-admin

1. 新增用户

先要获取待加用户(jacob)的pubkey,如果不知道怎么获取,请让jacob参考上述第三步生成他自己的id_rsa.pub

sunny 把用户jacob的pubkey,放到gitolite-admin/keydir目录,并重命名为jacob.pub

... 
# 前提是sunny通过email、QQ、MSN等任意的方法,获取了jacob的pubkey并放到了keydir目录
# 此例中,jacob给过来的是pubkey是id_rsa.pub,如果给来的是jacob.pub则跳过这步
sunny@client:~/gitolite-admin/keydir$ mv id_rsa.pub jacob.pub

执行add, commmit, push进行推送,即可

sunny@client:~/gitolite-admin$ git add .
sunny@client:~/gitolite-admin$ git commit -m "add jacob pubkey"
sunny@client:~/gitolite-admin$ git push

此时jacob已增加到gitolite,但是,除了系统自带的testing库外,他操作不了其他的库

2. 新增并设定代码库

现在要在remote server新建一个代码仓proj,依然是对gitolite-admin进行配置

编辑gitolite-admin/conf/gitolite.conf,仿照以后的库的格式,添加:

repo proj_a      # 这里设定是新增库的名称
  RW+ = sunny    # R是读权限,W是写权限,+是包括“强制更新一个分支,删除分支和更新一个Tag”的权限
  RW = jacob     # 设定RW权限的人

执行add, commmit, push进行推送,即可

sunny@client:~/gitolite-admin$ git add.
sunny@client:~/gitolite-admin$ git commit -m "add a new repo"
sunny@client:~/gitolite-admin$ git push

gitolite.conf的格式其实有相当多的复杂配置(详情请看官方手册),一般来说,象以下这样的,已够几个人的开放型小团队使用,例如:

@proj_a         = sunny jacob              # @proj_a是分组命名,分组用@表示,可以在后面引用分组
@proj_b         = sunny taylor jean        # 如果有多个用户,用空格隔开

@admins = sunny
@qa = elapse flora
@engineers = sunny jacob taylor jean
@staff = @admins @qa @engineers # 分组可以被引用

repo gitolite-admin # 这个是gitolite的管理仓库,sunny是指定可以对其进行操作的管理员
RW+ = sunny

repo proj_a
RW+ = @admins
RW = @proj_a elapse

repo proj_b
RW+ = sunny
RW = @engineers flora
R refs/tags/ = @qa # 这里设定的,是QA这个组,对refs/tags/开头的路径的文件只有读权限

repo testing
RW+ = @stall

3. 普通用户签出操作

例如jacob要把代码库checkout出来,本地修改,然后再和remote库的代码进行版本合并。这些操作是纯粹的git操作了,团队的日常开发流程,正是这样子开展。请参阅本文一开头的那副git工作流程图,以下是几种不同情况的用户签出。

把remote库抓取下来,然后才开始修改

jacob@client:~$ git clone gituser@server:proj_a    # 项目默认放到proj_a目录
或
jacob@client:~$ git clone gituser@server:proj_a my_proj_a    # 项目被下载到my_proj_a目录下

jacob本地已有一个现成的项目proj_a正在开发,并用git在管理着,现在想share到这个项目到proj_a

jacob@client:~$ cd proj_a
jacob@client:~/proj_a$ git push --all gituser@myserver:proj_a   # 推送到remote server

如果希望在当前目录使用一个已有的库(即合并项目),那样比较复杂,要采取非常规方法,替换.git/config文件才行

4.删除用户

管理员在本地,删除了gitolite-admin/keydir目录下对应的用户pubkey,然后执行git 的rm操作,再 commit, push推送,即可

sunny@client:~/gitolite-admin$ rm -f keydir/jacob.pub
sunny@client:~/gitolite-admin$ git rm keydir/jacob.pub
sunny@client:~/gitolite-admin$ git commit -m "delete a user"
sunny@client:~/gitolite-admin$ git push

5. 删除代码库

gitolite没有删除repo的代码,如要删除repo,管理员要分两步走:

本地编辑gitolite-admin/conf/gitolite.conf,删除相关的repo代码,然后add, commit, push推送

sunny@client:~/gitolite-admin$ git add .
sunny@client:~/gitolite-admin$ git commit -m "remove a repo"
sunny@client:~/gitolite-admin$ git push

用gituser帐号或root帐号进入服务器,把gituser/repositories下相关的repo目录删除

root@server:/home/gituser/repositories$ rm -Rf proj_a.git  # 库对应proj_a的目录,带.git结尾

6. 修改代码库的名字

改名,也是分两步,和上面执行删除的顺序反过来,

先用gituser帐号或root帐号进入服务器,cd repositories,执行移动

root@server:/home/gituser/repositories$  mv proj_a.git proj_b.git

回到客户端,修改conf/gitolite.conf,把old-name的地方修改为new-name,然后add, commit并push

7. 列出本人拥有权限的库

使用普通用户jacob的帐号尝试登录remote服务器即可,

jacob@client:ssh gituser@server

例如会返回:

hello jacob, the gitolite version here is 1.5.4-2+squeeze1~bpo50+1 (Debian)
the gitolite config gives you the following access:
     R  W    proj_a
    @R @W    testing
Connection to 192.168.0.101 closed.

上面列出的proj_a和testing,就是用户jacob所能操作的库,并都拥有R和W的权限。

附记

如果你对ssh很熟悉的话,gitolite的安装与使用,那是问题不大的。若你对ssh和git两者都不十分了解,使用起来可能会不算顺利。本文是gitolite配置使用的step-by-step,对于配置文件gitolite.conf,以及gitolite所支持的强大权限管理、路径正则匹配、user命名空间、和gitweb整合、委托管理以及代码库镜像备份等等,都没有叙述。如果你需要这些进阶知识,推荐看官方的帮助文档,以及《gitolite构建git服务器一文》。

 

分享到:
评论

相关推荐

    企业级Git Server服务的部署与应用1

    --with-gitconfig=/usr/local/git/etc/gitconfig \ --with-gitattributes=/usr/local/git/etc/gitattributes \ --with-editor=/usr/bin/vim \ --with-expat \ --with-shell=/bin/bash \ --with-perl=/usr/bin/...

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

    5. gitolite将在/home/git目录下创建`repositories`和`projects.list`,并有一个名为`gitolite-admin.git`的管理库,用于添加用户和配置权限。要更改gitolite的默认仓库路径,修改`.gitolite.rc`文件。 6. 在客户端...

    gitolite服务器搭建

    将 `/data/git` 目录的所有权更改为 `gitolite` 用户,并设置合适的权限。 ```bash sudo chown -R gitolite:gitolite /data/git sudo chmod -R 755 /data/git ``` **7. 切换到Gitolite用户** 接下来,我们需要...

    gitolite-git-lfs:用于 git-lfs 集成的示例 gitolite 命令(适用于 django-git-lfs)

    gitolite-git-lfs 这是 gitolite 的概念证明 git-lfs 存储服务器助手。 它已被编写为与 django-git-lfs 配合使用,请参阅: : 要求 Gitolite Perl:JSON 和 LWP (HTTP) 安装 在 gitolite 中设置 LOCAL_CODE。 ...

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

    2. 进入源码目录,执行安装命令:`cd gitolite/src && ./gl-easy-install git server admin`,这里的`git`是服务器上的用户ID,`server`是服务器IP或域名,`admin`是管理员ID。 3. 或者,使用更新的安装方式:`sudo ...

    gitolite-meteor:使用 git hook、gitolite 部署meteor - git storage

    此脚本安装 gitolite,在您可以配置构建 Meteor 应用程序的 githook 后,将其放置在/webapp/<YOURGITUUSER>/apps/<APPNAME>/app/ ,并将 nodejs 放置在/webapp/<YOURGITUUSER>/apps/<APPNAME>/node/工作流程在这个...

    搭建git服务器

    scp ~/.ssh/id_rsa.pub git@your_server:/home/git/ ``` - 在服务器上使用管理员的公钥初始化Gitolite。 ```bash gitolite setup --force ``` 5. **配置管理与项目添加** - 管理员从服务器克隆管理员仓库`...

    <Pro Git>中文版、Git+Gitolite_TortoiseGit、git学习文档

    无论是通过《Pro Git》中文版深入理解Git的工作机制,还是利用Gitolite进行权限管理,或是借助TortoiseGit简化操作,这些资料都将帮助你成为Git的专家。而Git学习文档则作为辅助,确保你在遇到问题时能找到解答,...

    在AmazonEC2上使用gitolite和Ubuntu运行私有的集中式Gi.zip

    编辑`gitolite/conf/gitolite.conf`文件,为每个团队成员设置仓库访问权限。这里你可以定义仓库、用户组以及他们可以执行的操作(如只读或读写)。 安装gitolite并初始化: ```bash ./install -to ~/ ``` 最后,...

    GIT服务器 Gitolite.zip

    Git服务器Gitolite是搭建基于Git的分布式版本控制系统的一个强大工具,它允许用户轻松地管理和控制对Git仓库的访问权限。Git自身虽然提供了强大的版本控制功能,但对用户权限的管理相对简单,不适合大规模协作环境。...

    git创建服务器端

    git remote add origin http://yourserver.com/git/yourrepo.git ``` 2. 将本地仓库推送到远程仓库: ``` git push -u origin --all ``` 七、协同开发与版本管理 1. 开发者可以从远程仓库克隆代码: ``` git...

    Git权威指南PDF完整版

    30.2 管理 Gitolite/ 419 30.2.1 管理员克隆 gitolite-admin 管理库/ 419 30.2.2 增加新用户/ 420 30.2.3 更改授权/ 422 30.3 Gitolite 授权详解/ 423 30.3.1 授权文件的基本语法/ 423 30.3.2 定义用户组和版本库组/...

    ubuntu系统搭建git+gitolite实现git权限管理手册

    ubuntu系统搭建git+gitolite实现git权限管理手册,目前内网上讲的git+gitolite的帖子有很多,但大部分说的不是很清楚,按照他们的方法搭建可能会踩坑,文内的方法已亲测有效,如有问题可以及时反馈!

    在centos下搭建 git+gitolite 安装和部署

    讲速了 在centos 下搭建git服务器 用gitolite 来管理权限 很经典 值得拥有

    linux gitoliter-v3.5x安装配置

    ~/gitolite/install-to ~/bin ``` - 复制公钥文件: ```bash cp ~/.ssh/id_rsa.pub ~/git.pub ``` - 执行设置脚本: ```bash ~/bin/gitolitesetup -pk ~/git.pub ``` 安装完成后,系统会提示初始化两个Git...

    Gitolite构建Git服务器

    Gitolite是一个用于管理分布式Git服务器的工具,特别适合于需要精细控制用户权限和版本库访问的企业级场景。以下是从安装到管理Gitolite的全流程指导: **安装Gitolite** - **服务器端创建专用帐号**:为了安全...

    gitolite-to-stash-converter:小型bash脚本,它将所有Repos从Gitolite或任何其他Git Server转换为新的Stash实例

    小型bash脚本,它将所有Repos从Gitolite或任何其他Git Server转换为新的Stash实例。 博客文章: ://tommyziegler.com/how-to-migrate-gitolite-or-other-git-server-repos-to-stash-automatic/ 复制存储库: $ ...

    GIT+Gitolite_TortoiseGit

    根据给定的文件信息,我们可以提炼出以下几个关键的IT知识点,主要围绕着Git、Gitolite和TortoiseGit的使用、配置以及管理: ### 1. Git介绍及使用 **Git**是一种分布式版本控制系统,最初由Linux内核开发者Linus ...

    基于gitolite 搭建Git服务器

    Git服务端的搭建需要多用户协作及其权限控制等功能,这需要用户管理权限控制组件的支持,目前这类组件主要有两类:Gitosis和Gitolite。 Gitosis起初功能强大,但于09年不再更新。 Gitolite原本是作为Gitosis的lite...

Global site tag (gtag.js) - Google Analytics