Git hook, чтобы предотвратить создание новых веток из определенных веток - PullRequest
8 голосов
/ 23 ноября 2011

Я начинаю играть с ловушками git, и я хотел бы создать такую, чтобы разработчик не мог создавать новую ветку в конкретной ветке. Текущий процесс в нашей компании должен выглядеть следующим образом:

git checkout master
git fetch
git reset --hard origin/master
git checkout -b [branch name]
do awesome things.

Однако иногда при быстром движении некоторые разработчики в конечном итоге запускают эту новую ветку из промежуточного репо. Что вызывает горе.

Итак, я хотел бы создать ловушку для прерывания, когда разработчик начинает создавать новую ветку, проверить, в какой ветке они находятся, и либо exit 1, если ветвь не master (или просто вообще остановите действие, если имя ветки staging), или разрешите его в противном случае.

Edit:

По мере того, как я продолжаю искать, я понимаю, что хочу ловушку предварительной проверки, которая, кажется, не существует. Если у кого-то нет более хорошей идеи, я перейду к выводу очень большого предупреждения в ловушку после проверки, если приведенный выше сценарий сбудется.

Ответы [ 2 ]

1 голос
/ 26 февраля 2016

Для клиентской стороны вы можете создать post-checkout ловушку, которая использует git branch --merged , чтобы увидеть ветви, объединенные в текущую ветку.Если ветка, которую вы хотите предотвратить, объединяется с текущей веткой, вы выдаете ошибку.

Код в bach будет выглядеть следующим образом:

#!/bin/sh

getBranchName()
{
    echo $(git rev-parse --abbrev-ref HEAD)
}

getMergedBranches()
{
    echo $(git branch --merged)
}

if [ "$(getBranchName)" != "dev" ]; then
    if [[ $(getMergedBranches) == *"dev"* ]]; then
        echo "Don't create branches from the dev branch!"
        exit 1
    fi
fi
0 голосов
/ 23 ноября 2011

Я бы поймал это на благословенной стороне репо.Если разработчик запустил ветку на чем-то отличном от коммита, который не принадлежит последнему мастеру, отклоните push ветки.Они могут исправить, оттолкнув от мастера и нажав снова.Убедитесь, что ваше сообщение об ошибке достаточно наглядно, чтобы они знали, как исправить свою ситуацию.

Далее, обновите ваш мастер, не проверяя его:мастер:

git checkout -b somecoolfeature master

Вам даже не нужно иметь местного мастера в курсе:

git fetch
git checkout -b somecoolfeature origin/master
do awesome stuff :)
...