作者:柿饼VIP | 来源:互联网 | 2022-11-30 18:37
有没有办法限制从特定分支到其他分支的合并?请允许我解释一下:
我在Gitlab中有一个'测试'分支和一个'主'分支.团队创建功能分支,将它们合并到 "测试"中以供批准,然后在批准后将功能分支合并为 "主".
有时,可能需要几个月才能获得某些功能的批准,因此代码会在"测试"分支中停留一段时间.同时,另一个功能分支可能会尝试合并为"测试",并且会出现冲突.这是预期的,但是,我们只是人类,偶尔会有人在处理冲突时偶然将"测试"合并到他们的功能分支中,这显然是错误的.相反,我们应该切换到'测试'并将我们的功能分支合并到'测试',从而管理测试分支内的冲突.
任何建议表示赞赏.
1> Bsquare ℬℬ..:
首先,请确保您的需求非常正常和传统。答案是……是的。
如何防止从分支合并到另一个分支,设置服务器Git Hook
这些是一些有用的链接:
Git Hook官方Git书中的解释
GitLab服务器端挂钩说明
一个用Ruby编写的Git Hook 的示例,以防止将“ staging”分支合并到“ master”分支
为了帮助您(并且为了娱乐^^),我在Python中编写了一个专用的钩子来满足您的特定需求(如果您想与其他分支一起工作,则只需要改编FORBIDDEN_SOURCE_BRANCH和FORBIDDEN_IF_NOT_DEST_BRANCH即可)。
#!/bin/python
##
## Author: Bertrand Benoit
## 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存储库,在需要时将在其中添加更多的钩子:)
有关信息,您还可以设置受保护的分支,以防止某些用户对其进行安全保护。
这是关于此的完整文档。
让我知道您是否需要进一步的帮助。