#########################################################################

                                          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 常见的用户规则

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

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

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

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

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

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

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

 

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(学习之四)服务器常见操作