# CODEOWNERS _Совместная работа · GitLab Knowledge Base_ **TL;DR:** Файл `.github/CODEOWNERS` привязывает пути в репо к командам или людям. При открытии PR, который трогает эти пути, владельцы автоматически назначаются ревьюверами. В связке с branch protection блокирует merge без их approve. CODEOWNERS - текстовый файл в репо, где каждая строка привязывает glob-паттерн пути к owner'у (команде или пользователю). Когда открывается PR, GitHub читает CODEOWNERS, смотрит изменённые файлы, и автоматически добавляет owner'ов в reviewers. ## Расположение Один из трёх путей, GitHub найдёт: - `.github/CODEOWNERS` (наиболее распространённый) - `CODEOWNERS` в корне - `docs/CODEOWNERS` Хранить в `.github/CODEOWNERS` обычно удобнее: вся GitHub-специфичная конфигурация в одном месте. ## Синтаксис Похож на `.gitignore`, но вместо игнорирования - назначение owner'а: ``` # глобальный fallback * @acme/leads # backend /backend/ @acme/backend /backend/db/migrations/ @acme/database # frontend /frontend/ @acme/frontend *.tsx @acme/frontend # документация *.md @acme/docs # один конкретный файл /SECURITY.md @alice @bob # OR-логика: любой из перечисленных /infra/ @acme/devops @acme/sre ``` Owner'ом может быть: - `@username` - конкретный пользователь - `@org/team-name` - команда внутри организации - `email@example.com` - валидный email связанный с GitHub-аккаунтом ## Правило «последний выигрывает» Если файл попадает под несколько правил, побеждает **последнее** совпадение. Поэтому общие правила пишут сверху, специфичные - снизу: ``` * @acme/leads # сначала общее /backend/ @acme/backend # потом backend /backend/db/ @acme/database # ещё специфичнее ``` Файл `/backend/db/migration/0042.py` принадлежит `@acme/database`, не `@acme/backend` - потому что `/backend/db/` определён позже и более специфичен. ## В связке с branch protection Сам по себе CODEOWNERS только **назначает** reviewers. Чтобы заблокировать merge без их approve, в [branch-protection](/courses/git/kb/branch-protection.md) нужна галка «Require review from Code Owners». Тогда: 1. PR трогает `/backend/db/`. 2. Назначается `@acme/database`. 3. Merge заблокирован до approve от кого-то из этой team. ## Подводные камни - **Team должна иметь access к репо.** Если ты упомянул `@acme/database` в CODEOWNERS, но команда не добавлена в Settings -> Manage access - GitHub пропустит назначение. - **Owner не равно автор кода.** CODEOWNERS - кто отвечает сейчас, не кто написал. Для авторства смотри [blame](/courses/git/kb/blame.md). - **CODEOWNERS не выдаёт права.** Если owner не имеет write-доступа к репо, его approve не считается. Сначала выдать доступ (через team или прямой grant), потом CODEOWNERS. - **Без `Require review from Code Owners`** в branch protection CODEOWNERS - только подсказка о reviewers, не блокирующая. ## Команды ```bash git log --format='%an' -- /path/to/file ``` Узнать, кто чаще всех менял файл - кандидаты в owner'ы ## См. также - [Branch protection rules](/courses/git/kb/branch-protection.md) - [Pull Request (PR)](/courses/git/kb/pull-request.md) - [Code review](/courses/git/kb/code-review.md)