您的位置:首页 > 其它

Git 服务器(gitolite)ssh协议的搭建

2015-10-17 11:38 453 查看
#########################################################################
qq:1218761836
qq群:150181442
#########################################################################
目录
Git 服务器(gitolite)的搭建... 2
1.1 Git-Gitolite 服务器搭建... 2
1.2 创建用户... 3
1.3 Clinet1. 3
1.3 server 安装gitlote. 4
1.4 管理员克隆gitolite-admin 管理库... 5
1.5 添加用户... 6
1.6 测试端测试!... 7
1.7 添加用户组... 7
1.8 在clinet2 测试... 8
1.9 gitolite.conf 文件详解... 8
2.0 客户端的配置... 11
2.1 查看远程分支... 12
2.2 创建分支... 12
2.3 切换分支... 13

Git 服务器(gitolite)的搭建

远程仓库通常只是一个纯仓库(bare repository)—一个没有当前工作目录的仓库。因为该仓库只是一个合作媒介,所以不需要从一个处于已从硬盘上检出状态的快照;仓库里仅仅是git的数据。更简单的说,纯仓库是你的项目里的.git内容。
开始架设git服务器的时候,需要把一个现存的仓库导出为新的纯仓库—不包含当前工作目录的仓库。方法很简单。把一个仓库克隆为纯仓库,可以使用clone命令的--bare选项。纯仓库的目录名以.git 结尾。
Git服务器搭建根据自己的需求选择不同的协议
Git支持http:// git:// ssh:// https:// file:// (本地)
ssh://[user@]host.xz[:port]/path/to/repo.git/
git://host.xz[:port]/path/to/repo.git/
http[s]://host.xz[:port]/path/to/repo.git/
ftp[s]://host.xz[:port]/path/to/repo.git/
rsync://host.xz/path/to/repo.git/

1.1 Git-Gitolite 服务器搭建

SSH协议的地址格式可以使用两种不同的写法,第一种是使用ssh:// 开头的标准的SSH协议的URL写法,另外一种是SCP格式的写法。 但是对于非标准SSH端口(非22端口),可以通过URL给出端口号。
采用公钥认证,无需输入口令。
使用SSH认证的话,需要所有的账号共享一个用户 ,创建一个公共账号来管理,这种模式的认证会造成只有一个用户提交删除,很容易导致问题,所以这种模式在企业中很少使用。
SSH缺点
对用户授权不能精细化,
在git 服务管理工具这个领域,主要有三种流行方案,它们分别是
Gitosis -轻量级,开源项目,使用SSH公钥认证,只能做到库级别的权限控制,目前项目已经停止开发,不再维护
Gitolite 轻量级,开源项目,能够做到分支级别权限控制。
Git+repo+gerrit 超级重量级,集版本控制,库管理和代码审核为一身,可管理大型及超大型项目。
Gitolite 是一款perl语言开发的git服务器管理工具,通过公钥对用户进行认证,并能够通过配置文件对写操作进行分支和路径的精细授权,gitolite 采用的是SSH协议并且使用SSH公钥认证。
Git协议之间的选择
HTTP
Git-daemon
SSH
Gitosis/gitolite
服务器搭建
简单
麻烦
简单
复杂
匿名读取
支持
支持


身份认证
支持

支持
支持
版本库写操作
支持
不支持
支持
支持
企业授权支持



支持
远程建库



