轉自 http://blog.csdn.net/wsyw126/article/details/52167147
背景描述
在剛開始用git的時候,每次都是將本地將代碼push到遠程倉庫,然后再ssh到服務器上git pull,甚是麻煩。后來在項目開發中使用git的時候,發現push之后,編譯系統竟然會有自動部署等功能。頓時覺得這等神器,必須學習一下,所以就請教了吳旭東老師。下面就是我通過Git Hook神器將自己的項目自動化部署到服務器的過程。
自動部署理論
首先要明確現在代碼的分布情況,開發者電腦上的本地倉庫,git服務器上的遠端倉庫,web服務器上的另一個本地倉庫,我們瀏覽器訪問的就是這里的代碼。其實自動部署就是要當從開發者本地倉庫提交代碼到遠端倉庫的時候,自動把代碼部署到web服務器的本地倉庫,實現開發者本地倉庫和web服務器的本地倉庫的同步。(即通過GitHook中的post-receive腳本文件)
安裝過程
-
在服務器上創建一個裸倉庫(git服務器上的遠端倉庫)
首先要在服務器上建立一個裸倉庫,我存放裸倉庫的文件夾是/home/workspace/gitbook,進入到該文件夾,然后使用git init –bare springSummary.git創建裸倉庫。
在服務器上創建一個普通Git倉庫 - 在服務器上建立一個普通Git倉庫用於存放網站的源代碼。(web服務器上的另一個本地倉庫)
mkdir /var/www/workspace cd /var/www/workspace git clone /home/workspace/gitbook/springSummary.git
-
配置Git Hook
進入到/home/workspace/gitbook/springSummary.git/hooks文件夾,使用vi post-receive創建一個腳本,當你在本地倉庫執行git push后就會觸發post-receive。
post-receive的內容如下:#!/bin/sh #判斷是不是遠端倉庫 IS_BARE=$(git rev-parse --is-bare-repository) if [ -z "$IS_BARE" ]; then echo >&2 "fatal: post-receive: IS_NOT_BARE" exit 1 fi unset GIT_DIR DeployPath="/var/www/workspace/springSummary" echo "===============================================" cd $DeployPath echo "deploying the test web" #git stash #git pull origin master git fetch --all git reset --hard origin/master time=`date` echo "web server pull at webserver at time: $time." echo "================================================"
保存后賦予可執行權限:
chmod +x /var/www/workspace/springSummary/hooks/post-receive
這樣在開發者提交代碼的時候,就會自動部署。
在這里需要解釋兩個問題:
-
在這里我使用的是git fetch,為什么沒有用git pull實現。區別在於:
- git fetch:相當於是從遠程獲取最新版本到本地,不會自動merge。
- git pull:相當於是從遠程獲取最新版本並merge到本地。
- pull實現相當於fetch后再用merge,來合並本地和遠端的代碼。
這里就有個問題,如果開發者在提交過程出現失誤,使用git reset復位后,現在遠端的代碼版本低於web端的代碼版本,再使用pull的時候就不能實現和開發者本地的代碼的同步。所以這里使用fetch后,在強制使用reset實現web端的代碼版本指針和git服務端的一致。(如果在本機可以使用stash,然后pull,然后drop剛才stash的內容)
-