gitolite — это средство для создания централизованных репозиториев для совместной разработки через git.
Зачем оно нужно?
Родные средства git для этой задачи на сегодня явно недостаточны: родной git-протокол не содержит каких-либо средств авторизации, а для работы через ssh потребуется завести полноценного юзера в ОС (с шеллом), что далеко не всегда уместно и желательно.
gitolite же позволит вам заводить пользователей независимо от наличия аккаунта в ОС и гибко раздавать права.
Пресуппозиции
- Тема большая. Следовательно, описаны далеко не все возможности.
- В своей документации разработчик gitolite ссылается на огромное количество проблем, которые возникают от недостаточного понимания принципов работы с ssh с аутентификацией через публичные ключи. Поэтому если вы несколько «плаваете» в этом вопросе — в конце статьи есть небольшое howto.
- В статье подразумевается, что сервер, предназначенный для установки gitolite, работает на unix-like системе
Установка
На самом деле в большинстве случаев установка не вызывает каких-либо вопросов.
На сервере:
- Заводим в системе нового пользователя. Для удобства назовем его git.
- Копируем публичный ключ пользователя, который будет администратором, в домашнюю папку пользователя git. Обратите внимание, что имя ключа должны быть формата .pub, где — это то, как вас будет знать gitolite. Это имя может не совпадать с каким-либо системным. Если мы хотим, чтобы gitolite знал нас как gitadmin, то файл с ключем должен быть переименован в gitadmin.pub
Логинимся под пользователем git и устанавливаем gitolite:
su git
cd ~
git clone git://github.com/sitaramc/gitolite
gitolite/src/gl-system-install
gl-setup -q ~/gitadmin.pub
Настройка
Особенность настройки gitolite заключается в том, что почти никакие операции по его настройке НЕ производятся напрямую на сервере. Чтобы добавить нового пользователя, репозиторий или изменить права доступа надо сделать git clone специального gitolite-admin репозитория, внести изменения и сделать git push. Дело в том, что gitolite использует целую систему хуков, чтобы эти изменения вступили в силу.
Итак, чтобы создать новый репозиторий и добавить нужных пользователей потребуется:
- Из-под пользователя, публичный ключ которого был добавлен в gitolite при его установке (или любого другого пользователя, обладающего достаточными правами на репозиторий gitolite-admin) исполняем:
git clone git@server:gitolite-admin
Это, соответственно, создаст в текущей папке копию админ-репозитория. Он представляет собой две папки: conf и keydir. В папке conf хранится файл gitolite.conf, содержащий список репозиториев и прав доступа к ним. В папке keydir — публичные ключи пользователей, про которых должен знать gitolite.
- Чтобы добавить нового пользователя просто записываем его публичный ключ в папку keydir. Имя ключа до окончания .pub будет являться именем пользователя в системе gitolite. Примеры: user1.pub или john-smith.pub. В имени допустимы символы точки и подчеркивания.
- Чтобы добавить репозиторий и изменить права редактируем файл conf/gitolite.conf. Исходно он выглядит так:
repo gitolite-admin
RW+ = gitadmin
repo testing
RW+ = @all
Добавим строчки:
repo megaproject
RW+ = gitadmin user1 john-smith
Эти строчки описывают новый репозиторий megaproject, права на который имеют пользователи gitadmin, user1, john-smith.
- После чего применяем и отправляем все изменения:
git add .
git commit -a -m "New repo and users added"
git push
Несколько слов о формате конфиг-файла:
Работаем с вновь созданным репозиторием
Собственно, работа с gitolite с точки зрения пользователя совершенно традиционна. Следуя нашему примеру, разработчик может исполнить команды:
git clone git@server:megaproject
cd megaproject
touch newfile
git add .
git commit -a -m "newfile"
git push git@server:megaproject master
ssh — аутентификация через публичный ключ
Как вы, возможно, знаете, в ssh помимо традиционной аутентификации по паролю существует возможность пройти оную с использованием пары ключей. Аутентификация через публичный ключ — это когда вы генерируете пару ключей и отдаете публичный ключ на тот хост, который должен вас узнавать. После этого через ssh можно входить на удаленную машину не вводя пароль.
Чтобы сгенерировать пару ключей для своего пользователя исполните
ssh-keygen -t rsa
Эта команда создаст в папке ~/.ssh два файла: id_rsa и id_rsa.pub. Первый — это частный ключ, который следует хранить как зеницу ока, а второй (с расширением .pub) — это публичный ключ, который и нужно передавать на удаленный хост. На самом деле внутри этого файла просто одна длинная текстовая строка, которую можно передать просто как текст.
А на машине, доступ к которой требуется предоставить, необходимо внести указанный ключ в файлик ~/.ssh/authorized_keys того пользователя, доступ под которым необходимо организовать.
gitolite — принцип работы
Это для тех, кому интересно, как оно вообще устроено. Собственно, как уже понятно из описания, gitolite работает поверх ssh с использованием аутентификации через public-key (точнее, это наиболее популярная конфигурация).
На сервере заводится единственный реальный пользователь, через которого будет происходить работа с репозиториями. А «магия» gitolite заключается в том, что в authorized_keys эти ключики попадают с опцией «command=[path]/gl-auth-command ...». Эта опция предписывает ssh-серверу запускать указанную команду независимо от того, что реально хотел исполнить юзер. При этом оригинальная команда сохраняется в переменной SSH_ORIGINAL_COMMAND, которую и считывает gitolite, чтобы узнать, что от него хотели.