我有一个名为master
(生产环境)和另一个名为development
的分支。当我从master分支推送一个提交时,post-receive hook会执行:
git --work-tree=/var/www/mywebsite.com --git-dir=/var/repo/mywebsite.com.git checkout -f
网站已上线,但我想将我的开发
分支复制到 /var/www/mywebsite.com.dev。
#!/bin/sh
while read old new refname
do
case "$refname" in
refs/heads/master)
git --work-tree=/var/www/mywebsite.com --git-dir=/var/repo/mywebsite.com.git checkout -f
;;
refs/heads/development)
git --work-tree=/var/www/mywebsite.com.dev --git-dir=/var/repo/mywebsite.com.git checkout -f refs/heads/development
;;
esac
done
现在,我们可以通过以下几种方式改进脚本:
实际上,由于挂钩接收新的引用值,您甚至不需要分支名称,可以使用 $new 代替(如果有多个引用更新接近时间,则更加健壮)。
为了提高效率,我们可以每个检出维护一个索引文件(这样未修改的文件就不需要实际检出)。
--git-dir 选项可以删除,因为我们是从当前目录检出的(挂钩在存储库内执行)。
改进后的脚本如下:
#!/bin/sh
while read old new refname
do
case "$refname" in
refs/heads/master)
GIT_INDEX_FILE="$PWD"/index.master git --work-tree=/tmp/www/mywebsite.com checkout -f $new
;;
refs/heads/development)
GIT_INDEX_FILE="$PWD"/index.development git --work-tree=/tmp/www/mywebsite.com.dev checkout -f $new
;;
esac
done
关于这个话题,你也可以看一下 Git 2.3 中引入的 updateInstead
值和 receive.denyCurrentBranch
。例如,在https://github.com/blog/1957-git-2-3-has-been-released上查看“Push to deploy”部分。
post-receive
钩子现在是什么样子?它应该从标准输入中读取描述推送到远程的每个分支(实际上是 ref)的行,并使用每行构造适当的git checkout
调用。 - chepnergit archive
? - twalberg