在剛開始用git的時候,每次都是將本地將代碼push到遠程倉庫,而後再ssh到服務器上git pull,甚是麻煩。後來在項目開發中使用git的時候,發現push以後,編譯系統居然會有自動部署等功能。頓時以爲這等神器,必須學習一下,因此就請教了吳旭東老師。下面就是我經過Git Hook神器將本身的項目自動化部署到服務器的過程。html
首先要明確如今代碼的分佈狀況,開發者電腦上的本地倉庫,git服務器上的遠端倉庫,web服務器上的另外一個本地倉庫,咱們瀏覽器訪問的就是這裏的代碼。其實自動部署就是要當從開發者本地倉庫提交代碼到遠端倉庫的時候,自動把代碼部署到web服務器的本地倉庫,實現開發者本地倉庫和web服務器的本地倉庫的同步。(即經過GitHook中的post-receive腳本文件)node
在服務器上建立一個裸倉庫(git服務器上的遠端倉庫)git
首先要在服務器上創建一個裸倉庫,我存放裸倉庫的目錄是/home/gitbook,進入到該目錄,而後使用git init --bare 裸倉庫名稱 建立裸倉庫。
裸倉庫的倉庫名稱通常會加上.git結尾的形式,如 hello.git (這也是爲何咱們從 GitHub clone 倉庫的時候,地址都是 xxx.git 這樣的形式的緣由)web
在服務器上創建一個普通Git倉庫用於存放網站的源代碼。(web服務器上的另外一個本地倉庫)npm
mkdir /home/www/ cd /home/www/ git clone /home/gitbook/hello.git hello_project #hello_project是自定義的Web項目名稱
配置自動部署Git Hook瀏覽器
進入到/home/gitbook/hello.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="/home/www/hello_project/" echo "===============================================" cd $DeployPath #進入web項目目錄 echo "deploying the web project" #git stash #git pull origin master #不建議使用git pull,後面會有解釋 git fetch --all #這裏使用git fetch進行拉取,不建議用git pull git reset --hard origin/master #gitbook build #這裏的gitbook是一個電子文檔管理軟件,用於生成好固定格式的電子文檔,通常用戶到,若須要則需另行安裝,因爲gitbook是node.js寫的,而npm是node.js的包管理器,因此要先安裝npm再安裝gitbook。gitbook build表示文檔生成在當前目錄的默認文件夾_book裏面。 #sleep 15 #gitbook執行須要8秒鐘時間,等待15秒是爲了確保能獲得返回結果 time=`date` echo "web server pull at webserver at time: $time." echo "================================================"
保存後賦予可執行權限:ssh
chmod +x /home/gitbook/hello.git/hooks/post-receive
這樣在開發者提交代碼的時候,就會自動部署。post
在這裏須要解釋兩個問題:學習
在這裏我使用的是git fetch,爲何沒有用git pull實現。區別在於:
(1)git fetch:至關因而從遠程獲取最新版本到本地,不會自動merge。
(2)git pull:至關因而從遠程獲取最新版本並merge到本地。
(3)pull實現至關於fetch後再用merge,來合併本地和遠端的代碼。
這裏就有個問題,若是開發者在提交過程出現失誤,使用git reset復位後,如今遠端的代碼版本低於web端的代碼版本,再使用pull的時候就不能實現和開發者本地的代碼的同步。因此這裏使用fetch後,在強制使用reset實現web端的代碼版本指針和git服務端的一致。(若是在本機可使用stash,而後pull,而後drop剛纔stash的內容)
gitbook build
前面的註釋,可是僅添加這一行的話會致使最後這個腳步執行失敗,由於build須要大約8秒時間。因此個人解決方案是在腳本中添加sleep 15
,這樣能夠等待build執行結束並把結果返回到顯示的終端。(若是隻是須要自動更新項目,請把這兩行指令刪去)以上基本轉自:http://blog.csdn.net/wsyw126/article/details/52167147
其餘相關:
ssh免密鑰
du -sh * 查看文件和目錄大小