如何限制将特定分支合并到Gitlab中的其他分支?

时间:2018-11-02 08:28:37

标签: git merge gitlab

是否有一种方法可以限制从特定分支合并到其他分支?请允许我解释一下:

我在Gitlab中有一个“测试”分支和一个“主”分支。团队创建功能分支,将其合并“测试”中以供批准,然后在批准后将功能分支合并到“主”中。

有时,要花一些时间才能批准某些功能,因此代码在“测试”分支中待了一段时间。同时,另一个功能分支可能会尝试合并到“测试”中,并且会发生冲突。但是,这是预料之中的,我们只是人类,偶尔有人在处理冲突时可能会不小心将“测试”合并到其功能分支中,这显然是错误的。相反,我们应该切换到“测试”,然后将功能分支合并到“测试”中,从而管理测试分支中的冲突。

任何建议都值得赞赏。

2 个答案:

答案 0 :(得分:5)

首先,请确保您的需求非常正常和传统。 答案是……是的。

如何防止从分支合并到另一个分支,设置服务器Git Hook

这些是一些有用的链接:

为了帮助您(并且很有趣^^),我在Python中编写了一个专用的钩子来满足您的特定需求(如果您想与其他分支一起工作,则只需适应FORBIDDEN_SOURCE_BRANCH和FORBIDDEN_IF_NOT_DEST_BRANCH)。

#!/bin/python
##
## Author: Bertrand Benoit <mailto:contact@bertrand-benoit.net>
## Description: Git Hook (server-side) allowing to prevent merge from some branches to anothers
## Version: 0.9

import sys, subprocess, re

FORBIDDEN_SOURCE_BRANCH='testing'
FORBIDDEN_IF_NOT_DEST_BRANCH='master'

# Considers only merge commit.
if not (len(sys.argv) >=2 and sys.argv[2] == 'merge'):
    sys.exit(0)

# Defines which is the source branch.
with open(sys.argv[1], 'r') as f:
    mergeMessage=f.readline()
mergeBranchExtract=re.compile("Merge branch '([^']*)'.*$").search(mergeMessage)
if not mergeBranchExtract:
    print('Unable to extract branch to merge from message: ', mergeMessage)
    sys.exit(0) # Ensures normal merge as failback

# Checks if the merge (source) branch is one of those to check.
mergeBranch=mergeBranchExtract.group(1)
if mergeBranch != FORBIDDEN_SOURCE_BRANCH:
  sys.exit(0) # It is NOT the forbidden source branch, so keeps on normal merge

# Defines which is the current branch.
currentBranchFullName=subprocess.check_output(['git', 'symbolic-ref', 'HEAD'])
currentBranchExtract=re.compile("^.*/([^/]*)\n$").search(currentBranchFullName)
if not currentBranchExtract:
  print('Unable to extract current branch from: ', currentBranchFullName)
  sys.exit(1) # Ensures normal merge as failback

# Checks if the current (destination) branch is one of those to check.
currentBranch=currentBranchExtract.group(1)
if currentBranch != FORBIDDEN_IF_NOT_DEST_BRANCH:
  print("FORBIDDEN: Merging from '" + mergeBranch + "' to '" + currentBranch + "' is NOT allowed. Contact your administrator. Now, you should use git merge --abort and keep on your work.")
  sys.exit(1) # This is exactly the situation which is forbidden

# All is OK, so keeps on normal merge
sys.exit(0)

要共享所有这些工作,我创建了一个新的Github repository,并在需要时在其中添加更多的钩子:)

有关信息,您还可以设置受保护的分支以保护它们免受某些用户的侵害

这是complete documentation

让我知道是否需要进一步的帮助。

答案 1 :(得分:2)

因此,您希望您的接收前钩子拒绝的是任何分支推送,如果有的话,该分支推送会合并当前的testing提示,除非该推送是指向testing本身或指向{{ 1}}。做到这一点几乎和说起来一样简单:

master

edit:糟糕,它拒绝基于测试的任何内容,而不仅仅是拒绝将其合并的任何内容。固定。