Рассмотрим два варианта создания 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-сервер с нуля.
Дополнительное чтиво