支持
SSH公钥认证
实际上标准SSH,也可以使用公钥认证的方式实现所有用户共同一个账号,不过这类似于把一个公共账号的登陆口令同时告诉给多人。
Git-gitolite 搭建
Gitolite的安装很简单,安装方法也很多,具体可以查看gitolite文档,我参看git提供的快速安装文档来搭建
参考资料 http://git-scm.com/book/zh/v1/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-Gitolite
http://gitolite.com/gitolite/
gitolite http://gitolite.com/gitolite/gitolite.html 在线文档
gitolite 可以结合ssh 或者http(s)来搭建,下面主要采用gitolite+ssh 来搭建
备注:本次gitolite 服务器搭建我使用了三台机器 server clinet1 client2
1.2 创建用户Server:
[root@wx-a /]# useradd git
[root@wx-a /]# passwd git
Changing password for user git.
New password:
BAD PASSWORD: it is based on a dictionary word
Retype new password:
passwd: all authentication tokens updated successfully.
1.3 Clinet1创建用户并将公钥上传到server端
[root@wx /]# useradd wx
[root@wx /]# passwd wx
Changing password for user wx.
New password:
BAD PASSWORD: it is based on a dictionary word
Retype new password:
passwd: all authentication tokens updated successfully.
[wx@wx ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/wx/.ssh/id_rsa):
Created directory '/home/wx/.ssh'.
……………………………………………………………….
[wx@wx ~]$ mv /home/wx/.ssh/id_rsa.pub /home/wx/.ssh/wx-0-89.pub 将公钥改为主机+后两位ip地址
将公钥传到服务器的git用户下
[wx@wx ~]$ scp /home/wx/.ssh/wx-0-89.pub git@20.0.0.88:/home/git
The authenticity of host '20.0.0.88 (20.0.0.88)' can't be established.
RSA key fingerprint is e9:17:96:95:cf:13:6d:c0:8d:5d:04:4e:bf:e2:ff:90.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '20.0.0.88' (RSA) to the list of known hosts.
git@20.0.0.88's password:
wx-0-89.pub 100% 387 0.4KB/s 00:00
1.3 server 安装gitlote[git@wx-a ~]$ ll
total 4
-rw-r–r--. 1 git git 387 Oct 16 07:13 wx-0-89.pub
[git@wx-a ~]$ git clone git://github.com/sitaramc/gitolite 下载gitolite源码
Initialized empty Git repository in /home/git/gitolite/.git/
remote: Counting objects: 8960, done.
Remote: Total 8960 (delta 0), reused 0 (delta 0), pack-reused 8960
Receiving objects: 100% (8960/8960), 3.68 MiB | 16 KiB/s, done.
Resolving deltas: 100% (5107/5107), done.
[git@wx-a ~]$ ll
total 8
drwxr-xr-x. 6 git git 4096 Oct 16 07:19 gitolite # 下载的源码
-rw-r–r--. 1 git git 387 Oct 16 07:13 wx-0-89.pub
安装说明
[git@wx-a ~]$ vim gitolite/README.markdown 这个文件当中还有具体的权限管理使用说明
[git@wx-a ~]$ mkdir –p ${HOME}/bin
[git@wx-a ~]$ ${HOME}/gitolite/install –to ${HOME}/bin
use the following full path for gitolite:
/home/git/gitolite/src/gitolite
# 这会将gitolite命令添加到用户的主目录中去
[git@wx-a ~]$ cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
[git@wx-a ~]$ which gitolite
~/bin/gitolite
[git@wx-a ~]$ ${HOME}/bin/gitolite setup –pk wx-0-89.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)
Gitolite 安装完毕
添加git项目,用户设置git项目的访问权限
如果你的服务器对SSH的权限做了限制,例如只有git用户组里用户才可以SSH服务器,需要添加git用户以后的gitolite的用户到git用户组,否则克隆git项目时,将需要提示输入密码
1.4 管理员克隆gitolite-admin 管理库[wx@wx ~]$ git clone git@20.0.0.88:gitolite-admin.git
Initialized empty Git repository in /home/wx/gitolite-admin/.git/
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.
Drwxrwxr-x. 2 wx wx 4096 Oct 16 07:55 keydir
[wx@wx ~]$ ll gitolite-admin/conf/
total 4
-rw-rw-r--. 1 wx wx 79 Oct 16 07:55 gitolite.conf
conf/gitolite.conf 用户git项目配置,访问权限设置
keydir/ 用户存储用户的SSH public key(公钥)
参考资料需要去服务器查看下载gitolite源码的README.markdown 文件里面有具体安装操作使用说明
[wx@wx gitolite-admin]$ cat conf/gitolite.conf
repo gitolite-admin
RW+ = wx-0-89
repo testing
RW+ = @all
[wx@wx gitolite-admin]$
gitolite-admin
即本地库(gitolite管理版本库)只有管理员有读写和强制更新的权限
testing
缺省设置的测试版本库,设置为任何人都可以读写以及强制更新。
RW 代表读写,+ 代表是管理员,后面跟着是用户,但是gitolite.conf 中的用户与keydir中的公钥要对应,否则ssh认证就有问题了。
[wx@wx gitolite-admin]$ ll keydir/
total 4
-rw-rw-r--. 1 wx wx 387 Oct 16 07:55 wx-0-89.pub
1.5 添加用户打开一个client2
[root@mysql ~]# useradd php
[root@mysql ~]# passwd php
Changing password for user php.
New password:
BAD PASSWORD: it is based on a dictionary word
Retype new password:
passwd: all authentication tokens updated successfully.
[root@mysql ~]# su – php
[php@mysql ~]$ ssh-keygen –t rsa
………………………………………………….
[php@mysql ~]$ mv /home/php/.ssh/id_rsa.pub /home/php/.ssh/php-0-35.pub
[php@mysql ~]$ scp /home/php/.ssh/php-0-35.pub wx@20.0.0.89:/home/wx/gitolite-admin/keydir # 拷贝公钥到git管理员的服务器。
The authenticity of host ‘20.0.0.89 (20.0.0.89)’ can’t be established.
RSA key fingerprint is e9:17:96:95:cf:13:6d:c0:8d:5d:04:4e:bf:e2:ff:90.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘20.0.0.89’ (RSA) to the list of known hosts.
wx@20.0.0.89’s password:
php-0-35.pub 100% 391 0.4KB/s 00:00
在管理员的git上查看
Clinet1:
[wx@wx keydir]$ ll
total 8
-rw-r–r--. 1 wx wx 391 Oct 16 19:32 php-0-35.pub
-rw-rw-r--. 1 wx wx 387 Oct 16 07:55 wx-0-89.pub
[wx@wx keydir]$ vim ../conf/gitolite.conf
repo gitolite-admin
RW+ = wx-0-89
repo testing
RW+ = @all
repo admin
RW = php-0-35 #注意这里的用户名称要和keydir 下的公钥名称一样,否则会提示没有权限
添加完用户之后需要提交
[wx@wx gitolite-admin]$ git add conf
[wx@wx gitolite-admin]$ git add keydir
[wx@wx gitolite-admin]$ git commit –m “add admin,user php”
[master 5ff7ad8] add admin,user php
1 files changed, 3 insertions(+), 1 deletions(-)
[wx@wx gitolite-admin]$ git push # 同步到服务器
Counting objects: 20, done.
Compressing objects: 100% (13/13), done.
Writing objects: 100% (16/16), 1.63 KiB, done.
Total 16 (delta 1), reused 0 (delta 0)
remote: Initialized empty Git repository in /home/git/repositories/admin.git/
To git@20.0.0.88:gitolite-admin.git
f48af3c..5ff7ad8 master -> master
1.6 测试端测试!Client2:
[php@mysql ~]$ git clone git@20.0.0.88:admin.git
Initialized empty Git repository in /home/php/admin/.git/
warning: You appear to have cloned an empty repository.
[php@mysql admin]$ git remote –v
origin git@20.0.0.88:admin.git (fetch)
origin git@20.0.0.88:admin.git (push)
可以看出我并不是ssh:// 协议。通过网友指导原来是我访问的方式不对
[php@mysql ~]$ git clone ssh://git@20.0.0.88/admin.git
Initialized empty Git repository in /home/php/admin/.git/
warning: You appear to have cloned an empty repository.
[php@mysql admin]$ git remote –v
origin ssh://git@20.0.0.88/admin.git (fetch)
origin ssh://git@20.0.0.88/admin.git (push)
[php@mysql admin]$
1.7 添加用户组和版本库[wx@wx gitolite-admin]$ cat conf/gitolite.conf
#add php group
@kaifa_php = php-0-35 wx-0-89
repo gitolite-admin
RW+ = wx-0-89
repo testing
RW+ = @all
repo admin
RW = @kaifa_php
[wx@wx gitolite-admin]$ git add conf
[wx@wx gitolite-admin]$ git commit –m “add group_php”
[master 1a71425] add group_php
1 files changed, 5 insertions(+), 1 deletions(-)
[wx@wx gitolite-admin]$ git push
Counting objects: 7, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 420 bytes, done.
Total 4 (delta 0), reused 0 (delta 0)
To git@20.0.0.88:gitolite-admin.git
f3bed26..1a71425 master -> master
1.8 在clinet2 测试[php@mysql ~]$ git clone ssh://git@20.0.0.88/admin.git
Initialized empty Git repository in /home/php/admin/.git/
warning: You appear to have cloned an empty repository.
[php@mysql ~]$ cd admin/
[php@mysql admin]$ git remote –v
origin ssh://git@20.0.0.88/admin.git (fetch)
origin ssh://git@20.0.0.88/admin.git (push)
客户端查看命令帮助
[php@mysql admin]$ git clone ssh://git@20.0.0.88 –help
在服务器上查看版本库的存放位置
[git@wx-a ~]$ tree -L 2
.
├── bin 安装的gitolite目录
│ ├── commands
│ ├── gitolite
│ ├── gitolite-shell
│ ├── lib
│ ├── syntactic-sugar
│ ├── triggers
│ ├── VERSION
│ └── VREF
├── gitolite 下载的源码目录
│ ├── CHANGELOG
│ ├── check-g2-compat
│ ├── contrib
│ ├── CONTRIBUTING
│ ├── convert-gitosis-conf
│ ├── COPYING
│ ├── install
│ ├── README.markdown 基本说明(安装、添加用户等等,新手必看)
│ ├── src
│ └── t
├── projects.list
├── repositories 版本库提交之后存放的位置
│ ├── admin.git
│ ├── gitolite-admin.git
│ └── testing.git
└── wx-0-89.pub 之前将客户端的公钥scp 的位置
1.9 gitolite.conf 文件详解[wx@wx conf]$ cat gitolite.conf
#add php group
@kaifa_php = php-0-35 wx-0-89
repo gitolite-admin
RW+ = wx-0-89
repo testing
RW+ = @all
repo admin
RW = @kaifa_php
1.9.1 基本语法如上例所示的语法是相当简单明了
1. 一般情况下,一切都是空格分隔,没有逗号、分号等,在语法中。
2. 组名称就像简单的用户名(即,没有电子邮件地址)但开始以@符号。
3. Reponames 可包含/ 个字符(对权限管理细化)
1.9.2 包括文件Gitlite允许配置成多个文件并将他们含在主文件中为方便
include “repo.conf”
通过匹配符(include ”*.conf”)或包含文件放入子目录”conf”(include “repo/bar.conf”)或
(include “repos“/*.conf )
1.9.3 组定义2. 模板一
@developers = dilbert alice wally
3. 模板二
@developers = dilbert alice wally
@interns = ashok php
@admin = @develo @interns
@develo = java
4. 模板三 (用户组和版本库组)
@developers = dilbert alice wally
@foss-repos = git gitolite
repo @foss-repos
RW+ = @developers
~
1.9.3 访问规则设置访问规则决定是否允许或拒绝特定的访问。访问权限由四块数据定义”reponame, 用户名,操作和ref”每条规则也有四个类似数据片。
1.9.4 权限字段权限字段给出这个规则行允许的访问类型。最常用的权限是
R, 允许读取操作
RW, 允许读写,或创建新分支/标记
RW+,管理员权限,删除分支或标记
-(减号), 拒绝访问
Refex字段 匹配的是perl正则表达式
如果没有refex提供,则默认为refs/.*,例如,在一个像这样的规则:
RW = alice
无法启动与refex refs/ 首先假定refs/heads/ 。 这意味着正常分支可以这样方便地写:
RW master = alice
#becomes ‘refs/heads/master’ internally
虽然标签将需要完全限定
RW refs/tags/v[0-9] = bob
1.9.5 常见的用户规则














2.0 客户端的配置[php@mysql admin]$ git config –global user.name “php-0-35”
[php@mysql admin]$ git config –global user.email php-0-35@example.com
[php@mysql admin]$ git config –list
user.name=php-0-35
user.email=php-0-35@example.com
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
remote.origin.url=ssh://git@20.0.0.88/admin.git
branch.master.remote=origin
branch.master.merge=refs/heads/master
[php@mysql admin]$ git config user.name
php-0-35
同步远程数据到本地
[php@mysql admin]$ git remote –v
origin ssh://git@20.0.0.88/admin.git (fetch)
origin ssh://git@20.0.0.88/admin.git (push)
[php@mysql admin]$ git fetch origin
# orgin 是一个远程分支,首先我们搭建好之后并没有同步远程数据到本地,我们看到的这是一个指针,不能修改和移动,如果需要修改和移动分支的数据,需要将远程分支同步到本地
http://git-scm.com/book/zh/v1/Git-%E5%88%86%E6%94%AF-%E8%BF%9C%E7%A8%8B%E5%88%86%E6%94%AF
2.1 查看远程分支[php@mysql admin]$ git remote show
origin
git branch -r查看远程分支
git branch 查看本地分支
git branch -a列出本地和远程分支
2.2 创建分支[php@mysql admin]$ git branch test
fatal: Not a valid object name: 'master'.
报错,根据这个错误,git在创建分支前需要提交一次
提交
[php@mysql admin]$ touch aa
[php@mysql admin]$ git add aa
[php@mysql admin]$ git commit -m "add aa"
[master (root-commit) fff7119] add aa
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 aa
提交成功,
继续查看远程分支
[php@mysql admin]$ git branch -a
* master
[php@mysql admin]$
[php@mysql admin]$ git branch test # 创建test分支
[php@mysql admin]$ git branch #显示的是本地分支
* master
test
[php@mysql admin]$
将本地的分支同步到服务器
[php@mysql admin]$ git push origin test
Counting objects: 3, done.
Writing objects: 100% (3/3), 199 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://git@20.0.0.88/admin.git
* [new branch] test -> test
[php@mysql admin]$ git branch -a # -a 列出本地和远程分支
* master
test
remotes/origin/test
[php@mysql admin]$ git branch -v
* master fff7119 add aa
test fff7119 add aa
2.3 切换分支[php@mysql admin]$ git checkout test
Switched to branch 'test'
Git服务器的具体操作请等待git(学习之四)服务器常见操作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  center style hidden