Бывали ситуации, когда сделали какой-то внерелизный автономный функционал или просто быстрый хотфикс, а в мастере один из коллег уже успел чего изменить, что ещё не протестировано. А это нарушает одно из правил — в мастере должен быть только стабильный код. Поэтому код в мастер не должен попадать непротестированным.
Почему он это сделал — это другой вопрос: просто не переключил ветку или намеряно. Или к джуниору подбежал директор или менеджер и сказал, что нужно быстро исправить. Тут нужно бить такого программиста по рукам, но лучше предупредить болезнь, чем лечить её =)
Ситуация вторая: есть тестировщики, которые пишут автоматические тесты, которые не отделимы от проекта, соответственно им нужно дать право только на конкретную папку, где находятся тесты, чтобы они случайно не сделали изменения в других файлах.
Поэтому нужно ограничивать 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, то скорее всего сделать это можно на хуках.