我正在使用 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 - 我为多个回购提出的脚本(除非我听得更好,否则我正在使用)如下:
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