1 июня 2009 г.

Установка git сервера на Freebsd 7.2 c клиентами EGit на Eclipse под Windows

Введение в git.

Система спроектирована как набор программ, специально разработанных с учётом их использования в скриптах. Это позволяет удобно создавать специализированные системы контроля версий на базе Git или пользовательские интерфейсы. Например, Cogito является именно таким примером фронтенда к репозиториям Git. А StGit использует Git для управления коллекцией патчей.

Git поддерживает быстрое разделение и слияние версий, включает инструменты для визуализации и навигации по нелинейной истории разработки. Как и Darcs, BitKeeper, Mercurial, SVK, Bazaar и Monotone, Git предоставляет каждому разработчику локальную копию всей истории разработки, изменения копируются из одного репозитория в другой.

Удалённый доступ к репозиториям Git обеспечивается git-daemon, SSH, или HTTP сервером. TCP-сервис git-daemon входит в дистрибутив Git и является наряду с SSH наиболее распространённым и надёжным методом доступа. HTTP метод доступа, несмотря на ряд ограничений, очень популярен в контролируемых сетях, потому что позволяет использование существующих конфигураций сетевых фильтров.


Установка.

cd /usr/ports/devel/git
make && make install

Для публичного доступа к репозиторию можно воспользоваться git-daemon.
Также возможен доступ через http (апач+dav+gitweb).
Я же выбрал более простой и надёжный путь - ssh.

Для начала определимся с сервером.
Создаем пользователя, который будет работать с репозиториями, а так же являться администратором gitosis: gituser (создаем без пароля).

$sudo adduser gituser

При создании, в качестве домашней указываем корневую директорию с репозиториями.

Для начала мы сосредоточимся на авторизации пользователя через ssh.
Для этого, проверим настройки sshd, примерно как здесь.

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

$git clone git://eagain.net/gitosis.git
$cd gitosis
$sudo python setup.py install

Далее надо создать gitosis-хостинг с авторизацией только по ключам:
То есть проинициализировать репозиторий самого gitosis в указанной нами директории.
Я решил управление gitosis оставить на сервере.

$ssh-keygen -t rsa

Эта команда создает в домашней директории пользователя gituser пару id_rsa и id_rsa.pub. Первый файл - секретный, должен быть закрыт от любого пользователя на системе, а так же не передаваться по сети.
Второй ключ публичный, мы его должны передать в gitosis при инициализации gitosis. Его рекомендуют скопировать в директорию, доступную всем для чтения, например /tmp . Далее инициализируем gitosis и его репозиторий.
(Первые две команды, в случае, если у вас не установлен sudo.)

#cd /usr/ports/security/sudo ; make install clean
#rehash
#sudo -H -u gituser gitosis-init < /tmp/id_rsa.pub
Initialized empty Git repository in /tank/gitrepos/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /tank/gitrepos/repositories/gitosis-admin.git/

ключ -H обязателен, иначе команда sudo будет выполняться в домашнюю директорию предыдущего пользователя (например /root).

Теперь у нас есть несколько директорий в домашней директории gituser. Папка repositories предназначена для хранения репозиториев, там уже находится репозиторий настроек gitosis (gitosis-admin).

Если у вас старый setuptools, рекомендуют прописать следующие права:

sudo chmod 755 ~/repositories/gitosis-admin.git/hooks/post-update

Далее, заходим под пользователем gituser и забираем репозиторий администрирования gitosis:

$git clone gituser@YOUR_SERVER_HOSTNAME:gitosis-admin.git
$cd gitosis-admin

Это удаленно, а у так как у нас админ на этом же хосте, то локально:

#su gituser
$cd ~/tmp
$git clone ~/repositories/gitosis-admin.git gitosis-admin
$cd gitosis-admin

Создание "репозиториев" в gitosis.
Редактируем файл gitosis.conf:

[group projectteam]
members = vasya
writable = project

где project - название будущего репозитория.

Создаем публичный ключ в клиенте windows.
Для этого используем пакет msysGit. Я выбрал portable версию, ибо нам из пакета нужен только генератор ssh ключей (PortableGit\bin\ssh-keygen.exe).

>ssh-keygen -C “vasya” -t rsa

Обычно пара сохраняется в папку c:\\Documents and Settings\\Username\\.ssh на XP или c:\\Users\\Username\\.ssh на Vista. Заливаем публичный ключ (vasya.pub) в директорию gitosis-admin/keydir, место куда мы извлекли репозиторий настроек gitosis.

"Пушим" настройки в репозиторий gitosis.

git add keydir/vasya.pub
git commit -a -m "Allow vasya write access to project"
git push

