带有post接收挂钩的Git部署

带有post接收挂钩的Git部署,git,bash,deployment,githooks,Git,Bash,Deployment,Githooks,我想按git开发我的网站,但我有一些鸡和蛋的问题。有一台带有git-bare存储库(main repo;/var/dev.git)的服务器,一个用于apache Web服务器的文档根(var/www)的克隆,每个用户一个本地存储库 好的,这真的很好,但现在我想添加一个“特殊”功能。如果有人添加了一个.less文件并将其推送到主repo,它应该被“编译”成css文件并添加到存储库中。此外,www克隆应该将所有新文件(包括新的css样式)拉回到主repo中 我的第一次尝试 首先我强制www根repo

我想按git开发我的网站,但我有一些鸡和蛋的问题。有一台带有git-bare存储库(main repo;/var/dev.git)的服务器,一个用于apache Web服务器的文档根(var/www)的克隆,每个用户一个本地存储库

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

我的第一次尝试

首先我强制www根repo获取最新的更改,然后我尝试查找所有较少的文件并启动较少的编译器

lessc [input] [output]
问题是git似乎会在一次拉和一次推的时候触发post接收,并以无限循环的方式调用自己(它会在生成树时出现
错误而停止)


为了获得更少的错误消息,我将stderr管道连接到stdout(因为stderr管道重定向不可能进行aik追加),并将其附加到一个错误文件。(第二个问题:)如果发生错误,我如何让它创建文件?(目前它是在每次LESC调用时创建的)

为了清楚起见,让我们调用/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
开发人员的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

为了清楚起见,我们将/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
开发人员的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

您的生产Web服务器可能不应该将自动更改推送到Git repo。如果你想用Git编译东西,在你投入生产之前先做。这不是一个生产Web服务器——我用它来开发。doc root是受密码保护的。好吧,但这一点仍然代表“production”的开发定义——在推送到web服务器的服务目录之前编译,而不是之后。这不是一个好主意,因为每个人都必须在本地计算机上安装LESC编译器(包括node.js.)在复制到web服务器的服务目录之前进行编译并不意味着必须在本地计算机上进行编译。这只是意味着您应该在部署过程中有一个单独的步骤来处理编译,该步骤应该在“复制到服务目录”步骤之前。例如,您可以在裸repo上有一个post-receive钩子,它使用
git-archive
将文件导出到临时目录,运行编译器,然后将结果复制到web服务器的服务目录。您的生产web服务器可能不应该将自动更改推送到git-repo。如果你想用Git编译东西,在你投入生产之前先做。这不是一个生产Web服务器——我用它来开发。doc root是受密码保护的。好吧,但这一点仍然代表“production”的开发定义——在推送到web服务器的服务目录之前编译,而不是之后。这不是一个好主意,因为每个人都必须在本地计算机上安装LESC编译器(包括node.js.)在复制到web服务器的服务目录之前进行编译并不意味着必须在本地计算机上进行编译。这只是意味着您应该在部署过程中有一个单独的步骤来处理编译,该步骤应该在“复制到服务目录”步骤之前。例如,您可以在裸repo上有一个post-receive钩子,它使用
git-archive
将文件导出到临时目录,运行编译器,然后将结果复制到web服务器的服务目录。