git客戶端同步到服務器--服務器自動部署項目之GitHooks神器

(注: 引入  http://blog.csdn.net/wsyw126/article/details/52167147)php

 總結小點:html

一、建立linux空倉庫(詳見「在 Linux 下搭建 Git 服務器」);linux

二、在項目位置clone倉庫,生成倉庫名的項目;git

三、建立master分支(個人方式是git push  origin master一個文件後就自動生成,詳見「git-bash的一些操做命令」);web

四、添加hooks(我用於本地window提交到服務器的倉庫後,同步項目代碼)。spring

 

安裝過程

  1. 在服務器上建立一個裸倉庫(git服務器上的遠端倉庫)bash

    首先要在服務器上創建一個裸倉庫,我存放裸倉庫的文件夾是/home/workspace/gitbook,進入到該文件夾,而後使用git init –bare springSummary.git建立裸倉庫。 
    在服務器上建立一個普通Git倉庫服務器

  2. 在服務器上創建一個普通Git倉庫用於存放網站的源代碼。(web服務器上的另外一個本地倉庫)post

    mkdir /var/www/workspace cd /var/www/workspace git clone /home/workspace/gitbook/springSummary.git
  3. 配置Git Hookfetch

    進入到/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 "================================================"
  4. 保存後賦予可執行權限:

    chmod +x /var/www/workspace/springSummary/hooks/post-receive
  5. 這樣在開發者提交代碼的時候,就會自動部署。

    在這裏須要解釋兩個問題:

    1. 在這裏第一個問題,由於我部署的是一個gitbook項目,因此須要額外在腳本中添加一行指令gitbook build,可是僅添加這一行的話會致使最後這個腳步執行失敗,由於build須要大約8秒時間。因此個人解決方案是在腳本中添加sleep 15,這樣能夠等待build執行結束並把結果返回到顯示的終端。(若是隻是須要自動更新項目,請把這兩行指令刪去)
    2. 在這裏我使用的是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的內容)

  

問題解決:

一、git pull 報錯:error: insufficient permission for adding an object to repository database .git/objects

解:找到項目裏面的文件   sudo chmod 777 -R .git/objects

相關文章
相關標籤/搜索