Инструменты пользователя

Инструменты сайта


gitosis

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

gitosis [2019/01/16 17:33]
gitosis [2020/06/13 13:45] (текущий)
Строка 1: Строка 1:
 +====== gitosis ======
  
 +{{htmlmetatags>
 +metatag-description=(Gitosis — удобное средство, позволяющее управлять Git репозиториями, используя один пользовательский аккаунт.)
 +}}
 +{{ ::gitosis-01.jpg?nolink |}}
 +
 +[[Git]] - децентрализованной система управления версиями файлов. [[http://eagain.net/gitweb/?p=gitosis.git|gitosis]] - удобное средство, позволяющее управлять репозитариями, используя всего один пользовательский аккаунт, управляя доступом пользователей к репозитариям на основе ssh-ключей. gitosis хранит все свои настройки в отдельном репозитарии и в любой момент можно отследить историю внесенных в них изменений.
 +
 +====== Git и Gitosis ======
 +OS: Ubuntu 9.10 Server x86_64. Установка git- сервера и gitosis.
 +
 +gitosis – удобное средство, позволяющее управлять репозитариями, используя всего один пользовательский аккаунт, управляя доступом пользователей к репозитариям на основе [[ssh]]-ключей.
 +  * **Настройка сервера**: Установим пакеты и зависимости.
 +<code>
 +# 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.
 +...
 +</code>
 +Изменим домашнюю директорию для пользователя gitosis, который будет владельцем репозиториев. Пользователь не должен иметь возможности для логина (т.е. пользователю gitosis нельзя устанавливать пароль), но шелл ему нужен корректный – иначе gitosis не будет работать.
 +<code>
 +# mkdir /home/git
 +# chown -R gitosis:gitosis /home/git/
 +# vipw
 +You have modified /etc/passwd.
 +</code>
 +При помощи утилиты ssh-keygen необходимо сгенерировать [[ssh]] ключ для пользователя, который будет конфигурировать репозитарий. Дело в том, что [[gitosis]] хранит все свои настройки в отдельном репозитарии и в любой момент можно отследить историю внесенных в них изменений. Комментарий по умолчанию - имя-пользователя@имя-хоста. Имя файла для хранения публичного ключа образуется из имени файла для частного ключа добавлением суффикса '.pub'. Ключ хоста должен иметь пустую парольную фразу.
 +<code>
 +# su - gitosis
 +$ mkdir .ssh
 +$ cd .ssh
 +$ ssh-keygen -t rsa -f gitosiskey -q
 +Enter passphrase (empty for no passphrase): 
 +Enter same passphrase again:
 +
 +</code>
 +Теперь создадим репозитарий с настройками и добавим наш ключ:
 +<code>
 +$ 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
 +</code>
 +Скопируйте ключ gitosiskey (генерированный выше, без приставки '.pub') с сервера на локальный компьютер в директорию $HOME/.ssh/ и переименуйте в id_rsa (вариант для нескольких приватных ключей рассмотрен здесь [[SSH]]). Если при работе с удаленного компьютера запрашивается пароль для пользователя gitosis, значит скорее всего gitosis не добавил ваш keyfile в authorized_keys. Для исправления ошибки выполните команды:
 +<code>
 +# chown -R gitosis:gitosis /home/git/
 +# chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update
 +</code>
 +Разрешим пользователю gitosis доступ по SSH
 +<code>
 +# nano /etc/ssh/sshd_config
 +...
 +# Authentication:
 +PermitRootLogin no
 +AllowUsers noroot gitosis
 +...
 +# /etc/init.d/ssh restart
 +</code>
 +  * **Настройка локального компьютера**: Скачиваем ключ gitosiskey на локальный компьютер. Помещаем ключ в директорию $HOME/.ssh/ и переименуем в id_rsa. Права на файл id_rsa должны быть установлены в **600** иначе файл читаться не будет. Установим git.
 +<code>
 +$ .ssh/
 +$ cat gitosiskey >> id_rsa
 +$ chmod 600 id_rsa
 +# aptitude install git-core git-doc
 +</code>
 +
 +===== Настройка gitosis'а и создание тестового репозитория =====
 +  * **Создание тестового репозитория**
 +Выкачаем с сервера репозаторий gitosis-admin:
 +<code>
 +$ cd gittest
 +$ git clone gitosis@example.ru:gitosis-admin.git
 +$ cd gitosis-admin
 +</code>
 +Редактируем gitosis.conf. Создаем новый репозиторий для нашего проекта, например test2.
 +<code>
 +$ 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
 +</code>
 +**P.S.**:<code>Имена пользователей в members должны быть идентичны именам сгенерированных приватных ключей. Иначе в моем случае при коммите нового репозитория возникала ошибка:
 +$ git push origin master
 +ERROR:gitosis.serve.main:Repository read access denied
 +fatal: The remote end hung up unexpectedly
 +</code>
 +
 +Этими строками мы создали непосредственно сам проект test2 и трех пользователей для работы с проектом test2. Пользователь mainwriteuser@write имеет права на запись изменений в проект test2, остальные два (onlyreadusr1@read, onlyreadusr2@read) только чтение проекта test2. Эти пользователи не должны быть зарегистрированными пользователями на git- сервере, главное условие, чтобы на рабочих машинах этих пользователей были открытые ключи.
 +
 +Создадим ключи для пользователей проекта test2.
 +<code>
 +$ 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
 +</code>
 +Открытые ключи формата имя_пользователя.pub (mainwriteuser.pub, onlyreadusr1.pub, onlyreadusr2.pub) нужно скопировать в каталог gitosis-admin/keydir. Приватные файлы ключей ( без расширения '.pub') раздаются реальным пользователям, которые они должны добавить в директорию $HOME/.ssh/.
 +
 +После правки gitosis.conf и копирования ключей нужно закоммитить изменения в локальный репозиторий и командой git push отправить коммит в центральный репозиторий:
 +<code>
 +$ 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)
 +....
 +</code>
 +Теперь git- сервер репозиториев настроен. Нужные репозитории будут созданы автоматически при первом коммите.
 +===== Первичная загрузка проекта в репозиторий =====
 +Первичную загрузку проекта может делать только пользователь с правом писать в главный репозиторий, в нашем случае только mainwriteuser.
 +
 +В каталоге проекта (пусть весть проект test2 состоит из одного файла README) создадим локальный репозиторий и добавим в проект файл(-ы):
 +<code>
 +$ 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(-)
 + ...
 +</code>
 +Укажем локальному репозиторию, где находится главный репозиторий:
 +<code>
 +$ git remote add origin gitosis@example.ru:test2.git
 +</code>
 +Отправим коммит в главный репозиторий:
 +<code>
 +$ git push origin master
 +</code>
 +**Enjoy!** Если ошибок нет, значит наш проект сохранен в главном репозитории. Теперь старый проект можно полностью удалить и начать работу в новом каталоге под управлением git'а.