gitosis: свой удаленный git-репозиторий под Ubuntu, CentOS

Рассмотрим два варианта создания git-репозитория с контролируемым доступом для нескольких разработчиков. Оба варианта затрагивают доступ по протоколу ssh, остальные протоколы - local, git, http не рассматриваются.

Первый вариант - самый простой: если на сервере уже настроен ssh с определенной группой разработчиков, то остается инициализировать bare-репозитoрий (репозитoрий без рабочей (work) директории). После инициализации репозитoрия с ним можно сразу работать, доступны как команда push, так и pull. Этого вполне достаточно что бы небольшая групка разработчиков начала работу.

Второй вариант более гибкий, с помощью gitosis можно разграничивать права для разных пользователей и репозитoриев, настраивать некоторые общие параметры для всех репозиториев.

Установим git и gitosis из репозиториев.

Для Ubuntu

sudo apt-get install git-core gitosis

Для CentOS

sudo yum install git.i386 gitosis.noarch

Создание удаленного git-репозитория, управляемого доступом по ssh

В этом варианте предполагается, что уже существуют пользователи на удаленном сервере с будущими git-репозиториями и для каждого из них настроен ssh-доступ к этому серверу.

На сервере создадим bare-репозиторий для нового проекта

cd /opt/projects/
mkdir foo.git
cd foo.git
git --bare init

Либо можно клонировать уже существующий

git clone --bare project1 foo.git

На стороне одного из разработчиков создадим проект или перейдем в папку с существующим проектом и добавим его в удаленный репозиторий

cd ~/projects/foo
git init
echo "project foo" > README
git add .
git commit -m 'start project foo'
git remote add origin proft@192.168.1.3:/opt/projects/foo.git
git push origin master

Теперь каждый, у кого есть ssh доступ, может клонировать репозиторий

git clone ivan@192.168.1.3:/opt/projects/foo.git
echo "TODO: write documentation" >> README
git ci -am 'new todo'
git push origin master

Создание удаленного git-репозитория, управляемого доступом через gitosis

Выше приведенный способ прост в настройки, но в нем есть одно ограничение - все пользователи имеют права на push и pull, а это не всегда допустимо. Для разграничения пользователей по правам для разных репозиториев существует утилита gitosis. Эта утилита хранит свои настройки в своем личном репозитраии, все изменения вносятся в конфигурационный файл и коммитятся на сервер, там срабатывает hook, после которого все изменения вступают в действие.

Создадим пользователя gitosis

adduser gitosis

установим пароль

passwd gitosis

Для инициализации gitosis нужен публичный ключ, по которому мы логинимся по ssh, т.е. тот кто инициализирует gitosis своим публичным ключом - будет иметь админские права. Скопируем этот ключ на сервер:

scp ~/.ssh/id_rsa.pub proft@192.168.1.3:/home/proft/

На сервере, инициализируем gitosis этим ключом

sudo -H -u gitosis gitosis-init < /home/proft/id_rsa.pub

Теперь можно клонировать репозиторий с gitosis и настраивать в нем доступы и права для разработчиков.

git clone ssh://gitosis@192.168.1.3:22/gitosis-admin.git
cd gitosis-admin.git

Для добавления новых пользователей нужны их публичные ключи, которые складываем в папку keydir. Gitosis будет использовать имя файла для идентификации пользователя (без расширения .pub), например пользователь dev1 и соответствующий ему публичный ключ - dev1.pub.

За настройку списка пользователей, репозиториев, прав отвечает файл gitosis.conf.

Представим что у нас есть публичные ключи от пользователей dev1 и dev2, сохраним их в папке keydir. Опишем новый проект, foo, к которому будут иметь доступ push/pull пользователи из группы developers, а именно dev1, dev2. Эти же разработчики будут иметь право на чтение для репозитория area51.

$ vim gitosis.conf
[group developers]
writable = foo
readonly = area51
members = dev1 dev2

Сохраним изменения

git commit -am 'added foo project, developers group and dev1, dev2 users'
git push origin master 

Создадим проект foo

mkdir foo
cd foo
git init 
echo "project foo" > README
git add .
git commit -m 'start project foo'

Укажем удаленный репозиторий и отправим в него только-что созданный проект, все остальное сделает gitosis

git remote add origin gitosis@192.168.1.3:foo.git
git push origin master

Теперь разработчик dev1 может клонировать репозитраий и работать с ним

git clone gitosis@192.168.1.3:foo.git

Что бы добавить существующий проект в удаленный репозиторий необходимо: описать его в gitosis.conf, перейти в папку с существуюшим репозиторием, добавить новый сервер и сделать push.

git remote add origin gitosis@192.168.1.3:project1.git
git push origin master

Создавать самому репозиторий для project1 нет надобности, gitosis все сделает за нас.

По-умолчанию репозитории в CentOS находятся

/var/lib/gitosis/repositories

для Ubuntu

/srv/gitosis/repositories/

Веб-интерфейс к git-репозиторию

Хорошая статья с описанием настройки nginx и cgit - Собственный git-сервер с нуля.

Дополнительное чтиво

blog comments powered by Disqus