代码之家  ›  专栏  ›  技术社区  ›  Michel Engelen

用于开发/暂存/生产的git签出分支

  •  2
  • Michel Engelen  · 技术社区  · 7 年前

    我目前正在重组我们公司处理开发程序的方式。由于总是使用ssh将文件/文件夹从开发人员提升到后台/生产服务器对我们来说是一件很麻烦的事情,所以我认为以一种允许我们简单地将开发人员分支合并到后台分支以执行“提升”的方式设置git环境可能是一个好主意。

    为此,我们需要在我们的项目中有3个不同的分支,当接收到新推送时,这些分支将签出到服务器上的不同位置。

    假设我们的服务器上有3个文件夹,其中包含3个不同环境(DEV-STAGE-PROD)的数据。然后,模式看起来有点像这样:

    Branch checkout schema

    我将git设置为裸回购,我想知道git是否可以实现这种功能。

    我将非常感谢你们能为我提供的每一点帮助!:D

    1 回复  |  直到 7 年前
        1
  •  2
  •   Carlo Bellettini    7 年前

    这个想法是使用 post-receive hook 在服务器上设置强制 ( -f 选项)在特定目录中签出

    您可以使用 --work-tree=/path/ 选项

    示例代码(以文件形式保存在服务器上的裸机上 hooks/post-receive 执行位设置)由 this Gist 可以是:

    #!/bin/bash
    echo '--- --- --- --- --- --- --- --- --- --- ---'
    echo 'Deploying site...'
    echo '--- --- --- --- --- --- --- --- --- --- ---'
    
    if ! [ -t 0 ]; then
        read -a ref
    fi
    
    IFS='/' read -ra REF <<< "${ref[2]}"
    branch="${REF[2]}"
    
    # Master Branch
    if [ "PROD" == "$branch" ]; then
        git --work-tree=/path/to/public/PROD checkout -f $branch
        echo 'Changes pushed to production site'
    fi
    
    # Stage Branch
    if [ "STAGE" == "$branch" ]; then
        git --work-tree=/path/to/public/STAGE checkout -f $branch
        echo 'Changes pushed to stage site'
    fi
    
    # Development Branch
    if [ "DEV" == "$branch" ]; then
        git --work-tree=/path/to/public/DEV checkout -f $branch
        echo 'Changes pushed to dev site'
    fi
    
    echo '--- --- --- --- --- --- --- --- --- --- ---'   
    

    另一种可能的结账方式是

    GIT_WORK_TREE=/path/to/test/site git checkout -f