Запобігання комітам у майстер-гілці


84

(Для простоти) У мене є masterгілка та a devв моєму Git-репо. Я хочу переконатися, що masterфілія працює завжди, тому вся робота, яку я виконую, повинна бути у devфілії.

Однак, коли я зливаю свої зміни з --no-ffоб’єднанням, я, як правило, залишаюся у masterгілці і просто продовжую працювати в ній (бо я забуваю перевірити свою devгілку).

Чи можу я виставити правило для masterгілки, яке говорить про те , що я не можу робити коміти, та швидке злиття вперед, а лише --no-ffзлиття з іншої гілки?

Це має працювати для приватних розміщених сховищ (ergo, а не GitHub та BitBucket).


4
"перемотування вперед" - це не річ. Фіксації - це просто фіксації, git commitробить нову, перемотування вперед не відбувається. Здається, ви просто хочете заборонити звичайні коміти, коли є поточна гілка master, і в цьому випадку загляньте в pre-commitгачок.
Торек

Відповіді:


154

Так, це можливо. Ви повинні створити гачок перед фіксацією, який відхиляє коміти до головного гілки. Git не викликає гачок перед фіксацією, коли ви викликаєте команду злиття , тому цей хук буде відхиляти лише звичайні коміти.

  1. Перейдіть до свого сховища.
  2. Створіть файл .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
    
  3. Зробіть його виконуваним (не потрібно в Windows ):

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

Щоб вимкнути швидке злиття, потрібно також додати наступну опцію до вашого файлу .git / config :

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

Якщо ви також хочете захистити головну гілку на своєму пульті, перевірте цю відповідь: Як обмежити доступ до головної гілки на git


Це виглядає точно так, як мені потрібно - чи працює це і в Windows?
Расмус Бекгаард,

2
@ RasmusBækgaard так і буде: скрипт bash для хука буде інтерпретований Git bash, включеним до Git для Windows. (Вам просто не потрібен крок chmod)
VonC

Примітка: Ви також можете запобігти натисканню на віддалену masterгілку в гачку перед натисканням. приклад
Аарон Гоффман

4
Приємно, для тих, хто шукає спосіб додати ці правила або інші git-хуки до сховища проектів, перевірте цей простий пакет npm: github.com/kilianc/shared-git-hooks , оскільки ви не можете включити нічого, що знаходиться під Каталог .git до сховища.
Джордж Димитріадіс,

9
також, це лише для нашого локального репозиторію git, як ми можемо застосовувати правила в різних репозиторіях git для всіх розробників, не вимагаючи від них вручну змінювати вміст каталогу .git?
Олександр Міллс

13

Для цього ви можете використовувати утиліту попереднього фіксації . Він має вбудований no-commit-to-branchгачок, який можна використовувати для запобігання фіксації в одній або декількох гілках.

Налаштування

Основний процес налаштування:

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

Базова конфігурація для захисту гілок

Ось основна конфігурація, яка включає лише no-commit-to-branchгачок:

repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
  rev: v3.3.0
  hooks:
    - id: no-commit-to-branch
      args: ['--branch', 'master']

Якщо ви хочете захистити декілька гілок, ви можете використати кілька --branchаргументів у списку аргументів:

repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
  rev: v3.3.0
  hooks:
    - id: no-commit-to-branch
      args: ['--branch', 'master', '--branch', 'staging']

Чи не все це надмірно?

Попереднє фіксація має багато інших вбудованих хуків та велику колекцію спільно створених хуків, які змінять спосіб очищення та перевірки ваших комітів. Причиною, яку я згадую про це, є те, що, хоча цей інструмент може бути надмірним для запобігання фіксаціям захищеної гілки, він має безліч інших функцій, які роблять його переконливим і простим доповненням до будь-якого проекту git.


7

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

git config --global core.hooksPath ~/githooks

і переміщення цього pre-commitфайлу в цей каталог


Що робити, якщо у мене є кілька сховищ - чи не вплине це на всі?
Rasmus Bækgaard

1
і це те, що ти можеш робити в більшості випадків
Мішель

Скажімо, у мене є цей дивний проект, де вони перейменовані masterна Production- чи можна робити винятки?
Расмус Бекгаард,

ви можете використовувати або оператор у bash, щоб вказати більше гілок, які ви хочете захистити на стороні клієнта
Мішель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.