Шпаргалка Git для управления версиями файлов - децентрализованной система управления версиями файлов. gitosis - удобное средство, позволяющее управлять репозитариями, используя всего один пользовательский аккаунт, управляя доступом пользователей к репозитариям на основе ssh-ключей. gitosis хранит все свои настройки в отдельном репозитарии и в любой момент можно отследить историю внесенных в них изменений.
OS: Ubuntu 9.10 Server x86_64. Установка git- сервера и gitosis.
gitosis – удобное средство, позволяющее управлять репозитариями, используя всего один пользовательский аккаунт, управляя доступом пользователей к репозитариям на основе Использование ssh, ssh-keygen, sshpass с примерами-ключей.
# 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, ssh-keygen, sshpass с примерами ключ для пользователя, который будет конфигурировать репозитарий. Дело в том, что 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, ssh-keygen, sshpass с примерами). Если при работе с удаленного компьютера запрашивается пароль для пользователя 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
$ .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'а.