# 基於Gitolite搭建Git Server - 支持SSH&HTTP

Git, 一個分佈式的版本管理工具,我認爲其革命性的點:在於改變了用戶協做的方式,使得協做更簡單。html

下面講述 使用一個開源軟件 Gitolite搭建一個Git Sever, 並給了一個推薦的團隊協助方式。git

Install Gitolite

建立 git 用戶

建立一個名爲 git 用戶

[root@server ~]# useradd gitgithub

設置密碼

[root@server ~]# passwd git
```shell

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 Keysapache

[ahnniu@client ~] cd ~/.ssh
[ahnniu@client .ssh] ls -al
# 若是不存在 id_rsa, id_rsa.pub 則運行下面的命令建立
[ahnniu@client .ssh] ssh-keygen -t rsa -C "your_email@example.com"
# 複製一份id_rsa.pub並重命名爲 ahnniu.pub, 注 ahnniu爲 gitolite管理員的用戶名
[ahnniu@client .ssh] cp id_rsa.pub ahnniu.pub
# 經過ssh上傳到服務器上(/home/git/),特別注意文件的owern應該爲git
[ahnniu@client .ssh] scp ~/.ssh/ahnniu.pub git@192.168.2.223:/home/git/

Setup Gitolite

Refrence: 官方 - setting up gitolitevim

[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使用

將在最後一節詳細介紹。bash

Gitolite支持HTTP

Install Apache

[root@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
[root@server ~]# /etc/httpd/conf/httpd.conf
# 修改下面2個變量
Listen 192.168.2.223:80 
ServerName 192.168.2.223:80

添加一個index.html, 看是否可訪問app

[root@server ~]# cd /var/www/html/
[root@server html]# vim index.html
# 添加如下內容.
Hello World!
# 需把index.html的全部權轉爲apache用戶
[root@server html]# chown apache:apache index.html
# 開啓 httpd
# 這裏可能會有端口被佔用的一些問題,使用命令netstat 查看是哪一個命令
[root@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

[root@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用戶執行

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

在AP_DOC_ROOT 目錄下建立一個git 目錄 , 供 apache 用戶 作 別名映射

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

在 /var/www/bin 中 添加一個 shell 腳本, 供 git用戶調用 gitolite功能 : gitolite-suexec-wrapper.sh

[root@server ~]# cd /var/www/bin
[root@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
[root@server bin]# chown git:git gitolite-suexec-wrapper.sh
# 修改執行權限
[root@server bin]# chmod 0700 gitolite-suexec-wrapper.sh
# 查看權限有無修改正確
[root@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 工做

[root@server ~]# cd /etc/httpd/conf.d
# 在 conf.d 添加 gitolite的配置
[root@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 "Git Access"
    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

[root@server ~]# /usr/sbin/apachectl -k stop
[root@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

幾種權限組

  1. 權限組: Owner

倉庫的擁有者,能夠對倉庫作任何想作的事情,好比push, 修改其它人訪問這個倉庫的權限,甚至刪除,至少須要有一我的

  1. 權限組: RW

可讀寫組, clone, push, pull

  1. 權限組: R

可讀組, clone, pull

其中 Owner包含 RW, RW權限 包含 R

準備工做

克隆gitolite管理倉庫

NOTE: 需使用安裝Gitolite指定的SSH Key對應的電腦(或者Copy 對應的 id_rsa到你使用的電腦~/.ssh), HTTP方式好像不能操做gitolite-admin.git倉庫。

[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 "add user: paul"
[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倉庫,並且具備相同的權限操做。這對大公司而言,比較合適,好比一個公司研發團隊很大,又分爲了研發一部,研發二部等等。
詳細可參考:

對於小公司而言,直接按照我上面提到的應該更合適一些。


在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

刪除一個倉庫

  1. gitolite.conf 中找到對應的 repo , 移除
  2. 登陸到服務器,從 repositories中刪除對應的倉庫

重命名一個倉庫

  1. 登陸到服務器,在repositories下手動重命名
  2. 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

相關文章
相關標籤/搜索