git checkout 用于开发/登台/生产的分支

标签 git branch git-checkout git-worktree

我目前正在重组我们公司处理开发程序的方式。由于我们总是通过 ssh 进入服务器来将文件/文件夹从 DEV 提升到 STAGE/生产服务器,这对我们来说是相当麻烦的,所以我认为以一种允许我们简单 merge 的方式设置 git 环境可能是一个好主意。 dev-branch 进入 stage-branch 来执行“升级”。

为此,我们的项目中需要 3 个不同的分支,当收到新的推送时,这些分支会 check out 到服务器上的不同位置。

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

Branch checkout schema

我将 git 设置为裸存储库,我想知道 git 是否可以实现此类操作。

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

最佳答案

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

您可以使用--work-tree=/path/选项在特定工作目录中获取 checkout ...

示例代码(将作为文件 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 '--- --- --- --- --- --- --- --- --- --- ---'   

checkout 的另一个可能的错误是

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

关于git checkout 用于开发/登台/生产的分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47451586/

相关文章:

git - 推送失败 - 使用 GitKraken 在远程服务器上清空存储库

使用不同的 node_modules 文件夹进行 git checkout

git - 如何为多个文件(或所有未 merge 的文件)执行 'git checkout --theirs'

git - 如何获取 Git 中当前提交的哈希值?

git - 就好像我一直都有 .gitattributes

git - 如何删除git钩子(Hook)

git - 如何编辑 git 配置以从 Windows 命令提示符运行 Git 和包含的 Unix 工具

linux - 在存储库根目录下创建项目后创建一个颠覆分支

git - 出现未跟踪文件错误时如何切换git分支?

git - 为什么 "git checkout <filename>"仅适用于非暂存文件?