我在Bitbucket上托管我的代码。 webhooks不足以解决我的问题,所以我希望git hooks能够正常工作。由于我不认为它们将在服务器端工作,因此git钩子应该传播到每个开发人员机器上的每个checkout。 (我知道这可能是一个问题,因为它通常是一个本地文件,但我希望能够使用来自here的信息来解决它)
我想创建一个git钩子,将更改推送到分段分支。
意思是,如果我是名为bob
的用户,并且我想推送到production/master
,而不是推送到production/master
分支,它将推送到staging/master/bob
之类的暂存分支1}}。对于推送到roy
的其他用户production/master
,它将转到staging/master/roy
。对于任何生产分支都是如此。因此edd
推送到production/2.0
会推送到staging/2.0/edd
。
我已经尝试过预提交钩子,但是我无法找到引导推送目标的方法。我知道这是可能的。
我尝试使用GIT_WORK_TREE
,而我似乎无法让它发挥作用。
澄清
对于bob
开发人员来说,整个过程应该是无缝的。他应该从主人那里拉出来并推向主人。 (或者他正在处理的任何分支),这个过程将在后台进行。它会将他的更改推送到暂存分支,然后进行CI过程,如果成功将被推入主分支。这是我需要的解决方案。
答案 0 :(得分:3)
这是一个使用 forks :
更好地解决的管理问题通过分配回购,bob可以推送到它而无需重命名分支:master将在bitbucket.org/bob/repo/master
。
然后,他可以为临时仓库(本身就是prod仓库的一个分支)制作PR (Pull Request),致力于整合开发商的贡献。
一旦代码在staging repo中表现得如此,就可以对prod repo进行PR(仅由少数人管理)
这个工作流程比试图在一个远程仓库中设置分支名称和管理所有内容更容易,因为没有钩子(只有webhook)。
答案 1 :(得分:2)
您可以使用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 $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的解决方案或某种其他策略,以防止直接推送到生产分支。