閱讀本文前你必須預先裝好CentOS並且已經安裝和配置好Nginx了。安裝GIT私服套件
安裝centos6.5-centos7.0
安裝nginx
yum install -y?git gitweb spawn-fcgi?fcgi-devel?fcgi
以上步驟執行完畢後,我們安裝了:
git服務
Gitweb,因為git是一個光板,只支持 git clone gituser@hostname:/repositories這樣的協議,對於eclipse開發者來說鍵入一堆的git 命令將會是一個惡夢,因此我們必須有一個圖形化的界面並且讓git支持http協議來支持我們的“遠程協作 ”
spawn-fcgi,這個東西特別有意思,因為nginx默認是不支持cgi的,而gitweb是用cgi寫的,因此我們才安裝fastcgi,而fastcgi又要通過spawn-fcgi來啟動。。。因此。。。必須要裝spawn-fcgi。
fcgi-devel 和 fcgi都屬於fastcgi運行時的lib庫了
安裝fcgiwrap
從以下網址下載該組件:https://codeload.github.com/gnosek/fcgiwrap/legacy.tar.gz/master
運行以下命令:
cd fcgiwrap
autoreconf -i
Configure
Make
make install
全部安裝完後注意檢查以下必要文件是否存在
/etc/init.d 目錄下有一個spawn-fcgi程序
/usr/bin 目錄下有一個spawn-fcgi程序
/var/www/git目錄下是gitweb所有的文件(網頁版git)
/etc/目錄下有一個gitweb.conf文件
/etc/sysconfig/目錄下有一個spawn-fcgi文件
開始配置GIT私服-修改/etc/gitweb.conf文件
$projectroot = "/home/git/repositories";
@git_base_url_list= ("git://192.168.0.101", "http://192.168.0.101:81");
$git_temp = "/tmp";
$home_text = "indextext.html";
@stylesheets = ("gitweb.css");
$javascript = "gitweb.js";
@diff_opts = ();
$feature{pathinfo}{default} = [1];
$feature{'highlight'}{'default'} = [1];
以上配置做了這麼幾件事:
所有的git的子項目:如“hello.git”全部位於/home/git/repositories目錄下
Git的常用兩種協議對外暴露的URL:
一個使用的是git協議
一個使用的是http協議,並且它的端口號為81
@feature是gitweb的屬性,它告訴gitweb可以如:代碼高亮,路徑信息等,gitweb中還有許多功能強大的@feature
開始配置GIT私服-修改/etc/sysconfig/spawn-fcgi文件
# You must set some working options before the "spawn-fcgi" service will work.
# If SOCKET points to a file, then this file is cleaned up by the init script.
#
# See spawn-fcgi(1) for all possible options.
#
# Example :
#SOCKET=/var/run/php-fcgi.sock
#OPTIONS="-u apache -g apache -s $SOCKET -S -M 0600 -C 32 -F 1 -P /var/run/spawn-fcgi.pid -- /usr/bin/php-cgi"
以上是原來文件的內容
修改後的內容如下顯示,注意
紅色加粗部分:
# You must set some working options before the "spawn-fcgi" service will work.
# If SOCKET points to a file, then this file is cleaned up by the init script.
#
# See spawn-fcgi(1) for all possible options.
#
# Example :
#SOCKET=/var/run/php-fcgi.sock
#OPTIONS="-u apache -g apache -s $SOCKET -S -M 0600 -C 32 -F 1 -P /var/run/spawn-fcgi.pid -- /usr/bin/php-cgi"
FCGI_SOCKET=/var/run/fcgiwrap.socket
FCGI_PROGRAM=/usr/local/sbin/fcgiwrap
FCGI_USER=nginx
FCGI_GROUP=nginx
FCGI_EXTRA_OPTIONS="-M 0700"
OPTIONS="-u $FCGI_USER -g $FCGI_GROUP -s $FCGI_SOCKET -S $FCGI_EXTRA_OPTIONS -F 1 -P /var/run/spawn-fcgi.pid -- $FCGI_PROGRAM"
啟動spawn-fcgi
chkconfig --levels 2345 spawn-fcgi on
/etc/init.d/spawn-fcgi start
把spawn-fcgi設為開機啟動,並啟動該服務,該服務成功啟動後會在:
/var/run目錄下生成一個fcgiwrap.socket文件。
配置GIT服務器-初始化GIT服務
useradd gitpasswd git
su git #切換到git用戶
mkdir repositories #會在/home/git目錄下建立repositories目錄
#開始建立git的root repositories
mkdir /home/git/.ssh
cd /home/git/.sshssh-keygen -t rsa
git gitosis-init < ~/.ssh/id_rsa.pub
以上做的事情就是:
1. 生成的gitosis-admin為Git的用戶訪問權限管理庫,gitosis通過這個git庫來管理所有git庫的訪問權限。
2. 通過執行初始化,該公鑰的擁有者就能修改用於配置gitosis的那個特殊Git倉庫了
因為git中的密鑰就是通過gitosis這個特殊的repo來管理的。有了它我們就可以管理我們的GIT,包括建子項目什麼的了。
配置GIT服務器-建子項目
我們新建一個用戶,用這個用戶來進行GIT子項目的推和拉。
su git
cd repositories
mkdir hello.git
cd hello.git
git --bare init
sudo chmod 777 /home/git/repositories/hello.git –R
讓這個目錄具有讀寫執行權限,你也可以把權限放的小一些,如chmod +x類似的,只要讓這個目錄可以有讀、寫、執行(git特殊的unpack, pack功能)權限就可以了。
以上就是建立了一個GIT子項目,名字叫hello,我們來看看/home/git/repositories下的 hello.git這個項目吧
配置GIT服務器-使用其它用戶推拉hello.git
我們新建一個用戶,用這個用戶來進行GIT子項目的推和拉。
useradd ymk
passwd ymk
cd /home/ymk
mkdir git_repo
cd git_repo
mkdir hello.git
cd hello.git
git init
上面就在“客戶端 ”初始化好了一個workspace了,此時我們可以進行“遠程GIT服務”的推拉了。
touch readme #新建一個readme文本文件
vi readme #隨便在此文件中寫點什麼然後保存退出即可
git add . 代表把當前目錄內所有東西進行遠程推送
git commit -a -m “init helloworld“ #代表commit所有之前add過的東東,並且帶上commit時的注釋
git remote add origin [email protected]:/home/git/repositories/hello.git #建立遠程GIT連接
git push origin master #正式推送
看到一堆推送日志後,並看到OK, SUCCESS字樣後即代表push成功了。下面就是要讓我們的GIT具有基於http協議進行推送的配置了。
配置GIT服務器-配置GITWEB + NGINX
在nginx的nginx.conf文件中進行修改(/usr/local/nginx/nginx.conf)
server {
error_log logs/git.error.log;
access_log logs/git.access.log;
listen 81;
server_name 192.168.0.101;
index gitweb.cgi;
root /home/git;
location ~ \.(cgi|pl).*$ {
gzip off;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
fastcgi_param SCRIPT_FILENAME /home/git/gitweb.cgi;
fastcgi_param SCRIPT_NAME gitweb.cgi;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ ^.*\.git/objects/([0-9a-f]+/[0-9a-f]+|pack/pack-[0-9a-f]+.(pack|idx))$ {
root /home/git;
}
location ~ ^.*\.git/(HEAD|info/refs|objects/info/.*|git-(upload|receive)-pack)$ {
root /home/git;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param SCRIPT_FILENAME /usr/libexec/git-core/git-http-backend;
fastcgi_param GIT_HTTP_EXPORT_ALL true;
fastcgi_param GIT_PROJECT_ROOT /home/git/repositories;
fastcgi_param PATH_INFO $uri;
include fastcgi_params;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
}
try_files $uri @gitweb;
location @gitweb {
fastcgi_pass unix:/var/run/fcgiwrap.socket;
fastcgi_param SCRIPT_FILENAME /var/www/git/gitweb.cgi;
fastcgi_param PATH_INFO $uri;
fastcgi_param GITWEB_CONFIG /etc/gitweb.conf;
include fastcgi_params;
}
這麼一大陀配置,你可以全部復制、粘貼,因為網上所有GIT WEB的配置,全部是錯的,這一陀已經在本地GIT私服上運行起來了,少一行多一行都不行。下面就來做一些核心語句塊的解釋吧,注意
紅色加粗部分(我就喜歡粗)
server {
error_log logs/git.error.log;
access_log logs/git.access.log;
listen 81;
server_name 192.168.0.101;
index gitweb.cgi;
root /home/git;
我們把我們的gitweb的http服務申明在了81網段, gitweb的主頁叫gitweb.cgi。
location ~ \.(cgi|pl).*$ {
gzip off;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
fastcgi_param SCRIPT_FILENAME /home/git/gitweb.cgi;
fastcgi_param SCRIPT_NAME gitweb.cgi;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ ^.*\.git/objects/([0-9a-f]+/[0-9a-f]+|pack/pack-[0-9a-f]+.(pack|idx))$ {
root /home/git;
}
這兩段告訴了NG,凡是cgi的去哪裡找.cgi文件,一定注意不要漏了include fastcgi_params;這一句,你也可以去/usr/local/nginx下看看,是否有這個文件。
location ~ ^.*\.git/(HEAD|info/refs|objects/info/.*|git-(upload|receive)-pack)$ {
root /home/git;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param SCRIPT_FILENAME /usr/libexec/git-core/git-http-backend;
fastcgi_param GIT_HTTP_EXPORT_ALL true;
fastcgi_param GIT_PROJECT_ROOT /home/git/repositories;
fastcgi_param PATH_INFO $uri;
include fastcgi_params;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
}
try_files $uri @gitweb;
location @gitweb {
fastcgi_pass unix:/var/run/fcgiwrap.socket;
fastcgi_param SCRIPT_FILENAME /var/www/git/gitweb.cgi;
fastcgi_param PATH_INFO $uri;
fastcgi_param GITWEB_CONFIG /etc/gitweb.conf;
include fastcgi_params;
}
以上兩段做了這麼兩件事 :git通過http傳輸時會調用git-upload和git-receive或者是git-pack、git-unpack函數,因此它們會使用到一個git的類庫,叫git-http-backend,因此只要url中出現git-pack、git-upload、git-receive之類的函數都會轉到git-http-backend去處理。
try_files呢?即除了前面三段定義的客戶浏覽器端行為,其它未在定義中說明的任何請求全部走try_files段,相當於一個default的關鍵字。比如說:http://192.168.0.101:81/hello.git 就會被轉到try_files段去。
因為在前面三段我們都只是申明客戶的何種行為將要去哪找相關的類庫,而只有一處就是對於git-upload, git-receive或者是git-pack/unpack的請求,我們會讓NG交由git服務端的類庫去處理,並未明確告訴*.git和其它的相關的請求由誰處理,因此這邊來了一個try_files也是一種“簡寫”-當然,有更好的更精細的辦法來做URL申明,可以自己去練習一下。
NG配置好了後,我們先不要急著啟NG。我們先來了解一下GIT基於HTTP推送的相關原理:
客戶端通過ECLIPSE的JGIT連上GIT的遠程服務後會發送一個git-upload指令。
同時服務端會回一個git-receive給到客戶端做“接收”請求的准備,但是git服務默認對於這個receive的值為false,因此如果你沒有做特殊處理後,在eclipse連上git後會發生一個can not find git-receive這樣的錯誤,解決辦法是:
su git
cd /home/git/repositories/hello.git
git config --file config http.receivepack true
這條命令發送後我們來看一下GIT服務器上的/home/git/repositories/hello.git/config這個文件的內容吧
一切准備就緒後,啟動nginx。
cd /usr/local/nginx
./nginx –c /usr/local/nginx/nginx.conf
在客戶端用浏覽器打開http://192.168.0.101:81網址你會看到這樣的畫面
客戶端使用eclipse訪問遠程GIT
這時可以commit了-commit在本地的repo裡
commit後才是真正的向遠程的push
給gitweb加上用戶名密碼