Первая проблема заключается в том, что означает «только чтение» и «чтение-запись» в контексте git. «Запись» в git состоит из двух отдельных операций. «Коммит», который создает ревизию, охватывающую все дерево (у git вообще нет истории для каждого файла) и «толчок», который копирует эту ревизию в ваш центральный репозиторий.
Нет способа ограничить «коммит» для кого-либо, кроме вас самих, так как пользователь должен установить любые хуки в свой рабочий репозиторий вручную. Таким образом, рассматриваемый пользователь сможет создать коммит, модифицирующий что-либо вообще. Они также смогут делиться этим коммитом с другими членами вашей команды, отправляя патч, пакет или позволяя им напрямую извлекать данные из рабочего репозитория.
То, что вы можете ограничить, - это "толчок" в центральное хранилище. Вы можете создать хук update
или pre-receive
(они отличаются только соглашением о вызовах), который будет проверять содержимое ревизий и отклонять их, если они касаются чего-то, что вам не нужно. Хук update
получает 3 аргумента: имя ветки, старый коммит и новый коммит, так что вы просто git diff --name-status
старый и новый коммит и, если задан пользователь (вам придется посмотреть, как получить это из gitolite), выполнение push и изменения влияют не на тот подкаталог, который вы разрешаете, отклоните push.
Пользователь по-прежнему сможет создавать ревизию, которая влияет на другие части дерева и помещать ее в ствол, если кто-то еще ее толкнет. Это может быть полезно, но ваши коллеги должны знать, что они должны проанализировать изменения, которые они извлекли непосредственно из консультанта.
Обратите внимание, что проверка авторов коммитов или коммиттеров небезопасна, поскольку автора можно установить свободно.