После этого проверить, что файл конфигурации изменился (есть ссылка в домашней директории gituser), а также скопировались ключи в ~/repositories/gitosis-admin.git/gitosis-export/keydir. При загрузке в репозиторий gitosis сам извлекает изменившееся файлы в директорию gitosis-admin.

Создаем репозиторий на сервере под юзером gituser:

$mkdir ~/repositories/project.git
$cd project.git
$git --bare init

--bare обозначает, что у нас нет намерения хранить файлы самого проекта на сервере, только diff и файлы, которые генерирует сам git (проще говоря, структура git репозитория). Что кстати, совершенно достаточно даже для Git Plugin for Trac, который мы намереваемся установить.

Теперь нам необходимо создать ветку (branch), иначе EGit будет ругаться на отсутствие оных. Выполнить push на полностью пустом репозитории нельзя.
Для первого коммита автоматически создается бранч с именем master, в него же по умолчанию попадают следующие коммиты

#su gituser
$cd ~/tmp
$git clone ~/repositories/project.git project
$cd project
$echo "test" > test
$git add test
$git commit -a -m "initial branch"
$git push origin master

Попробуем получить проект через ssh с помощью плагина EGit.
Установка eclipse и самого плагина очень проста.
В меню eclipse выбираем File-Import, Git Repository. Выбираем протокол git+ssh:// , указываем путь:

git+ssh://gituser@SERVER/project.git

Самое главное! eclipse прописывает путь к ssh, как $HOME/ssh. Его необходимо поправить на $HOME/.ssh в меню:
Window-Preferences - General - Network Connection - SSH2. Там же можно управлять ключами и просматривать их. Если eclipse не найдет ключи ничего забираться не будет.
Дальнейшие действия по добавлению проекта интуитивно понятны.

Единственное, в новой версии появилась галочка Import projects after clone, которую надо снять, ибо она у меня привела к пустому списку проектов, попробуйте, может у вас получится. Это не страшно, по вышеприведенному примеру указано как просто сделать share project с извлеченного проекта на диске (плюс показано ниже).

Можно также забрать проект через консоль:

Запускаем PortableGit\git-cmd.bat и выполняем:

>git clone gituser@SERVER:project.git

Далее, создаем проект в eclipse, добавляем в него наш извлеченный проект (Import-File System), жмем на проекте Team-Share (Git) и все, наш проект теперь помечен, как гит репозиторий. Пробуем менять файлы, коммитить и пушить.



Если возникают какие-либо проблемы, то смотрим /var/log/auth.log .
А также в eclipse ( Help - About Eclipse - Configuration Details - View Error Log).
Также можно добавить после строчки [gitosis] в gitosis.conf:

loglevel=DEBUG

При задании которого при обращении к gitosis (через консольный клиент) будут выведена дополнительная информация при ошибках.

Об установке багтрекера Trac для git, а также использовании git в Visual Studio в следующий раз.

