1

我想根据 git 开发我的网站,但我遇到了某种先有鸡还是先有蛋的问题。有一台服务器带有 git --bare 存储库(主存储库;/var/dev.git),一个克隆用于 apache 网络服务器的 doc-root (var/www),每个用户都有一个本地存储库。

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

我的第一次尝试

首先,我强制 www-root-repo 拉取最新的更改,然后我尝试找到所有 less 文件并启动 less 编译器。

lessc [input] [output]

问题是 git 似乎在拉取和推送时触发了后接收,并以无限循环的方式自行召回(它以 a 停止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(因为 AFAIK 无法使用 stderr-pipe-redirection 附加)并将其附加到 error_less 文件。(第二个问题:)只有在发生错误时,我才能创建文件?(目前它在每个lessc-call上创建)

4

1 回答 1

1

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

git remote set-url dev foo@bar:/var/dev  # Assuming SSH access

DEV 的 post-receive 挂钩将编译、提交并推送到 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 钩子只会检查新的提交

#!/bin/sh
# Go to worktree, check out new commit
export GIT_DIR=`pwd`; cd ..; export GIT_WORK_TREE=`pwd`
git reset --hard HEAD
于 2013-08-02T05:27:49.740 回答