设为首页 收藏本站
查看: 1214|回复: 0

[经验分享] # 基于Gitolite搭建Git Server

[复制链接]

尚未签到

发表于 2018-1-16 06:01:02 | 显示全部楼层 |阅读模式
  Git, 一个分布式的版本管理工具,我认为其革命性的点:在于改变了用户协作的方式,使得协作更简单。
  下面讲述 使用一个开源软件 Gitolite搭建一个Git Sever, 并给了一个推荐的团队协助方式。

Install Gitolite

创建 git 用户

创建一个名为 git 用户
[iyunv@server ~]# useradd git


设置密码
[iyunv@server ~]# passwd git

  
```

Download Gitolite
  

# 切换为 git 用户  
# su git
  
[git@server ~]$ cd ~
  
[git@server ~]$ git clone git://github.com/sitaramc/gitolite
  

Install Gitolite
  

# 创建 ~/bin 目录  
[git@server ~]$ mkdir bin
  
# 把 /home/git/bin 添加到环境变量里, 通过修改git 家下面的.bashrc
  
[git@server ~]$ vim .bashrc
  
# 在文件最后添加
  
export PATH=/home/git/bin:$PATH
  
# Install gitolite into $HOME/git/bin
  
[git@server ~]$ gitolite/install -ln
  
[git@server ~]$
  

  

上传客户端管理员的SSH 公钥 {#ssh_key}
  客户端如果生成ssh key, 参考: Github - Generating SSH Keys
  

  
[ahnniu@client ~] cd ~/.ssh
  
[ahnniu@client .ssh] ls -al

  
# 如果不存在>  
[ahnniu@client .ssh] ssh-keygen -t rsa -C "your_email@example.com"
  
# 复制一份id_rsa.pub并重命名为 ahnniu.pub, 注 ahnniu为 gitolite管理员的用户名

  
[ahnniu@client .ssh] cp>  
# 通过ssh上传到服务器上(/home/git/),特别注意文件的owern应该为git
  
[ahnniu@client .ssh] scp ~/.ssh/ahnniu.pub git@192.168.2.223:/home/git/
  

Setup Gitolite
  Refrence: 官方 - setting up gitolite
  

[git@server ~]$ cd ~  
# 基于提供的ahnniu.pub 创建 gitolite-admin 管理仓库
  
[git@server ~]$ gitolite setup -pk $HOME/ahnniu.pub
  
Initialized empty Git repository in /home/git/repositories/gitolite-admin.git/
  
Initialized empty Git repository in /home/git/repositories/testing.git/
  
WARNING: /home/git/.ssh missing; creating a new one
  (this is normal on a brand new install)
  
WARNING: /home/git/.ssh/authorized_keys missing; creating a new one
  (this is normal on a brand new install)
  

  至此,SSH方式的Git服务已经搭建好了

客户端SSH方式clone, push
  

# 首先需确保,上传的管理员key ahnniu.pub是在这台电脑上生成的,否则是没有权限的  
[ahnniu@client ~] git clone git@192.168.2.223:gitolite-admin.git
  
Cloning into 'gitolite-admin'...
  
remote: Counting objects: 6, done.
  
remote: Compressing objects: 100% (4/4), done.
  
remote: Total 6 (delta 0), reused 0 (delta 0)
  
Receiving objects: 100% (6/6), done.
  
Checking connectivity... done.
  

gitolite使用
  将在最后一节详细介绍。

Gitolite支持HTTP

Install Apache
  

[iyunv@server ~]# yum install httpd  

编辑http.conf,使得apache正常工作
  Apache几个重要的路径:


  • /etc/httpd/conf/httpd.conf # apache的主配置
  • /etc/httpd/conf.d/* # 扩展配置
  • /usr/sbin/apachectl # 可执行文件,用于启动,关闭apache服务
  • /var/www/ # apache文档的根目录
  • /var/www/html/ # 网页根目录
  • /var/log/httpd/ # httpd log
  

[iyunv@server ~]# /etc/httpd/conf/httpd.conf  
# 修改下面2个变量
  
Listen 192.168.2.223:80
  
ServerName 192.168.2.223:80
  

  添加一个index.html, 看是否可访问
  

[iyunv@server ~]# cd /var/www/html/  
[iyunv@server html]# vim index.html
  
# 添加以下内容.
  
Hello World!
  
# 需把index.html的所有权转为apache用户
  
[iyunv@server html]# chown apache:apache index.html
  
# 开启 httpd
  
# 这里可能会有端口被占用的一些问题,使用命令netstat 查看是哪个命令
  
[iyunv@server html]# /usr/sbin/apachectl -k start
  

  从客户端访问 http://192.168.2.223/index.html, 如果可能,说明apache安装成功

修改~/.gitolite.rc
  

[git@server ~]$ cd  
# 编辑 ~/.gitolite.rc, 设置PATH变量:(添加gitolite 所在的bin到$PATH)
  
[git@server ~]$ vim .gitolite.rc
  
# 添加下面一句道文件最__前面__
  
$ENV{PATH} .= ":/home/git/bin";
  

check which document root your Apache's suexec accepts
  

[iyunv@server ~]# suexec -V  -D AP_DOC_ROOT="/var/www"
  -D AP_GID_MIN=100
  -D AP_HTTPD_USER="apache"
  -D AP_LOG_EXEC="/var/log/httpd/suexec.log"
  -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
  -D AP_UID_MIN=500
  -D AP_USERDIR_SUFFIX="public_html"
  

在AP_DOC_ROOT 目录下创建一个bin, 供git用户执行
  

[iyunv@server ~]# install -d -m 0755 -o git -g git /var/www/bin  

在AP_DOC_ROOT 目录下创建一个git 目录 , 供 apache 用户 做 别名映射
  

[iyunv@server ~]# install -d -m 0755 -o apache -g apache /var/www/git  

在 /var/www/bin 中 添加一个 shell 脚本, 供 git用户调用 gitolite功能 : gitolite-suexec-wrapper.sh
  

[iyunv@server ~]# cd /var/www/bin  
[iyunv@server bin]# vim gitolite-suexec-wrapper.sh
  
# 内容为
  
#!/bin/bash
  
#
  
# Suexec wrapper for gitolite-shell
  
#
  

  
export GIT_PROJECT_ROOT="/home/git/repositories"
  
export GITOLITE_HTTP_HOME="/home/git"
  

  
# 为gitolite 下载目录 git clone git://github.com/sitaramc/gitolite
  
exec ${GITOLITE_HTTP_HOME}/gitolite/src/gitolite-shell
  
# git为owner
  
[iyunv@server bin]# chown git:git gitolite-suexec-wrapper.sh
  
# 修改执行权限
  
[iyunv@server bin]# chmod 0700 gitolite-suexec-wrapper.sh
  
# 查看权限有无修改正确
  
[iyunv@server bin]# ls -al
  

  NOTE: gitolite-suexec-wrapper.sh 文件中不能出现中文,包括空格,否则会出现format错误。
  
如果遇到问题,可以参考:http://stackoverflow.com/questions/14860166/solved-gitolite-and-http-error-500-permission-issue-in-setup


配置 Apache 使其可与 gitolite 工作
  

[iyunv@server ~]# cd /etc/httpd/conf.d  
# 在 conf.d 添加 gitolite的配置
  
[iyunv@server conf.d] vim gitolite.conf
  
# 内容为
  
<Directory /var/www/git>
  Options       None
  AllowOverride none
  Order         allow,deny
  Allow         from all
  
</Directory>
  

  
SuexecUserGroup git git
  
ScriptAlias /git/ /var/www/bin/gitolite-suexec-wrapper.sh/
  
ScriptAlias /gitmob/ /var/www/bin/gitolite-suexec-wrapper.sh/
  

  
<Location /git>
  AuthType Basic
  AuthName &quot;Git Access&quot;
  Require valid-user
  AuthUserFile /etc/httpd/git.passwd
  
</Location>
  

创建Git Access 认证用户信息
  我们在上面的配置:AuthUserFile /etc/httpd/git.passwd
  

[ahnniu@server ~]  cd /etc/httpd/  
# 创建git.passwd, 并创建 ahnniu的用户
  
[ahnniu@server ~] htpasswd -c git.passwd ahnniu
  
#接下来输入密码
  

Finally


  • add an R = daemon access rule to all repositories you want to make available via http.
重启apache , 测试

  gitolite log文件:/home/git/.gitolite/logs

  

[iyunv@server ~]# /usr/sbin/apachectl -k stop  
[iyunv@server ~]# /usr/sbin/apachectl -k start
  

[ahnniu@client ~] git clone http://192.168.2.223/git/testing.git  

  

团队开发过程中建议的Gitolite使用方式

Gitolite的管理方式
  我认为Gitolite是典型的吃自己的狗粮,他的管理完全是操作Git来完成, 他可以允许多个管理员同时管理,因为是基于一个git仓库,那么通过merge可以解决冲突的问题
  Gitolite有一个gitolite-admin.git的仓库, 通过操作:


  • /keydir/ 来管理SSH用户
  • /conf/gitolite.conf 来管理repo(增删,权限)
  下面我们探讨如果通过gitolite打造Github那样的Git Server.

Git仓库的几种权限

Public / Private
  Public: 仓库可以给任何人Clone,pull
  
Private: 仓库只能给指定的人Clone,pull

几种权限组


  • 权限组: Owner
  仓库的拥有者,可以对仓库做任何想做的事情,比如push, 修改其它人访问这个仓库的权限,甚至删除,至少需要有一个人


  • 权限组: RW
  可读写组, clone, push, pull


  • 权限组: R
  可读组, clone, pull
  其中 Owner包含 RW, RW权限 包含 R

准备工作
  克隆gitolite管理仓库


  NOTE: 需使用安装Gitolite指定的SSH Key对应的电脑(或者Copy 对应的>
  

[ahnniu@client ~] $ git clone git@192.168.2.223:gitlite-admin.git gitolite-admin  
[ahnniu@client ~] tree
  
├── conf
  
│   └── gitolite.conf
  
└── keydir
  └── ahnniu.pub
  

  
2 directories, 2 files
  

Gitolite的用户管理
  Refernce: Gitolite官方 - adding and removing users

用户名
  建议的用户名:尽可以由 字母,数字, - , _ 来组成,最少3个字符,不能包括#,$,@等特殊符号
  
举例: paul
  用户名的用途:


  • gitolite用于分配 repo的权限
  • HTTP可用此用户名登录,当然不仅限于(比如还可以使用邮箱登录)
  • 用户生成个人主页:比如 http://github.com/ahnniu
  • 用于标示仓库的所有者:比如 git@github.com:ahnniu/testing.git https://github.com/git/ahnniu/testing.git
SSH用户管理
  SSH协议很安全,另外,配置好之后也无需输入密码什么的,也很方便。
  假定新增 用户名: paul
  Step1: paul 在他本机电脑上:生成SSH Key
  
参考 文章的上部
  Step2: paul 把生成的 paul.pub 发给管理员,由管理员添加
  Step3: 管理员在Client端 gitolite-admin仓库,复制 paul.pub 到 ./keydir中
  Step4: 管理员commit仓库,并push, gitolite配置生效
  

[ahnniu@client gitolite-admin] git commit -m &quot;add user: paul&quot;  
[ahnniu@client gitolite-admin] git push origin
  

  Step5: 管理员可以 使用 paul 这个用户名 配件权限了

多个SSH Key
  一个人经常会有几个办公的场所/电脑,比如公司,家,笔记本,那么如果需要在这些电脑上操作Git的话,都需要配置SSH Key, 并把这些Key发给管理员添加
  建议的SSH Public Key的命名为:


  • paul@home.pub # 家里电脑
  • paul@work.pub # 公司电脑
HTTP 用户管理
  需管理员登录到服务器操作:
  

[ahnniu@server ~]  cd /etc/httpd/  
# 基于git.passwd文件, 并创建 paul的用户
  
[ahnniu@server ~] htpasswd  git.passwd paul
  
#接下来输入密码
  

删除用户
  假定删除 paul 用户,gitolite-admin仓库中


  • /conf/gitolite.conf 删除所有跟 paul
  • /keydir/ 删除 paul.pub, paul@*.pub
  • 服务器 /etc/httpd/git.passwd 中删除 paul 用户 (htpasswd -D /etc/httpd/git.passwd paul)
Gitolite的团队管理
  一个Team表示一些具备同类属性的人,如果就Git仓库来说,他们操作的是同一些Git仓库。
  
一个Team也是一个实体,他可以拥有Git仓库。Team的成员可以按照Owern, RW, R三个不同的权限分成3组。
  Github的做法:首先是一个Orignization, Orignization下再分多个Team, 每个Team对应一个权限组,或者Owern, 或者RW, 或者R, 那么这个Github下面的Team的共性在于:操作同一些Git仓库,而且具有相同的权限操作。这对大公司而言,比较合适,比如一个公司研发团队很大,又分为了研发一部,研发二部等等。
  
详细可参考:


  • Github - What's the difference between user and organization accounts?
  • Github - Permission levels for an organization repository
  对于小公司而言,直接按照我上面提到的应该更合适一些。
  在Gitolite中,推荐的团队呈现方式:
  

# coocox team owner组  
@coocox_owner =  paul
  
# coocox team 读写组
  
@coocox_rw         =  tom jim
  
# coocox team 只读组
  
@coocox_r            = alice sky
  
# 三个小组合并起来,就是coocox这个team
  
@coocox =  @coocox_owner @coocox_rw @coocox_r
  

Gitolite 仓库管理

新增一个仓库

  NOTE: 新建仓库 无需 在Server端 repositories 中 运行 git init --bare, 直接在gitolite.conf中添加下面配置语句,gitolite会帮我们做到

  

# cox 是要创建的仓库名称, 对应url: git@192.168.2.223: cox.git  
repo cox
  RW+     =   ahnniu
  R       =   @all
  

  我们看到github上的仓库命名:git@github.com:coocox/cox.git, 很清晰,一样可以看到仓库的owner, gitolite是否支持这样的? 答案是支持的。
  

# cox 是要创建的仓库名称, 对应url: git@192.168.2.223: cox.git  
# ahnniu是用户名,用户名是不可能更改的
  
repo ahnniu/cox
  RW+     =   ahnniu
  R       =   @all
  

  Refrence: Gitolite官方 - adding and removing repos

删除一个仓库


  • gitolite.conf 中找到对应的 repo , 移除
  • 登录到服务器,从 repositories中删除对应的仓库
重命名一个仓库


  • 登录到服务器,在repositories下手动重命名
  • gitolite.conf 重命名
管理一个Team的仓库
  

  
# 用于归纳
  @coocox_repo = coocox/cox  coocox/coide
  

  repo coocox/cox
  RW+     =   @coocox_owner @coocox_rw
  R       =   @coocox_r
  

  repo coocox/coide
  RW+     =   @coocox_owner @coocox_rw
  
# 除coocox team的人可Read外,paul这个个人也是可以读的
  R       =   @coocox_r   paul
  

  
# 不推荐下面 大锅饭的管理方式:
  
# 这样不允许特例的出现,比如Team下的仓库还希望可以被某个个人访问
  repo @coocox_repo
  RW+     =   @coocox_owner @coocox_rw
  R       =   @coocox_r
  
#
  

Gitolite的权限管理
  我们用到gitolite仓库的权限主要有两个:


  • RW+,仅需在对应的行 添加一个 team (@coocox_rw) 或者 个人 (paul)
  • R, 同上
  • owner, 不在gitolite仓库权限本身体现,他是gitolite权限之外的,具备管理员的某些特性,比如要删除一个操作,
更改Public / Private
  

repo ahnniu/cox  RW+     =   ahnniu
  
# R组, 添加@all 就是 Public
  
# R组, 移除 @all 就是 Private
  R       =   @all
  

Refrence


  • ProGit - Gitolite安装
  • Gitolite 官方安装文档
  • gitolite.conf 语法

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-435527-1-1.html 上篇帖子: 用git下载android源码 下篇帖子: Myeclipse10安装git 完美解决
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表