我有一个分支叫master
(生产)另一个称为development
。当我从 master 推送提交时,post-receive 挂钩执行:
git --work-tree=/var/www/mywebsite.com --git-dir=/var/repo/mywebsite.com.git checkout -f
该网站已上线。但我想要我的development
分支复制到 /var/www/mywebsite.com.dev 。
你想要手工做的事情就是像这样的工具卡皮斯特拉诺 http://capistranorb.com/是为了,他们会做得更好(例如,你的版本不是原子的,所以你的网站有一段时间混合了旧/新文件,而 capistrano 会在目录中检查你的树,然后指向一个符号链接到它,这是原子的)。
如果您继续使用“git checkout”,那么“git checkoutdevelopment”将签出开发分支,因此您希望在收到有关开发的参考更新时执行此命令。该脚本的内容如下:
#!/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
关于相关主题,您还可以查看新的updateInstead
价值receive.denyCurrentBranch
Git 2.3 中引入。例如,请参阅“推送部署”部分https://github.com/blog/1957-git-2-3-has-been-released https://github.com/blog/1957-git-2-3-has-been-released
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)