(注: 引入 http://blog.csdn.net/wsyw126/article/details/52167147)
總結小點:
1、創建linux空倉庫(詳見“在 Linux 下搭建 Git 服務器”);
2、在項目位置clone倉庫,生成倉庫名的項目;
3、創建master分支(我的方式是git push origin master一個文件后就自動生成,詳見“git-bash的一些操作命令”);
4、添加hooks(我用於本地window提交到服務器的倉庫后,同步項目代碼)。
安裝過程
-
在服務器上創建一個裸倉庫(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 #gitbook build #sleep 15 time=`date` echo "web server pull at webserver at time: $time." echo "================================================"
-
保存后賦予可執行權限:
chmod +x /var/www/workspace/springSummary/hooks/post-receive
-
這樣在開發者提交代碼的時候,就會自動部署。
在這里需要解釋兩個問題:
- 在這里第一個問題,因為我部署的是一個gitbook項目,所以需要額外在腳本中添加一行指令
gitbook build
,但是僅添加這一行的話會導致最后這個腳步執行失敗,因為build需要大約8秒時間。所以我的解決方案是在腳本中添加sleep 15
,這樣可以等待build執行結束並把結果返回到顯示的終端。(如果只是需要自動更新項目,請把這兩行指令刪去) -
在這里我使用的是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的內容)
- 在這里第一個問題,因為我部署的是一個gitbook項目,所以需要額外在腳本中添加一行指令
問題解決:
1、git pull 報錯:error: insufficient permission for adding an object to repository database .git/objects
解:找到項目里面的文件 sudo chmod 777 -R .git/objects