2012-08-11 69 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