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 的解决方案或某种其他策略来防止直接推送到生产分支。
编辑:
命令行消息如下所示:
我在 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 的解决方案或某种其他策略来防止直接推送到生产分支。
编辑:
命令行消息如下所示: