繁体   English   中英

git钩子创建临时分支

[英]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流程,如果成功,则将其推送到主分支。 这是我需要的解决方案。

那是用fork更好地解决的管理问题:

通过创建仓库,bob可以推送到bitbucket.org/bob/repo/master而不必重命名分支:master将位于bitbucket.org/bob/repo/master

然后,他可以对登台回购(本身是商品回购的分支进行PR(拉取请求 ),专用于合并开发人员的贡献。

一旦代码在临时仓库中按预期方式运行,就可以对产品仓库进行PR(仅由少数人管理)

该工作流程比尝试摆弄分支名称和在一个没有回形针(只有webhook)的远程仓库中管理所有内容容易。

您可以使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM