使用post-receive钩子进行Git部署

时间:2012-08-11 07:06:02

标签: git bash deployment githooks

我想根据git开发我的网站,但我有一些鸡和蛋的问题。有一个服务器带有一个git --bare存储库(主要存储库; /var/dev.git),一个克隆用于apache webserver的doc-root(var / www),每个用户一个本地存储库。

好的,这非常好用,但现在我想添加一个“特殊”功能。如果有人添加.less文件并将其推送到main-repo,则应将其“编译”为css文件并添加到存储库中。此外,www-clone应该将所有新文件(包括新的css-styles)拉回main-repo。

我的第一次尝试

首先,我强制使用www-root-repo来获取最新的更改,然后我尝试查找所有较少的文件并激活较少的编译器。

lessc [input] [output]

问题是git似乎触发了一次拉动后的接收和推送,并以无限循环的方式召回 - 它以error building trees停止

#!/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 #############"

为了获得更少的错误消息,我将stderr传递给stdout(因为stderr-pipe-redirection无法附加AFAIK)并将其附加到error_less-file。 (第二个问题:)如果出现错误,我怎么能创建文件呢? (目前它是在每次呼叫时创建的)

1 个答案:

答案 0 :(得分:1)

为清楚起见,我们调用/ var / dev repo DEV和/ var / www repo WWW。 使DEV repo非裸,因此它有一个工作树,你可以在其中编译。 DEV现在位于/ var / dev中,所有用户都必须更新其远程URL:

git remote set-url dev foo@bar:/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 post-receive hook只会检查新提交

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