git 挂钩创建暂存分支

git hook to create staging branch

我在 Bitbucket 上托管我的代码。 webhooks 不足以解决我的问题,所以我希望 git hooks 能起作用。因为我不认为它们会在服务器端工作,所以 git 挂钩应该传播到每个开发人员机器上的每个结帐。 (我知道这可能是个问题,因为它通常是一个本地文件,但我希望可以使用来自 here 的信息解决它)

我想创建一个 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 hook,但是我找不到一种方法来指向推送的目标。我知道这是可能的。

我尝试使用 GIT_WORK_TREE,但似乎无法正常工作。


澄清

对于 bob 开发人员来说,整个过程应该是无缝的。他应该从主人那里拉出来并推向主人。 (或他正在从事的任何分支)并且该过程将在后台进行。它会将他的更改推送到暂存分支,然后该分支将进行 CI 处理,如果成功,将推送到主分支。这就是我需要的解决方案。

这是一个更好的管理 forks:

通过分叉一个 repo,bob 可以推送它而无需重命名分支:master 将在 bitbucket.org/bob/repo/master.

然后他可以PR (Pull Request) staging repo(它本身是 prod repo 的一个分支),致力于整合开发人员的贡献。

一旦代码在 staging repo 中的行为符合预期,就可以对 prod repo 进行 PR(仅由少数人管理)

该工作流程比尝试 fiddle 使用分支名称并在一个远程仓库中管理所有内容更容易,后者没有挂钩(只有 webhook)。

您可以在其中使用 pre-push 挂钩和 运行 另一个 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 ;}' | 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 p运行es 自动:

 git config remote.origin.prune true

这样开发人员就不会看到对远程暂存分支的过时引用(如果您选择删除它们)。

或者,您可以尝试将 master 的上游设置为适当的暂存分支。但是,如果您删除了远程引用,它可能会变得混乱。

底线

我认为这不是最优雅的解决方案,但我相信它可以直接回答您的问题。这种方法的缺点之一是它最终不会以 0 退出。我不知道某些外部工具将如何处理它。当您使用命令行时,它只会生成一个您可以忽略的错误行。

您可能需要考虑@VonC 的解决方案或某种其他策略来防止直接推送到生产分支。

编辑:

命令行消息如下所示: