Gitolite

Обновлено 6 мая 2019

Gitolite

Gitolite — удобное средство, позволяющее управлять Git-репозиториями через один пользовательский аккаунт. Управление доступом пользователей к репозиториям осуществляется на основе SSH-ключей. Gitolite позволяет гибко настраивать доступ к репозиториям, управляя несколькими репозиториями под одной учетной записью пользователя, с использованием SSH-ключей для идентификации. Конечным пользователям не нужны учетные записи на сервере, они будут входить через один общий аккаунт, который не позволит им запускать произвольные команды.

Заметка

Статья написана с учётом работы Git-клиента в ОС Windows.

Установка Gitolite

Для установки программы выполните:

emerge -a dev-vcs/gitolite

После установки будет создан пользователь git без пароля с домашней директорией /var/lib/gitolite/.

Настройка Gitolite

Создайте ключи для root:

ssh-keygen -t rsa

Будут созданы два файла:

  • /root/.ssh/id_rsa.pub - публичный ключ
  • /root/.ssh/id_rsa - закрытый ключ

Создание репозитория с настройками

Скопируйте открытый ключ:

cp /root/.ssh/id_rsa.pub /tmp/id_rsa.pub

Инициализация Gitolite

Выполните настройку от пользователя git

su git

cd

gitolite setup -pk /tmp/id_rsa.pub

exit

Заметка

Ключ -pk позволяет удалить данные прошлой настройки Gitolite, если они присутствовали на момент выполнения команды.

Удалите временную копию открытого ключа:

rm /tmp/id_rsa.pub

Если планируется использовать GitWeb, измените права доступа к директории, чтобы репозиторий с настройками не был виден в Web:

chmod 700 /var/lib/gitolite/repositories/gitolite-admin.git

Настройка репозитория пользователя

Склонируйте конфигурационный репозиторий в /tmp/gitolite-admin:

git clone git@имя_сервера:gitolite-admin.git /tmp/gitolite-admin

Перейдите в директорию с настройками:

cd /tmp/gitolite-admin

Скопируйте открытый ключ пользователя gituser в директорию /tmp/gitolite-admin/keydir любым удобным способом - например, командой для защищенного копирования файлов scp:

scp root@userhostname:/home/gituser/.ssh/id_rsa.pub ./keydir/gituser.pub

Заметка

При этом имя файла открытого ключа клиента в каталоге /tmp/gitolite-admin/keydir является также именем пользователя в Gitolite.

Настройте новый репозиторий project1 пользователя gituser:

/tmp/gitolite-admin/conf/gitolite.conf

repo    gitolite-admin
RW+     =    id_rsa

repo    project1
RW+     =    gituser
Права, доступ и группы

Права могут быть указаны следующим образом:
"R - только чтение
"RW" - чтение добавление коммитов, запрещен rewind (push --force)
"RW+" - полный доступ
"RWC" - возможность создавать ветку
"RWD" - возможность удалять ветку
"-" - запретить запись


Объектами доступа могут быть:
"master@"" - ветки
"ref/tags" - теги (версии)
"NAME/имя_файла" - имена файлов/каталогов


Для создания группы используется следующий синтаксис:
"@groupname" = user1 user2 user3


Он же используется для группировки веток:
@importantbranches = master$ developer$ test$
repo testing
RW @importantbranches = @groupname
- @importantbranches = @groupname
RW+ = @groupname

Зафиксируйте и запишите настройки:

git commit -am "Granted full access for gituser@remotehost to project1""

git push origin master

Создание нового репозитория

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

git clone ssh://git@имя_сервера/project1.git

Проверка sshd

rc-status | grep sshd
 sshd                                                              [  started  ]

Должен быть разрешен доступ по SSH пользователю git:

/etc/ssh/sshd_config

AllowUsers git

Настройка Git-демон

/etc/conf.d/git-daemon

GITDAEMON_OPTS="--syslog --port=9418 --reuseaddr --base-path=/var/lib/gitolite/repositories/ --export-all" 
GIT_USER="apache"

Заметка

При проблеме перезапуска измените номер порта --port=9418 на другой номер, перезапустите git-daemon, измените обратно и ещё раз перезапустите демон git-daemon.

Создание пользовательского ключа в Linux

В сеансе пользователя на пользовательском компьютере выполните:

ssh-keygen -t rsa

В директории ~/.ssh будут созданы два файла:

  • id_rsa - закрытый ключ
  • id_rsa.pub - публичный ключ

Если публичный ключ записан в директорию keys репозитория настроек Gitolite на сервере, а в файле conf/gitolite.conf настроены права к репозиториям, то пользователь получит доступ к репозиториям на сервере.

Создание пользовательского ключа в Windows

Генерация пользовательского RSA-ключа производится с помощью встроенной в MinGW32-окружение утилиты ssh-keygen.exe.

В результате в каталоге C:\Users\имя_пользователя\.ssh будут созданы созданы два файла:

  • id_rsa - закрытый ключ
  • id_rsa.pub - публичный ключ

Важно

Не переименовывайте приватный и публичный ключи SSH, так как cборка MinGW32 + Git-2.6.3 (32-bit) умеет работать только с ключом с именем id_rsa.

Настройка прав на файлы репозиториев

При сохранение файлов репозиториев gitolite присваивает их пользователю и группе git. Права же устанавливаются согласно параметру UMASK в файл /var/lib/gitolite/.gitolite.rc. Это может быть важно, если Git-демон запускается не под пользователем git.

Примеры прав доступа к репозиториям

Разрешить группе developers производить любые действия с репозиторием, кроме модификации ветки master:

conf/gitolite.conf

repo myrep
    -    master$ = @developers
    RW+          = @developers

Запретить rewind для ветки master (это правило означает, что группа @developer может добавлять коммиты только в ветку master):

conf/gitolite.conf

repo myrep
    RW  master$ = @developers

Разрешить группе developers выполнять любые действия с репозиторием, кроме создание тегов (теги может создавать только maindeveloper):

conf/gitolite.conf

repo myrep
 RW+ refs/tags = maindeveloper
 -   refs/tags = @developers
 RW            = developers