我使用 Git 来管理网站的源代码和部署,目前测试站点和实时站点在同一个机器上运行。关注此资源http://toroid.org/ams/git-website-howto http://toroid.org/ams/git-website-howto最初,我想出了以下接收后挂钩脚本来区分推送到我的实时站点和推送到我的测试站点:
while read ref
do
#echo "Ref updated:"
#echo $ref -- would print something like example at top of file
result=`echo $ref | gawk -F' ' '{ print $3 }'`
if [ $result != "" ]; then
echo "Branch found: "
echo $result
case $result in
refs/heads/master )
git --work-tree=c:/temp/BLAH checkout -f master
echo "Updated master"
;;
refs/heads/testbranch )
git --work-tree=c:/temp/BLAH2 checkout -f testbranch
echo "Updated testbranch"
;;
* )
echo "No update known for $result"
;;
esac
fi
done
echo "Post-receive updates complete"
然而,我怀疑这实际上是否安全:)我绝不是 Git 专家,但我猜测 Git 可能会跟踪当前签出的分支头,并且这种方法可能有可能混淆它无休无止。
那么几个问题:
这安全吗?
更好的方法是让我的基础存储库成为测试站点存储库(具有相应的工作目录),然后让该存储库将更改推送到新的实时站点存储库,该存储库具有与实时站点基础相对应的工作目录?这还允许我将生产移动到不同的服务器并保持部署链完整。
我有什么遗漏的吗?使用 Git 管理网站时,是否有一种不同的、干净的方法来区分测试部署和生产部署?
根据 Vi 的回答,作为附加说明,是否有一种好方法可以处理删除而不会对文件系统造成太大影响?
谢谢你,
-沃尔特
PS - 我为多个存储库想出的脚本(并且正在使用,除非我听得更好)如下:
sitename=`basename \`pwd\``
while read ref
do
#echo "Ref updated:"
#echo $ref -- would print something like example at top of file
result=`echo $ref | gawk -F' ' '{ print $3 }'`
if [ $result != "" ]; then
echo "Branch found: "
echo $result
case $result in
refs/heads/master )
git checkout -q -f master
if [ $? -eq 0 ]; then
echo "Test Site checked out properly"
else
echo "Failed to checkout test site!"
fi
;;
refs/heads/live-site )
git push -q ../Live/$sitename live-site:master
if [ $? -eq 0 ]; then
echo "Live Site received updates properly"
else
echo "Failed to push updates to Live Site"
fi
;;
* )
echo "No update known for $result"
;;
esac
fi
done
echo "Post-receive updates complete"
然后 ../Live/$sitename 中的存储库(这些是在 init 之后添加工作树的“裸”存储库)具有基本的接收后:
git checkout -f
if [ $? -eq 0 ]; then
echo "Live site `basename \`pwd\`` checked out successfully"
else
echo "Live site failed to checkout"
fi
认为这两种方法都会起作用。
您还可以使用“git archive master | tar -C c:/temp/BLAH -x”和“git archive live-site | ssh live-site 'tar -C /var/www -x'”。
保留单独的存储库可能很有用,但“推入另一个与推送相关的钩子”看起来很棘手,而且我预计它会很慢。那种长链条会缓慢且脆弱。
可能是在测试“测试”版本后应该手动触发实时站点更新?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)