[英]Git Post Receive Hook: update current working branch to staging server
[英]git hook to create staging branch
我将代码托管在Bitbucket上。 Webhooks不足以解决我的问题,因此我希望git hooks可以工作。 由于我不敢想象它们将在服务器端工作,因此git钩子应传播到每个开发人员计算机上的每个签出处。 (我知道这可能是一个问题,因为它通常是本地文件,但希望可以使用此处的信息来解决它)
我想创建一个git钩子,将更改推送到暂存分支。
意思是,如果我是一个名为bob
的用户,并且我想推送到production/master
,而不是推送到production/master
分支,它将推送到诸如staging/master/bob
的登台分支。 对于推入production/master
另一个用户roy
也是一样,它将进入staging/master/roy
。 与任何生产分支相同。 因此edd
推向production/2.0
将推向staging/2.0/edd
。
我已经尝试了pre-commit挂钩,但是找不到引导推送目标的方法。 我知道这是可能的。
我尝试使用GIT_WORK_TREE
,但似乎无法正常工作。
澄清
整个过程应该是无缝的bob
开发商。 他应该从主人那里拉到主人那里。 (或他正在处理的任何分支),该过程将在后台进行。 它将把他的更改推送到暂存分支,然后将进行CI流程,如果成功,则将其推送到主分支。 这是我需要的解决方案。
您可以使用pre-push
hook并从其中运行另一个git-push
命令。 这样,您可以更改目标引用,从而在暂存分支上推送数据,并中止在生产分支上执行推送。 这是脚本的草图:
#!/bin/sh
#You may want to iterate over all refs
#in case there are more branches that are being pushed
read local_ref local_sha remote_ref remote_sha
#Make sure you are not running the hook ad inifinitum
[[ $remote_ref =~ .*"staging".* ]] && exit 0
#Make sure these are unique
name="$(git config --get user.name | awk '{print $1;}' | tr '[:upper:]' '[:lower:]')"
#Compose a staging branch name accordingly
staging_branch="$(echo "$remote_ref" | sed 's:refs/heads/production/:staging/:')"
staging_branch="$staging_branch/$name"
git push origin master:"$staging_branch"
#Don't forget that exit status needs to be != 0
#unless you want to push the same changes twice
exit 1
您需要考虑一些更复杂的情况,但我想经过一些调整后它应该可以工作。
稍后,您可以在CI服务器上运行所需的任何测试,将其推送到生产环境并删除暂存分支。 您可能想要配置每个本地存储库,以便git-fetch
自动修剪:
git config remote.origin.prune true
这样,开发人员将不会看到对远程登台分支的过时引用(如果您选择删除它们)。
或者,您可以尝试将master的上游设置为适当的暂存分支。 但是,如果您删除远程引用,它可能会变得凌乱。
我认为这不是最优雅的解决方案,但我相信它可以直接回答您的问题。 这种方法的缺点之一是最终它不会以0退出。我不知道某些外部工具将如何处理它。 当您使用命令行时,它只会生成一条错误线,您可以忽略它。
您可能需要考虑@VonC的解决方案或其他某种策略,以防止直接推送到生产分支。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.