雖然建好了Git Server,但 Git Server 的資料都是編碼壓縮過的,無法直接給網站伺服器用,若要直接使用在網站伺服器上那就只能手動更新。若要做到在新資料被 push 上來後就自動送上網站伺服器有兩種方式:

  • 第一種方式就是網站伺服器直接 Clone Git Server 上的倉庫 (此方法適用於Git 在遠端伺服器上),可以使用 crontab 定期一段時間使用 git pull 來更新資料,若伺服器不繁重用此方法尚可處理,若想要即時看結果的話就得等待一段時間 (視 crontab 設定),當然也可以設定每一分鐘一次,只是這樣會造成網站伺服器相當大負擔。
  • 第二種方式就是利用 Git Server 的 post-receive hooks 腳本來達成即時更新效果,且若沒有push就不會更新。(此方法適用於網站伺服器與 Git Server 放在一起,當然也可以利用網路連接網站伺服器將資料推送到遠端的網站伺服器) 在此我採用第二種方式來達成。

在 Git Server 的倉庫下的hooks木裡面編輯 post-receive 檔案。寫入下面資料存檔:

master  (此為Git分支名稱)
DIR = /volume1/web/TEST         (此為網站伺服器的主目錄,自行修改成你的網站目錄)

#!/bin/bash
while read oldrev newrev refname
do
    branch=$(git rev-parse --symbolic --abbrev-ref $refname)
    if [ "master" == "$branch" ]; then
        DIR=/volume1/web/TEST
        git --work-tree=${DIR} clean -fd $branch
        git --work-tree=${DIR} checkout --force $branch
    fi
done

當設定好post-receive檔案後,只要有新的push上來就會自動將資料送到你指定的網站目錄下。

若要設定分支, 也同時更新至另一個不同的目錄。一樣編輯 post-receive 檔案。寫入下面資料並存檔。

master   (此為Git分支名稱)
second   (此為Git分支名稱)
DIR = /volume1/web/TEST              (此為master分支網站伺服器的主目錄)
DIR2= /volume1/web/TEST2   (此為master分支網站伺服器的主目錄)

#!/bin/bash
while read oldrev newrev refname
do
    branch=$(git rev-parse --symbolic --abbrev-ref $refname)
    if [ "master" == "$branch" ]; then
        DIR=/var/www/html/TEST
        git --work-tree=${DIR} clean -fd $branch
        git --work-tree=${DIR} checkout --force $branch
    fi

    if [ "second" == "$branch" ]; then
        DIR2=/var/www/html/TEST2
        git --work-tree=${DIR2} cleand -fd $branch
        git --work-tree=${DIR2} checkout --force $branch
    fi

done

同理,若你的專案裡面有很多分支,則可以利用此方式來讓Git Server同時更新資料到所有分支。

最後修改日期: 2019 年 12 月 28 日