Git, 一個分佈式的版本管理工具,我認爲其革命性的點:在於改變了用戶協做的方式,使得協做更簡單。html
下面講述 使用一個開源軟件 Gitolite搭建一個Git Sever, 並給了一個推薦的團隊協助方式。git
[root@server ~]# useradd gitgithub
[root@server ~]# passwd git
```shell
# 切換爲 git 用戶 # su git [git@server ~]$ cd ~ [git@server ~]$ git clone git://github.com/sitaramc/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 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/
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服務已經搭建好了安全
# 首先需確保,上傳的管理員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.
將在最後一節詳細介紹。bash
[root@server ~]# yum install httpd
Apache幾個重要的路徑:服務器
[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安裝成功
[git@server ~]$ cd # 編輯 ~/.gitolite.rc, 設置PATH變量:(添加gitolite 所在的bin到$PATH) [git@server ~]$ vim .gitolite.rc # 添加下面一句道文件最__前面__ $ENV{PATH} .= ":/home/git/bin";
[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"
[root@server ~]# install -d -m 0755 -o git -g git /var/www/bin
[root@server ~]# install -d -m 0755 -o apache -g apache /var/www/git
[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
[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>
咱們在上面的配置:AuthUserFile /etc/httpd/git.passwd
[ahnniu@server ~] cd /etc/httpd/ # 建立git.passwd, 並建立 ahnniu的用戶 [ahnniu@server ~] htpasswd -c git.passwd ahnniu #接下來輸入密碼
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是典型的吃本身的狗糧,他的管理徹底是操做Git來完成, 他能夠容許多個管理員同時管理,由於是基於一個git倉庫,那麼經過merge能夠解決衝突的問題
Gitolite有一個gitolite-admin.git的倉庫, 經過操做:
下面咱們探討若是經過gitolite打造Github那樣的Git Server.
Public: 倉庫能夠給任何人Clone,pull
Private: 倉庫只能給指定的人Clone,pull
倉庫的擁有者,能夠對倉庫作任何想作的事情,好比push, 修改其它人訪問這個倉庫的權限,甚至刪除,至少須要有一我的
可讀寫組, clone, push, pull
可讀組, 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
Refernce: Gitolite官方 - adding and removing users
建議的用戶名:盡能夠由 字母,數字, - , _ 來組成,最少3個字符,不能包括#,$,@等特殊符號
舉例: paul
用戶名的用途:
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 這個用戶名 配件權限了
一我的常常會有幾個辦公的場所/電腦,好比公司,家,筆記本,那麼若是須要在這些電腦上操做Git的話,都須要配置SSH Key, 並把這些Key發給管理員添加
建議的SSH Public Key的命名爲:
需管理員登陸到服務器操做:
[ahnniu@server ~] cd /etc/httpd/ # 基於git.passwd文件, 並建立 paul的用戶 [ahnniu@server ~] htpasswd git.passwd paul #接下來輸入密碼
假定刪除 paul 用戶,gitolite-admin倉庫中
一個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
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
# 用於概括 @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倉庫的權限主要有兩個:
repo ahnniu/cox RW+ = ahnniu # R組, 添加@all 就是 Public # R組, 移除 @all 就是 Private R = @all