How to restrict merging specific branch into other branches in Gitlab?
Is there a way to restrict merging from a specific branch into other branches? Allow me to explain:
I have a 'testing' branch and a 'master' branch in Gitlab. The team creates feature branches, merges them into 'testing' for approval and then merge the feature branch into 'master' once approved.
Sometimes, it can take months to get approval of some features, and therefore code is sat in the 'testing' branch for a while. Meanwhile, another feature branch may try to merge into 'testing' and conflicts will arise. This is expected, however, we are only human, and occasionally someone may accidentally merge 'testing' into their feature branch when handling the conflict, which is obviously wrong. Instead, we should switch to 'testing' and merge our feature branch into 'testing' thus managing the conflict within the testing branch.
Any advise is appreciated.
git merge gitlab
add a comment |
Is there a way to restrict merging from a specific branch into other branches? Allow me to explain:
I have a 'testing' branch and a 'master' branch in Gitlab. The team creates feature branches, merges them into 'testing' for approval and then merge the feature branch into 'master' once approved.
Sometimes, it can take months to get approval of some features, and therefore code is sat in the 'testing' branch for a while. Meanwhile, another feature branch may try to merge into 'testing' and conflicts will arise. This is expected, however, we are only human, and occasionally someone may accidentally merge 'testing' into their feature branch when handling the conflict, which is obviously wrong. Instead, we should switch to 'testing' and merge our feature branch into 'testing' thus managing the conflict within the testing branch.
Any advise is appreciated.
git merge gitlab
add a comment |
Is there a way to restrict merging from a specific branch into other branches? Allow me to explain:
I have a 'testing' branch and a 'master' branch in Gitlab. The team creates feature branches, merges them into 'testing' for approval and then merge the feature branch into 'master' once approved.
Sometimes, it can take months to get approval of some features, and therefore code is sat in the 'testing' branch for a while. Meanwhile, another feature branch may try to merge into 'testing' and conflicts will arise. This is expected, however, we are only human, and occasionally someone may accidentally merge 'testing' into their feature branch when handling the conflict, which is obviously wrong. Instead, we should switch to 'testing' and merge our feature branch into 'testing' thus managing the conflict within the testing branch.
Any advise is appreciated.
git merge gitlab
Is there a way to restrict merging from a specific branch into other branches? Allow me to explain:
I have a 'testing' branch and a 'master' branch in Gitlab. The team creates feature branches, merges them into 'testing' for approval and then merge the feature branch into 'master' once approved.
Sometimes, it can take months to get approval of some features, and therefore code is sat in the 'testing' branch for a while. Meanwhile, another feature branch may try to merge into 'testing' and conflicts will arise. This is expected, however, we are only human, and occasionally someone may accidentally merge 'testing' into their feature branch when handling the conflict, which is obviously wrong. Instead, we should switch to 'testing' and merge our feature branch into 'testing' thus managing the conflict within the testing branch.
Any advise is appreciated.
git merge gitlab
git merge gitlab
asked Nov 2 '18 at 8:28
DavidDavid
5,0652984137
5,0652984137
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
To begin, be sure your needs is very normal and traditional.
The answer is ... Yes.
How to prevent merging from a branch to another, setting up a server Git Hook
These are some useful links:
Git Hook explanations in Official Git Book- GitLab server-side Hook explanations
An example with a Git Hook written in Ruby to prevent merging 'staging' branch to 'master' one
To help you (and for fun ^^), I wrote a dedicated hook in Python to reach your specific needs (you just need to adapt FORBIDDEN_SOURCE_BRANCH and FORBIDDEN_IF_NOT_DEST_BRANCH if you want to work with some other branches).
#!/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)
To share all this work, I created a new Github repository, in which I'll add further hooks when needed :)
For information, you can also setup protected branches to keep them safe from some users
This is the complete documentation about that.
Let me know if you need further help.
But I've had the impression that OP wanted a way to prevent merging from a specific branch rather than to a specific branch...
– RomainValeri
Nov 13 '18 at 16:04
@RomainValeri That's correct, I want to prevent merging FROM a specific branch.
– David
Nov 14 '18 at 8:11
I updated my answer consequently to reach your needs.
– Bsquare
Nov 14 '18 at 9:54
To help you (and for fun ^^), I wrote a dedicated hook in Python to reach your specific needs. I updated my answer consequently.
– Bsquare
Nov 14 '18 at 11:48
add a comment |
So, what you want your pre-receive hook to reject is any branch push that incorporates the current testing
tip if there's something there, unless the push is to testing
itself, or to master
. It's almost as easy to do that as to say it:
testtip=`git rev-parse testing`
[[ `git merge-base testing master` = $testtip ]] && exit 0 # okay if testing's merged
while read old new ref; do
[[ $ref = refs/heads/* ]] || continue # only care about branches
[[ $new = *[^0]* ]] || continue # not checking branch deletions
[[ $ref = */master ]] && continue # not checking pushes to master
[[ $ref = */testing ]] && continue # nor testing
range=$new; [[ $old = *[^0]* ]] && range=$old..$new
[[ `git rev-list --first-parent $range` != *$testtip* ]]
&& [[ `git rev-list $range` = *$testtip* ]]
&& {
echo push to $ref merges from unmerged testing commits, rejecting push
exit 1
}
done
edit: whoops, it was rejecting anything based on testing, not just anything that merged it. fixed.
Could you explain where your code is suppose to be run please? I do not recognize the language nor the usage of it sorry. Looks like bash?
– Julien Rousé
Nov 14 '18 at 15:41
@JulienRousé That's a pre-receive hook, yes, it's bash. saygit help hooks
.
– jthill
Nov 14 '18 at 15:45
Thaks I'll look it up
– Julien Rousé
Nov 14 '18 at 15:49
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53115040%2fhow-to-restrict-merging-specific-branch-into-other-branches-in-gitlab%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
To begin, be sure your needs is very normal and traditional.
The answer is ... Yes.
How to prevent merging from a branch to another, setting up a server Git Hook
These are some useful links:
Git Hook explanations in Official Git Book- GitLab server-side Hook explanations
An example with a Git Hook written in Ruby to prevent merging 'staging' branch to 'master' one
To help you (and for fun ^^), I wrote a dedicated hook in Python to reach your specific needs (you just need to adapt FORBIDDEN_SOURCE_BRANCH and FORBIDDEN_IF_NOT_DEST_BRANCH if you want to work with some other branches).
#!/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)
To share all this work, I created a new Github repository, in which I'll add further hooks when needed :)
For information, you can also setup protected branches to keep them safe from some users
This is the complete documentation about that.
Let me know if you need further help.
But I've had the impression that OP wanted a way to prevent merging from a specific branch rather than to a specific branch...
– RomainValeri
Nov 13 '18 at 16:04
@RomainValeri That's correct, I want to prevent merging FROM a specific branch.
– David
Nov 14 '18 at 8:11
I updated my answer consequently to reach your needs.
– Bsquare
Nov 14 '18 at 9:54
To help you (and for fun ^^), I wrote a dedicated hook in Python to reach your specific needs. I updated my answer consequently.
– Bsquare
Nov 14 '18 at 11:48
add a comment |
To begin, be sure your needs is very normal and traditional.
The answer is ... Yes.
How to prevent merging from a branch to another, setting up a server Git Hook
These are some useful links:
Git Hook explanations in Official Git Book- GitLab server-side Hook explanations
An example with a Git Hook written in Ruby to prevent merging 'staging' branch to 'master' one
To help you (and for fun ^^), I wrote a dedicated hook in Python to reach your specific needs (you just need to adapt FORBIDDEN_SOURCE_BRANCH and FORBIDDEN_IF_NOT_DEST_BRANCH if you want to work with some other branches).
#!/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)
To share all this work, I created a new Github repository, in which I'll add further hooks when needed :)
For information, you can also setup protected branches to keep them safe from some users
This is the complete documentation about that.
Let me know if you need further help.
But I've had the impression that OP wanted a way to prevent merging from a specific branch rather than to a specific branch...
– RomainValeri
Nov 13 '18 at 16:04
@RomainValeri That's correct, I want to prevent merging FROM a specific branch.
– David
Nov 14 '18 at 8:11
I updated my answer consequently to reach your needs.
– Bsquare
Nov 14 '18 at 9:54
To help you (and for fun ^^), I wrote a dedicated hook in Python to reach your specific needs. I updated my answer consequently.
– Bsquare
Nov 14 '18 at 11:48
add a comment |
To begin, be sure your needs is very normal and traditional.
The answer is ... Yes.
How to prevent merging from a branch to another, setting up a server Git Hook
These are some useful links:
Git Hook explanations in Official Git Book- GitLab server-side Hook explanations
An example with a Git Hook written in Ruby to prevent merging 'staging' branch to 'master' one
To help you (and for fun ^^), I wrote a dedicated hook in Python to reach your specific needs (you just need to adapt FORBIDDEN_SOURCE_BRANCH and FORBIDDEN_IF_NOT_DEST_BRANCH if you want to work with some other branches).
#!/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)
To share all this work, I created a new Github repository, in which I'll add further hooks when needed :)
For information, you can also setup protected branches to keep them safe from some users
This is the complete documentation about that.
Let me know if you need further help.
To begin, be sure your needs is very normal and traditional.
The answer is ... Yes.
How to prevent merging from a branch to another, setting up a server Git Hook
These are some useful links:
Git Hook explanations in Official Git Book- GitLab server-side Hook explanations
An example with a Git Hook written in Ruby to prevent merging 'staging' branch to 'master' one
To help you (and for fun ^^), I wrote a dedicated hook in Python to reach your specific needs (you just need to adapt FORBIDDEN_SOURCE_BRANCH and FORBIDDEN_IF_NOT_DEST_BRANCH if you want to work with some other branches).
#!/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)
To share all this work, I created a new Github repository, in which I'll add further hooks when needed :)
For information, you can also setup protected branches to keep them safe from some users
This is the complete documentation about that.
Let me know if you need further help.
edited Nov 14 '18 at 16:09
answered Nov 13 '18 at 16:03
BsquareBsquare
3,24231033
3,24231033
But I've had the impression that OP wanted a way to prevent merging from a specific branch rather than to a specific branch...
– RomainValeri
Nov 13 '18 at 16:04
@RomainValeri That's correct, I want to prevent merging FROM a specific branch.
– David
Nov 14 '18 at 8:11
I updated my answer consequently to reach your needs.
– Bsquare
Nov 14 '18 at 9:54
To help you (and for fun ^^), I wrote a dedicated hook in Python to reach your specific needs. I updated my answer consequently.
– Bsquare
Nov 14 '18 at 11:48
add a comment |
But I've had the impression that OP wanted a way to prevent merging from a specific branch rather than to a specific branch...
– RomainValeri
Nov 13 '18 at 16:04
@RomainValeri That's correct, I want to prevent merging FROM a specific branch.
– David
Nov 14 '18 at 8:11
I updated my answer consequently to reach your needs.
– Bsquare
Nov 14 '18 at 9:54
To help you (and for fun ^^), I wrote a dedicated hook in Python to reach your specific needs. I updated my answer consequently.
– Bsquare
Nov 14 '18 at 11:48
But I've had the impression that OP wanted a way to prevent merging from a specific branch rather than to a specific branch...
– RomainValeri
Nov 13 '18 at 16:04
But I've had the impression that OP wanted a way to prevent merging from a specific branch rather than to a specific branch...
– RomainValeri
Nov 13 '18 at 16:04
@RomainValeri That's correct, I want to prevent merging FROM a specific branch.
– David
Nov 14 '18 at 8:11
@RomainValeri That's correct, I want to prevent merging FROM a specific branch.
– David
Nov 14 '18 at 8:11
I updated my answer consequently to reach your needs.
– Bsquare
Nov 14 '18 at 9:54
I updated my answer consequently to reach your needs.
– Bsquare
Nov 14 '18 at 9:54
To help you (and for fun ^^), I wrote a dedicated hook in Python to reach your specific needs. I updated my answer consequently.
– Bsquare
Nov 14 '18 at 11:48
To help you (and for fun ^^), I wrote a dedicated hook in Python to reach your specific needs. I updated my answer consequently.
– Bsquare
Nov 14 '18 at 11:48
add a comment |
So, what you want your pre-receive hook to reject is any branch push that incorporates the current testing
tip if there's something there, unless the push is to testing
itself, or to master
. It's almost as easy to do that as to say it:
testtip=`git rev-parse testing`
[[ `git merge-base testing master` = $testtip ]] && exit 0 # okay if testing's merged
while read old new ref; do
[[ $ref = refs/heads/* ]] || continue # only care about branches
[[ $new = *[^0]* ]] || continue # not checking branch deletions
[[ $ref = */master ]] && continue # not checking pushes to master
[[ $ref = */testing ]] && continue # nor testing
range=$new; [[ $old = *[^0]* ]] && range=$old..$new
[[ `git rev-list --first-parent $range` != *$testtip* ]]
&& [[ `git rev-list $range` = *$testtip* ]]
&& {
echo push to $ref merges from unmerged testing commits, rejecting push
exit 1
}
done
edit: whoops, it was rejecting anything based on testing, not just anything that merged it. fixed.
Could you explain where your code is suppose to be run please? I do not recognize the language nor the usage of it sorry. Looks like bash?
– Julien Rousé
Nov 14 '18 at 15:41
@JulienRousé That's a pre-receive hook, yes, it's bash. saygit help hooks
.
– jthill
Nov 14 '18 at 15:45
Thaks I'll look it up
– Julien Rousé
Nov 14 '18 at 15:49
add a comment |
So, what you want your pre-receive hook to reject is any branch push that incorporates the current testing
tip if there's something there, unless the push is to testing
itself, or to master
. It's almost as easy to do that as to say it:
testtip=`git rev-parse testing`
[[ `git merge-base testing master` = $testtip ]] && exit 0 # okay if testing's merged
while read old new ref; do
[[ $ref = refs/heads/* ]] || continue # only care about branches
[[ $new = *[^0]* ]] || continue # not checking branch deletions
[[ $ref = */master ]] && continue # not checking pushes to master
[[ $ref = */testing ]] && continue # nor testing
range=$new; [[ $old = *[^0]* ]] && range=$old..$new
[[ `git rev-list --first-parent $range` != *$testtip* ]]
&& [[ `git rev-list $range` = *$testtip* ]]
&& {
echo push to $ref merges from unmerged testing commits, rejecting push
exit 1
}
done
edit: whoops, it was rejecting anything based on testing, not just anything that merged it. fixed.
Could you explain where your code is suppose to be run please? I do not recognize the language nor the usage of it sorry. Looks like bash?
– Julien Rousé
Nov 14 '18 at 15:41
@JulienRousé That's a pre-receive hook, yes, it's bash. saygit help hooks
.
– jthill
Nov 14 '18 at 15:45
Thaks I'll look it up
– Julien Rousé
Nov 14 '18 at 15:49
add a comment |
So, what you want your pre-receive hook to reject is any branch push that incorporates the current testing
tip if there's something there, unless the push is to testing
itself, or to master
. It's almost as easy to do that as to say it:
testtip=`git rev-parse testing`
[[ `git merge-base testing master` = $testtip ]] && exit 0 # okay if testing's merged
while read old new ref; do
[[ $ref = refs/heads/* ]] || continue # only care about branches
[[ $new = *[^0]* ]] || continue # not checking branch deletions
[[ $ref = */master ]] && continue # not checking pushes to master
[[ $ref = */testing ]] && continue # nor testing
range=$new; [[ $old = *[^0]* ]] && range=$old..$new
[[ `git rev-list --first-parent $range` != *$testtip* ]]
&& [[ `git rev-list $range` = *$testtip* ]]
&& {
echo push to $ref merges from unmerged testing commits, rejecting push
exit 1
}
done
edit: whoops, it was rejecting anything based on testing, not just anything that merged it. fixed.
So, what you want your pre-receive hook to reject is any branch push that incorporates the current testing
tip if there's something there, unless the push is to testing
itself, or to master
. It's almost as easy to do that as to say it:
testtip=`git rev-parse testing`
[[ `git merge-base testing master` = $testtip ]] && exit 0 # okay if testing's merged
while read old new ref; do
[[ $ref = refs/heads/* ]] || continue # only care about branches
[[ $new = *[^0]* ]] || continue # not checking branch deletions
[[ $ref = */master ]] && continue # not checking pushes to master
[[ $ref = */testing ]] && continue # nor testing
range=$new; [[ $old = *[^0]* ]] && range=$old..$new
[[ `git rev-list --first-parent $range` != *$testtip* ]]
&& [[ `git rev-list $range` = *$testtip* ]]
&& {
echo push to $ref merges from unmerged testing commits, rejecting push
exit 1
}
done
edit: whoops, it was rejecting anything based on testing, not just anything that merged it. fixed.
edited Nov 14 '18 at 15:37
answered Nov 14 '18 at 14:34
jthilljthill
27.9k34477
27.9k34477
Could you explain where your code is suppose to be run please? I do not recognize the language nor the usage of it sorry. Looks like bash?
– Julien Rousé
Nov 14 '18 at 15:41
@JulienRousé That's a pre-receive hook, yes, it's bash. saygit help hooks
.
– jthill
Nov 14 '18 at 15:45
Thaks I'll look it up
– Julien Rousé
Nov 14 '18 at 15:49
add a comment |
Could you explain where your code is suppose to be run please? I do not recognize the language nor the usage of it sorry. Looks like bash?
– Julien Rousé
Nov 14 '18 at 15:41
@JulienRousé That's a pre-receive hook, yes, it's bash. saygit help hooks
.
– jthill
Nov 14 '18 at 15:45
Thaks I'll look it up
– Julien Rousé
Nov 14 '18 at 15:49
Could you explain where your code is suppose to be run please? I do not recognize the language nor the usage of it sorry. Looks like bash?
– Julien Rousé
Nov 14 '18 at 15:41
Could you explain where your code is suppose to be run please? I do not recognize the language nor the usage of it sorry. Looks like bash?
– Julien Rousé
Nov 14 '18 at 15:41
@JulienRousé That's a pre-receive hook, yes, it's bash. say
git help hooks
.– jthill
Nov 14 '18 at 15:45
@JulienRousé That's a pre-receive hook, yes, it's bash. say
git help hooks
.– jthill
Nov 14 '18 at 15:45
Thaks I'll look it up
– Julien Rousé
Nov 14 '18 at 15:49
Thaks I'll look it up
– Julien Rousé
Nov 14 '18 at 15:49
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53115040%2fhow-to-restrict-merging-specific-branch-into-other-branches-in-gitlab%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown