我目前正在重组我们公司处理开发程序的方式。由于我们总是通过 ssh 进入服务器来将文件/文件夹从 DEV 提升到 STAGE/生产服务器,这对我们来说是相当麻烦的,所以我认为以一种允许我们简单 merge 的方式设置 git 环境可能是一个好主意。 dev-branch 进入 stage-branch 来执行“升级”。
为此,我们的项目中需要 3 个不同的分支,当收到新的推送时,这些分支会 check out 到服务器上的不同位置。
假设我们的服务器上有 3 个文件夹,其中包含 3 个不同环境的数据(DEV - STAGE - PROD)。那么架构看起来有点像这样:
我将 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/