2012-08-11 101 views
1

我想爲每個git開發我的網站,但我有某種雞和蛋的問題。有一臺服務器具有git -bare存儲庫(主repo; /var/dev.git),一個用於Apache webserver的doc-root(var/www)的克隆,並且爲每個用戶提供一個本地存儲庫。Git部署與post-receive hook

好吧,這個工程真的很好,但現在我想添加一個「特殊」功能。如果有人添加一個.less文件並將其推送到main-repo,它應該被「編譯」成一個css文件並添加到存儲庫。此外,www-clone應該將所有新文件(包括新的CSS樣式)重新放回到主回購中。

我第一次嘗試

首先,我強迫WWW根回購拉的最新變化,然後我試圖找到所有的減檔和消防少編譯器。

lessc [input] [output] 

的問題是,混帳似乎觸發拉和推 - 接收後並回顧,本身在無窮遠環的時尚

#!/bin/sh 

git --git-dir /var/www/.git reset --hard HEAD 
git --git-dir /var/www/.git pull /var/dev.git master 

echo "###### fire LESS Compiler #####" 
find /var/www -name *.less -exec sh -c 'lessc {} $(dirname {})/ 
    $(echo $(basename {} .less)$(echo ".css")) >> $(dirname {}) 
    /less_error.log 2>&1 ' \; 

echo "###### add new less-out files to repo #####" 
git --git-dir /var/www/.git add . 
git --git-dir /var/www/.git commit -am "css style added" 
git --git-dir /var/www/.git push /var/dev.git master 

echo "########### END #############" 

(其與error building trees停止)爲了獲得更少的錯誤消息,我將標準錯誤輸出到標準輸出(因爲AFAIK追加不能用於stderr管道重定向)並將其追加到error_less-file。 (第二個問題:)我怎麼才能預見它只有在出現錯誤時才創建文件? (目前它在每個lessc-call上創建)

+0

你的Web服務器的生產可能不應該推自動更改您的Git回購。如果你想要在Git中編譯的東西,那麼在你推入產品之前就做好。 – Amber 2012-08-11 07:11:44

+0

這不是一個生產網絡服務器 - 我用它來開發。文檔根目錄受密碼保護。 – NaN 2012-08-11 07:19:30

+0

好的,但這一點仍然代表「生產」的開發定義 - 在推送到您的Web服務器的服務目錄之前編譯,而不是之後。 – Amber 2012-08-11 07:40:55

回答

1

爲了清楚起見,我們調用/ var/dev repo DEV和/ var/www repo WWW。 使DEV回購非裸露,所以它有一個工作樹,你可以編譯它。 的DEV現在是在/ var/dev的所有用戶必須更新他們的遠程網址:

git remote set-url dev [email protected]:/var/dev # Assuming SSH access 

的的DEV-收到後鉤子將彙編,提交和推到WWW。

#!/bin/sh 
# Go to worktree, check out new commit 
export GIT_DIR=`pwd`; cd ..; export GIT_WORK_TREE=`pwd` 
git reset --hard HEAD 
# fire LESS Compiler 
find . -name *.less -exec sh -c 'lessc {} $(dirname {})/ 
    $(echo $(basename {} .less)$(echo ".css")) >> $(dirname {}) 
    /less_error.log 2>&1 ' \; 
# add new less-out files to repo 
git add . 
git commit -am "css style added" 
# Push to WWW 
git push /var/www master 

的WWW後收到鉤將只檢查出新的提交

#!/bin/sh 
# Go to worktree, check out new commit 
export GIT_DIR=`pwd`; cd ..; export GIT_WORK_TREE=`pwd` 
git reset --hard HEAD