Подтвердить что ты не робот

Git: предотвращение фиксации в главной ветки

(Для простоты) у меня есть ветвь master и dev в моем Git -repo. Я хочу, чтобы ветвь master всегда работала, поэтому вся работа, которую я делаю, должна находиться в ветки dev.

Однако, когда я объединять свои изменения в слиянии --no-ff, я склонен оставаться в ветке master и просто продолжаю работать в нем (потому что я забыл проверить мою ветку dev).

Могу ли я установить правило для ветки master, которая утверждает, что я не могу совершать коммиты, и ускоренное слияние объединяется, но только --no-ff сливается с другой ветвью?

Это должно работать для частных размещенных репозиториев (ergo not GitHub и BitBucket).

4b9b3361

Ответ 1

Да, это возможно. Вы должны создать крюк pre-commit, который отклоняет фиксации для мастер-ветки. Git не вызывает перехват фиксации при вызове команды merge, поэтому этот хук будет отклонять только обычные коммиты.

  • Перейдите в ваш репозиторий.
  • Создайте файл .git/hooks/pre-commit со следующим содержимым:

    #!/bin/sh
    
    branch="$(git rev-parse --abbrev-ref HEAD)"
    
    if [ "$branch" = "master" ]; then
      echo "You can't commit directly to master branch"
      exit 1
    fi
    
  • Сделайте его исполняемым (не требуется в Windows):

    $ chmod +x .git/hooks/pre-commit
    

Чтобы отключить слияния fast-forwad, вы также должны добавить следующий параметр в ваш файл .git/config:

[branch "master"]
    mergeoptions = --no-ff

Если вы хотите также защитить главную ветку на своем пульте, проверьте этот ответ: Как ограничить доступ к главной ветке на git