12 комментариев:

  1. Полезно, спасибо, жду продолжения

    ОтветитьУдалить
  2. Добрый день.

    Достаточно долго пытаюсь настроить git-сервер, повторив эти простые действия. И всё получается без сложностей (откуда им взяться?). Однако при попытке забрать проект с сервера (c помощью git clone) ничего не получается: просят ввести пароль.

    Немного разобравшись, я понял, что это из-за того, что у аналогичного пользователя на сервере не установлен сертификат. Как не сложно догадаться, установка сертификата не помогла: "fatal: %s does not appear to be a git repository", что логично. такого проекта у пользователя в домашней директории нет.

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

    Конфог изменяется (ссылка на него в домашней директории), а файл с публичным ключём присутствует в ~/repositories/gitosis-admin.git/gitosis-export/keydir.

    Перекопал весь поисковик. Не могу понять каким образом заставить залогиниться или хотя бы определить "что не так".

    Подскажите как действовать.

    Спасибо.

    ОтветитьУдалить
  3. Посмотрите логи sshd, проверьте файл конфигурации sshd - ссылка на пример в посте. Если логи не выводятся при loglevel=DEBUG в gitosis.conf при удалённом git clone, значит, скорее всего, у Вас проблема с соединеннием ssh. Попробуйте просто используя приватный ключ gituser подключиться через ssh клиент.

    ОтветитьУдалить
  4. Соединение по ssh отлично работает. gituser успешно выполняет изменение настроек с помощью git push, после чего в логе отображается следующее:
    Jun 23 07:09:29 github sshd[59936]: Accepted publickey for gituser from 192.168.0.93 port 63162 ssh2

    С другой стороны, тестовый пользователь не может получить существующий проект с помощью git clone. Не смотря на это, авторизация проходит успешно и в логе создаётся аналогичная запись "Accepted publickey ..."

    Такое ощущение, что при попытке соединения тестового юзера по ssh, не используетя gitosis. ssh работает так, как будто никакого gitosis у меня вообще нет. Это и ставит меня в тупик. Непонятно как проследить работу gitosis в момент соединения тестового юзера.

    Как я писал выше, после выполнения git clone, система отвечает что директория %название_проета% не найдена, что логично: у тестового пользователя такой директории нет.

    Пытался найти документацию по работе gitosis, но успехов достиг весьма скромных.

    ОтветитьУдалить
  5. Проверено: пользователь gituser успешно проводит чтение и редактирование новых репозиториев, но тестовый юзер по преднему "ищет" репозитории в своём домашнем каталоге.

    Так же проверено, что если сделать симлинк юзеру в его хомяк, то всё заработает: новый проект успешно считался и записался (при наличии соответствующих прав на папку с репозиторием).

    Подскажите, как заставить искать проекты в каталоге gituser'a?

    ОтветитьУдалить
  6. А в файле у gituser $/.ssh/authorized_keys тестовый юзер присутствует?
    Вообще, как я понял, у Вас тестовый юзер совпадает с существующем юзером на сервере. Как в таком случае будет вести себя gitosis, я не знаю.
    Может, он действительно будет передавать управление реальному пользователю. Попробуйте или удалить пользователя с сервера или сделать все тоже самое с другого хоста и с другим пользователем, логин которого не совпадает с серверными логинами.

    ОтветитьУдалить
  7. Каждый раз при добавлении юзера, в authorized_keys добавляется запись для нового пользователя:

    'command="gitosis-serve guest",no-port-forwarding,...'

    В случае, если пользователь на сервере не заведён, в логе следующее:

    github sshd[88902]: Invalid user guest from 192.168.0.110
    github sshd[88902]: error: PAM: authentication error for illegal user guest from 192.168.0.110
    github sshd[88902]: Failed keyboard-interactive/pam for invalid user guest from 192.168.0.110 port 60457 ssh2

    И просят ввести пароль несуществующего пользователя.

    ОтветитьУдалить
  8. Может для ssh нужны какие-либо дополнительные настройки?

    ОтветитьУдалить
  9. Вообще-то в логах должен быть не guest, а gituser.
    Вы какой строчкой забираете клон?

    ОтветитьУдалить
  10. Эпик фейл! Огромное спасибо :-)

    Не работало из-за того, что все действия я производил тем юзером, которого создавал, вместо gituser.

    ssh соответственно перенаправлял в домашнюю папку соответствующего пользователя.

    ОтветитьУдалить
  11. При ошибке:
    git clone git://eagain.net/gitosis.git
    Cloning into ‘gitosis’…
    fatal: unable to connect to eagain.net:
    eagain.net[0: 50.56.185.182]: errno=Connection refused

    используем новый урл репозитория gitosis:
    git clone git://github.com/tv42/gitosis.git

    Спасибо Zeboton.

    ОтветитьУдалить
  12. Ребят, подскажите пожалуйста. Неделю уже мучаюсь.
    Файл настроек выглядит так:
    [gitosis]

    [group gitosis-admin]
    writable = gitosis-admin
    members = gitadmin

    [group privateproject]
    writable = privateprojectgroup
    members = testuser

    Скачал админом реп gitosis-admin.git, добавил ключ testuser'а, ну и настройки что выше. И этот самый testuser теперь может склонировать (git clone) не только privateproject.git, но и gitosis-admin, что естественно не хорошо.
    Также удивляет то, что при git clone спрашивается пароль gitadmin'а. Просто по манам я понял, что при инициализации репов через gitosis он пустит всех, чьи публичные ключи есть в gitosis-export/keydir и без всякого логина, но с учетом настоек прав в gitosis.conf.
    Да, и еще (здесь http://git-scm.com/book/ru/Git-%D0%BD%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5-Gitosis) говориться, что команда
    ssh git@gitserver ( в моем случае ssh gitadmin@gitserver) должна проходить вот так:
    PTY allocation request failed on channel 0
    fatal: unrecognized command 'gitosis-serve schacon@quaternion'
    Connection to gitserver closed.

    Т.е. только возможность выполнять git-команды. У меня же при ssh gitadmin@gitserver просто приглашение ввести пароль, ввожу пароль и вуаля я на сервере.

    Кто откликнется огромнейшее спасибо!

    ОтветитьУдалить