Ограничение прав пользователей в git

Бывали ситуации, когда сделали какой-то внерелизный автономный функционал или просто быстрый хотфикс, а в мастере один из коллег уже успел чего изменить, что ещё не протестировано. А это нарушает одно из правил — в мастере должен быть только стабильный код. Поэтому код в мастер не должен попадать непротестированным.

Почему он это сделал — это другой вопрос: просто не переключил ветку или намеряно. Или к джуниору подбежал директор или менеджер и сказал, что нужно быстро исправить. Тут нужно бить такого программиста по рукам, но лучше предупредить болезнь, чем лечить её =)

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

Поэтому нужно ограничивать push в репозиторий на основе этих правил: тестерам дать право изменять файлы только в рамках одной директории. А программистам не давать возможность пушить в мастер, только какой-то группе доверенных программистов, а по сути тим-лиду.

Мы используем gitolite и он позволяет это сделать на уровне конфигурации.

Есть следующие группы пользователей

  • мега-админы - они и только они могут менять историю в репе. Это чревато, но разрешено только одному человеку для непредвиденных ситуаций =)
  • гит-мастера — это те, кто может пушить в мастер (по сути мёржить тоже), тэгировать, создавать и удалять ветки с версией релиза и хотфиксные ветки. Название веток начинается соответственно с v и hf. Т.е: v1.0.1 и hf.1.0.1
  • разработчики — это пользователи, которые не могут пушить в мастер и создавать тэги. Также не могут удалить вертку с версией релиза и хотфиксную ветку. Могут создавать и удалять любые другие ветки.
  • тестеры — ограниченные пользователи. Могут менять файлы в только пределах директории protected/test.
  • только чтение — давать возможность только для чтения репы. Например, для технических писателей.
  • группа аутсорсеров - у них свои порядки, но они не могут удалить ветки master, dev, hotfixes, release

Есть 5 репозиториев: site, mobile, api, common-modules, outsource-site

Только на site распространяются правила для тестировщиков.

На site, mobile, api, common-modules — наши основные диктаторские правила

На outsource-site — «мягкие» правила.

repo    gitolite-admin
        RW+     =   id_rsa



# ========== Группировка веток или путей =============


#Не разрешать писать в master и создавать тэги
@not_write = master$ refs/tags
# Не разрешать создавать ветки и удалять начинающиеся с v и hf.
@not_create = v hf.
# Тестеры могут писать только сюда
@tester_write_only = NAME/protected/tests/


# Эти ветки не могут удалять обычные программеры
@old_branches = master$ dev$ hotfixes$ realease$



# ========== Группы пользователей ==========


# Админы имеют право писать всюду
@admins = id_rsa
# Гит-админы могут писать в мастер и создавать ветки из @not_create
@git-admins = zagirov
# Разработчики
@developers = @git-admins ivanov petrov sidorov
# Тестеры имеют право на запись только в @tester_write_only
@testers = test-girl
# Только на чтение
@developers-ro = tech-writer
# Аутсорсеры со своими правилами
@outsource = five-hard-dev1 five-hard-dev2



# =========== Правила ===================




# Правила применяются для всех
repo @all
  RW+CD                      = @admins

# Главный сайт с тестами
repo  site
  # Правило для тестировщиков
  # Если оно создаётся, ниже должно быть правило, RWCD NAME/ = @developers
  # Оно разрешает другим писать сюда
  RW                         = @testers
  RW   @tester_write_only    = @testers
  R                          = @testers
  -                          = @testers


#Группа, куда применяются общие правила работы с ветками @git-branch-rules
@git-branch-rules = site mobile api common-modules

repo @git-branch-rules
  # Разрешаем писать в @not_write для @git-admins
  # У @developers на @not_write только чтение
  RWCD @not_write            = @git-admins
  -    @not_write            = @git-admins
  R    @not_write            = @developers
  -    @not_write            = @developers

  # Разрешаем создавать и удалять ветки @not_create для @git-admins
  # @developers не могут создавать удалять @not_create
  RWCD @not_create           = @git-admins
  -    @not_create           = @git-admins
  RW   @not_create           = @developers
  -    @not_create           = @developers

  # @developers могуть писать и создавать в @old_branches, но не удалять их
  RWC  @old_branches         = @developers
  -    @old_branches         = @developers

  # Для всего остального разрешаем доступ для @developers
  RWCD                       = @developers
  # Это нужно, т.к раньше для @testers запретили запись для определённых файлов
  RWCD NAME/                 = @developers

  # @developers-ro могут только читать
  R                          = @developers-ro


# Это обычный реп, без жёстких правил. Здесь просто запрещается удалять ветки master dev hotfixes realease
repo  outsource-site
  RWC  @old_branches         = @outsource
  -    @old_branches         = @outsource
  RWCD                       = @outsource

Если вы используете не gitolite, а другой продукт: gitosis или github, то скорее всего сделать это можно на хуках.