【发布时间】:2010-02-02 18:02:46
【问题描述】:
我正在使用 Git 来管理我网站的源代码和部署,并且目前在同一个机器上运行测试和实时站点。最初遵循此资源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 - 我为多个 repos 提出的脚本(除非我听得更好,否则我正在使用)如下:
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 之后添加工作树的“裸”存储库)具有基本的 post-receive:
git checkout -f
if [ $? -eq 0 ]; then
echo "Live site `basename \`pwd\`` checked out successfully"
else
echo "Live site failed to checkout"
fi
【问题讨论】:
-
目前我使用#2,到目前为止它看起来很干净,只要我记得在推送到实时站点后切换回测试存储库中的主分支。跨度>
标签: git web git-post-receive website-deployment