Как ограничить слияние определенной ветки с другими ветками в Gitlab? - PullRequest
0 голосов
/ 02 ноября 2018

Есть ли способ ограничить объединение из определенной ветви в другие ветви? Позвольте мне объяснить:

У меня есть ветка 'testing' и ветка 'master' в Gitlab. Группа создает ветви объектов, объединяет их в 'тестирование' для утверждения, а затем объединяет ветвь объектов в 'мастер' после утверждения.

Иногда, чтобы получить одобрение некоторых функций, могут потребоваться месяцы, и поэтому код некоторое время хранится в ветке 'testing'. Между тем, другая ветвь функций может попытаться объединиться в «тестирование», и возникнут конфликты. Однако ожидается, что мы всего лишь люди, и иногда кто-то может случайно объединить «тестирование» со своей веткой функций при обработке конфликта, что, очевидно, неправильно. Вместо этого мы должны переключиться на «тестирование» и объединить нашу функциональную ветвь с «тестированием», тем самым управляя конфликтом внутри тестовой ветви.

Любой совет приветствуется.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Итак, что вы хотите, чтобы ваш крюк предварительного получения отклонял, это любой толчок ответвления, который включает текущий наконечник testing, если там что-то есть, если только толчок не равен testing или master. Это почти так же легко, как сказать:

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: упс, он отвергал все, что основано на тестировании, а не просто что-то, что его слило. неподвижная.

0 голосов
/ 13 ноября 2018

Для начала убедитесь, что ваши потребности очень нормальные и традиционные. Ответ ... Да.

Как предотвратить слияние веток с другой, настройка сервера 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 репозиторий , в который я буду добавлять дополнительные хуки при необходимости:)

Для информации вы также можете настроить защищенные ветви, чтобы защитить их от некоторых пользователей

Это полная документация об этом.

Дайте мне знать, если вам понадобится дополнительная помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...