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

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

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

Это должно работать для частных репозиториев (следовательно, не GitHub или Bitbucket).

Ответы (3)

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

  1. Перейти в ваш репозиторий.

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

    #! / Bin / sh
    
    branch = "$ (git rev-parse --abbrev-ref HEAD)"
    
    если ["$ branch" = "master"]; тогда
      echo "Вы не можете напрямую выполнить фиксацию в основной ветке"
      выход 1
    фи
    
  3. Сделать исполняемым (не требуется в Windows):

    chmod + x .git / hooks / pre-commit
    

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

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

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

Для этого вы можете использовать утилиту pre-commit. Он имеет встроенный хук no-commit-to-branch, который можно использовать для предотвращения коммитов в одну или несколько веток.

Настройка

Базовый процесс настройки:

  • Установить, используя pip или Homebrew (инструкции на https://pre-commit.com/#install)
  • Создайте файл .pre-commit-config.yaml в корне вашего проекта (см. Ниже первый черновик)
  • Установите хуки в свою конфигурацию Git, выполнив предварительную установку.

Базовая конфигурация защиты ответвлений

Вот базовая конфигурация, которая включает только хук no-commit-to-branch:

репо:
- репо: https://github.com/pre-commit/pre-commit-hooks
  версия: v3.3.0
  крючки:
    - id: no-commit-to-branch
      аргументы: ['--branch', 'master']

Если вы хотите защитить несколько ветвей, вы можете использовать несколько аргументов - branch в списке аргументов:

репо:
- репо: https://github.com/pre-commit/pre-commit-hooks
  версия: v3.3.0
  крючки:
    - id: no-commit-to-branch
      args: ['--branch', 'master', '--branch', 'staging']

Разве это не излишество?

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

Может имеет смысл установить глобально через

git config --global core.hooksPath ~/githooks

и перемещение этого файла предварительной фиксации в этот каталог

2022 WebDevInsider