Git for Websites/post-receive/Separation of Test and Production Sites

Wal*_*t W 5 git website-deployment git-post-receive web

我正在使用Git来管理我的网站的源代码和部署,目前在同一个盒子上运行测试和实时网站.最初在这个资源http://toroid.org/ams/git-website-howto之后,我想出了以下post-receive钩子脚本来区分推送到我的实时站点并推送到我的测试站点:

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"
Run Code Online (Sandbox Code Playgroud)

但是,我怀疑这实际上是安全的:)我绝不是Git专家,但我猜测Git可能跟踪当前检出的分支头,这种方法可能有可能混淆它永无止境.

所以有几个问题:

  1. 这样安全吗?

  2. 更好的方法是将我的基础存储库作为测试站点存储库(具有相应的工作目录),然后将该存储库推送更改为新的实时站点存储库,该存储库具有到实际站点库的相应工作目录?这也允许我将生产移动到不同的服务器并保持部署链完好无损.

  3. 有什么我想念的吗?在使用Git管理网站时,是否有不同的,简洁的方法来区分测试和生产部署?

根据Vi的回答,作为一个额外的说明,是否有一个很好的方法可以处理删除而不会破坏文件系统?

谢谢,-Walt

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"
Run Code Online (Sandbox Code Playgroud)

然后在../Live/$sitename中的repo(这些是在init之后添加工作树的"裸"repos)具有基本的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
Run Code Online (Sandbox Code Playgroud)

Joh*_*lph 1

更好的方法是让我的基础存储库成为测试站点存储库(具有相应的工作目录),然后让该存储库将更改推送到新的实时站点存储库,该存储库具有与实时站点基础相对应的工作目录?这还允许我将生产移动到不同的服务器并保持部署链完整。

当然是。在极少数情况下,您希望将测试站点托管在生产站点旁边。几乎在每个方面这都是危险和不专业的,更不用说数据库损坏、网络服务器锁定等。

我通常会设置一个虚拟机用于测试目的。效果很好,我可以在旅行时将它放在笔记本电脑上。

使用 git 部署您的网站是一个非常好的主意,还有很多其他人这样做(例如 Rob Conery)。如果您碰巧有一个实时站点和测试站点,那么您应该在存储库中为它们设置单独的分支,并在相应的服务器存储库上设置为远程跟踪分支。您的工作流程变得就像在测试分支中工作一样简单,将其推送到测试,测试它,合并到上线并推送上线。

老实说,不要让自己太难受。