gitosis

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

Git и Gitosis

OS: Ubuntu 9.10 Server x86_64. Установка git- сервера и gitosis.

gitosis – удобное средство, позволяющее управлять репозитариями, используя всего один пользовательский аккаунт, управляя доступом пользователей к репозитариям на основе Настройка и использование SSH-ключей.

  • Настройка сервера: Установим пакеты и зависимости.
# aptitude install git-core git-doc gitosis
...
Настраивается пакет gitosis (0.2+20080825-15) ...
Warning: The home dir /srv/gitosis you specified can't be accessed: No such file or directory
Adding system user `gitosis' (UID 106) ...
Adding new group `gitosis' (GID 116) ...
Adding new user `gitosis' (UID 106) with group `gitosis' ...
Not creating home directory `/srv/gitosis'.

Please read /usr/share/doc/gitosis/README.Debian
for information about how to use gitosis.
...

Изменим домашнюю директорию для пользователя gitosis, который будет владельцем репозиториев. Пользователь не должен иметь возможности для логина (т.е. пользователю gitosis нельзя устанавливать пароль), но шелл ему нужен корректный – иначе gitosis не будет работать.

# mkdir /home/git
# chown -R gitosis:gitosis /home/git/
# vipw
You have modified /etc/passwd.

При помощи утилиты ssh-keygen необходимо сгенерировать Настройка и использование SSH ключ для пользователя, который будет конфигурировать репозитарий. Дело в том, что gitosis хранит все свои настройки в отдельном репозитарии и в любой момент можно отследить историю внесенных в них изменений. Комментарий по умолчанию - имя-пользователя@имя-хоста. Имя файла для хранения публичного ключа образуется из имени файла для частного ключа добавлением суффикса '.pub'. Ключ хоста должен иметь пустую парольную фразу.

# su - gitosis
$ mkdir .ssh
$ cd .ssh
$ ssh-keygen -t rsa -f gitosiskey -q
Enter passphrase (empty for no passphrase): 
Enter same passphrase again:
$ 

Теперь создадим репозитарий с настройками и добавим наш ключ:

$ cd ..
$ gitosis-init < .ssh/gitosiskey.pub
Initialized empty Git repository in /home/git/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /home/git/repositories/gitosis-admin.git/
$ exit

Скопируйте ключ gitosiskey (генерированный выше, без приставки '.pub') с сервера на локальный компьютер в директорию $HOME/.ssh/ и переименуйте в id_rsa (вариант для нескольких приватных ключей рассмотрен здесь Настройка и использование SSH). Если при работе с удаленного компьютера запрашивается пароль для пользователя gitosis, значит скорее всего gitosis не добавил ваш keyfile в authorized_keys. Для исправления ошибки выполните команды:

# chown -R gitosis:gitosis /home/git/
# chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update

Разрешим пользователю gitosis доступ по SSH

# nano /etc/ssh/sshd_config
...
# Authentication:
PermitRootLogin no
AllowUsers noroot gitosis
...
# /etc/init.d/ssh restart
  • Настройка локального компьютера: Скачиваем ключ gitosiskey на локальный компьютер. Помещаем ключ в директорию $HOME/.ssh/ и переименуем в id_rsa. Права на файл id_rsa должны быть установлены в 600 иначе файл читаться не будет. Установим git.
$ .ssh/
$ cat gitosiskey >> id_rsa
$ chmod 600 id_rsa
# aptitude install git-core git-doc
  • Создание тестового репозитория

Выкачаем с сервера репозаторий gitosis-admin:

$ cd gittest
$ git clone gitosis@example.ru:gitosis-admin.git
$ cd gitosis-admin

Редактируем gitosis.conf. Создаем новый репозиторий для нашего проекта, например test2.

$ nano gitosis.conf
[gitosis]

[group gitosis-admin]
writable = gitosis-admin
members = gitosis@keep

[group test2-write]
writable = test2  
members = mainwriteuser

[group test2-read]
readonly = test2  
members = onlyreadusr1 onlyreadusr2

P.S.:

Имена пользователей в members должны быть идентичны именам сгенерированных приватных ключей. Иначе в моем случае при коммите нового репозитория возникала ошибка:
$ git push origin master
ERROR:gitosis.serve.main:Repository read access denied
fatal: The remote end hung up unexpectedly

Этими строками мы создали непосредственно сам проект test2 и трех пользователей для работы с проектом test2. Пользователь mainwriteuser@write имеет права на запись изменений в проект test2, остальные два (onlyreadusr1@read, onlyreadusr2@read) только чтение проекта test2. Эти пользователи не должны быть зарегистрированными пользователями на git- сервере, главное условие, чтобы на рабочих машинах этих пользователей были открытые ключи.

Создадим ключи для пользователей проекта test2.

$ ssh-keygen -t rsa -N "" -C mainwriteuser@write -f mainwriteuser -q
$ ssh-keygen -t rsa -N "" -C onlyreadusr1@read -f onlyreadusr1 -q
$ ssh-keygen -t rsa -N "" -C onlyreadusr2@read -f onlyreadusr2 -q
$ ls
mainwriteuser  mainwriteuser.pub  onlyreadusr1  onlyreadusr1.pub  onlyreadusr2  onlyreadusr2.pub

Открытые ключи формата имя_пользователя.pub (mainwriteuser.pub, onlyreadusr1.pub, onlyreadusr2.pub) нужно скопировать в каталог gitosis-admin/keydir. Приватные файлы ключей ( без расширения '.pub') раздаются реальным пользователям, которые они должны добавить в директорию $HOME/.ssh/.

После правки gitosis.conf и копирования ключей нужно закоммитить изменения в локальный репозиторий и командой git push отправить коммит в центральный репозиторий:

$ git add .
$ git commit -am 'Added project Test2; Added group Test2'
$ git push
warning: You did not specify any refspecs to push, and the current remote
warning: has not configured any push refspecs. The default action in this
warning: case is to push all matching refspecs, that is, all branches
warning: that exist both locally and remotely will be updated.  This may
warning: not necessarily be what you want to happen.
warning: 
warning: You can specify what action you want to take in this case, and
warning: avoid seeing this message again, by configuring 'push.default' to:
warning:   'nothing'  : Do not push anything
warning:   'matching' : Push all matching branches (default)
warning:   'tracking' : Push the current branch to whatever it is tracking
warning:   'current'  : Push the current branch
Counting objects: 10, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (7/7), 1.57 KiB, done.
Total 7 (delta 0), reused 0 (delta 0)
....

Теперь git- сервер репозиториев настроен. Нужные репозитории будут созданы автоматически при первом коммите.

Первичную загрузку проекта может делать только пользователь с правом писать в главный репозиторий, в нашем случае только mainwriteuser.

В каталоге проекта (пусть весть проект test2 состоит из одного файла README) создадим локальный репозиторий и добавим в проект файл(-ы):

$ cd directory/test2
$ git init
$ touch README
$ git add .
$ git commit -am 'First local commit!'
[master (root-commit) 316810b] First local commit!
 6 files changed, 622 insertions(+), 0 deletions(-)
 ...

Укажем локальному репозиторию, где находится главный репозиторий:

$ git remote add origin gitosis@example.ru:test2.git

Отправим коммит в главный репозиторий:

$ git push origin master

Enjoy! Если ошибок нет, значит наш проект сохранен в главном репозитории. Теперь старый проект можно полностью удалить и начать работу в новом каталоге под управлением git'а.

PQ VPS сервера в 28+ странах.