28 июля 2011 в 20:27

Windows.Git.Cygwin.SSH.Gitolite и руководство пользователя из песочницы

Git*

1. Для чего эта статья?


Желание получить возможности Git на Windows платформе материализовало стремление повозиться с разными схемами настройки.

2. Осознание


Нужно осознать, что придется использовать программы Cygwin,SSH,GitExtenstions,Git,Gitolite

Cygwin — это программа, которая эмулирует окружение Linux.У нее есть свое черное окно, выглядящее и работающие как окно терминала Linux.
MsysGit — это программа для эмуляции git окружения, но без ssh сервера, поэтому мы не будем использовать на сервере репозитариев. Используем только для клиентов репозитария.
SSH — это программа для использования ssh подключений из ssh клиентов, доступная для всех операционных систем.
SSH сервер — это программа принимающая подключения от ssh клиентов.
Git — это набор программ, включая сам git, для работы с репозиториями файлов.
Gitolite — это программа, обертывающая git, и реализующая функции управления репозитариями: управление пользователями, их доступом и т.п.
GitExtensions — это программа для windows, обертывающая функционал как git, так прилагающегося набора программ в GUI, который также, встраивается в среду разработки Visual Studio 05/08/10.

В корпоративе придется выделить ресурсы для хостинга SSH службы, дисковое пространство для размещения репозитариев.
Человека, который будет обслуживать SSH сервер, доступ к репозиторию.
Научить пользователей использовать аналоги функций для взаимодействия с их старыми система контроля версий через GitExtensions.
Предложить им некоторые схемы работы, которые позволяет достичь Git.

UPD: 05.08.2011
UPD: 30.01.2012

3. Идем к результату: Хостинг для комплектующих


Хостить Git,SSH сервер,Gitolite будем в Cygwin.
идем по адресу http://cygwin.com/setup.exe
Запускаем установщик.
Добавляем зеркало http://cygwin.vc.ukrtel.net/
matway.org — стал не доступен. Обновлено 30.01.2012.
Список зеркал близких России: cygwin.com/mirrors.html
Помечаем следующие компоненты:
Net | openssh
Devel | git
Devel | git-completion
Devel | git-gui
Devel | gitk
Editors | vim
Нажимаем Next и установка предложит добавить необходимые пакеты с чем, мы соглашаемся и нажимает Next.
Проверяем, Start Menu/Cygwin/Cygwin Terminal:
image

Логин Alexei мой логин в windows, base имя машины. Все сходится.

4. Идем к результату: Настройка SSH сервера


Запускаем Cygwin Terminal.
Запускаем конфигурацию SSH сервера командой ssh-host-config.
image

image

image

image

image

image

image

Заходим в /etc/sshd-config и подключаем авторизацию без пароля:
Раскомментируем эти строчки:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

Для всех пользователей, кто будет работать с Git, нужно настроить вход на SSH сервер, через пользователя git (или другое имя) тв режиме без пароля.

Немного теории о работе SSH сервера.
При подключении из SSH клиента через строку подключения git@localhost, первое, что происходит-
поиск приватной части ключа в каталоге .ssh, если в CYGWIN — то ~/.ssh/, если windows — то c:/users/вашеимя/.ssh
Дальше в файле authorized_keys в профиле git на сервере localhost ищется текст, у которого есть маркер, равный вашему текущему имени пользователя. Если он находится, то вы получаете терминал, в который загружен профиль пользователя git.
Клиенты есть в cygwin, есть в gitbash, есть такие, как putty. Нас интересует ssh клиент, который в cygwin.
Вызывается он командой ssh с аргументами git@localhost, где git- имя пользователя, в профиль которого мы хотим зайти через ssh и localhost (это адрес сервера SSH).
Собственно, сейчас мы и сделаем так, чтобы работало как сказано выше.

  1. Вводим еще одного юзера под именем git. Это имя будет для служебных операций.
    Открываем Computer managment ->Local User and Groups ->Users-> пкм -> New User ->
    имя Git, пароль 123456, оставляем галочку «Password never expires»->OK
    Открываем Cygwin Bash Shell, вводим команду mkpasswd -l -u git >> /etc/passwd
    Оживляем профиль пользователя командой:
    image
    Выходим из профиля нажав Ctrl+D или командой exit.
  2. Генерируем для своего логина ключ. В моем случае для логина Alexei.
    Команда ssh-keygen -t rsa создаст ключ в папке, который будет состоять из двух файлов
    id_rsa (приватная часть, хранится у вас ) и id_rsa.pub (публичная часть ключа).
    дальше вносим публичную часть ключа в файл authorized_keys в профиль пользователя git
    через команду ssh-copy-id -i git@localhost.
    image
    Запускаем SSH сервер командной:
    image
    Копируем публичную часть ключа в профиль git:
    image
    Проверяем получилось ли настроить как нам нужно. Запускаем команду ssh git@localhost и ожидаем приглашения терминала
    от пользователя git.
    image
    Все получилось настроить.
    Если не получилось, переходим к пункту 10

5. Идем к результату: Настройка Gitolite


  • Теперь нужно установить gitolite, так же он установит и настроит репозитарии для хранения файлов. Переходим в /tmp и скачиваем средствами git программу gitolite:
    image
    Дальше заходим в /gitolite/src/ и запускаем ./gl-easy-install со следующими ключами
    git localhost Alexei. git — это логин куда будет установлен gitolite, localhost адрес SSH сервера, Alexei имя пользователя одновременно и имя приватной и публичной части ключа.
    image
    Когда спросит ввести пароль, то нажимаем просто Enter, так как пароль нигде не нужен.
  • Далее проходим до следующего экрана установки
    image
    Это окно показывает открытый файл .gitolite.rc в редакторе vim.
    Нужно пройти курсором до места вставки текста, нажать I, ввести текст
    $ENV{PATH}="/usr/local/bin:/usr/bin:/bin";
    Текст нужно вводить без ошибок, иначе запутаетесь в этом редакторе.
    Для простоты, можно скопировать текст, потом переместить курсор в нужное место, нажать I, потом нажать на
    иконке черного окошка(терминала, командной строки и т.п.) выбрать edit->paste и строчка вставиться.
    Нажимаем после ввода ESC, нажимаем shift+:, набираем wq, нажимаем Enter.
    image
    Эта строка позволит gitolite вызывать программы из cygwin окружения, у которых схожие имена с программами windows. Например команда find есть и там и там. И если не указать, gitolite будет работать с ошибками и даже программа установки, будет работать с ошибками, так как будет использоваться find из windows.

    Нажимаем еще несколько раз Enter и получаем следующую картинку:
    image


6. Идем к результату: Настройка GitExtensions


  • Теперь переходим к установке GitExtensions по адресу http://code.google.com/p/gitextensions/
    Его ставим с msysgit, gitextensions будет использовать его, после настройки.
    Также отмечаем openssh впользу putty.
    Настройка пользователя и email для GitExtensions рассматривать не буду.
    Там происходит все гладко.

7. Идем к результату: Настройка пользователя


Теперь нужно настроить профиль windows текущего пользователя.
  1. Обеспечить наличие файла Alexei в папке .ssh/ текущего профиля c:/users/Alexei/.ssh/
  2. Обеспечить наличие файлика config в той же папке.
  3. для того, чтобы это сделать, нужно взять их из c:\cygwin\home\вашеимя\.ssh\config и вашеимя
    и скопировать в c:\users\вашеимя\.ssh\
  4. Это вариант, для случая когда за нас уже была сделана часть работы, в данном случае программой gitolite.
    в начале она сгенерировала для нас вашеимя и вашемя.pub файлы ключа. Отправила pub версию в файлик authrozied_keys профиля git.
    и еще дописала настройки к этому ключу в authorized_keys.
    Посмотрим этот измененный authorized_keys
    image
  5. Пояснение к информации.
    Приватные части ключей размещены блоками с пометкой в конце: для какой пользователя и с какого адреса.
    Первая приватка- от моего первого ключа id_rsa.pub.
    Вторая приватка- от ключа Alexei.pub, который уже делал сам gitolite; как видно, gitolite добавляет расширенную информацию к ключу, что и обеспечивает всё взаимодействие системы.

  • Чтобы настроить нового пользователя, ему нужно установить для легкости: gitextensions с включенным msysgit и openssh.
    Дальше нужно настроить пользователю ключ для входа в профиль git на localhost.
    Для этого открываем start menu->git ->git bash и вводим ssh-keygen -t rsa, получаем два файла ключа.
    Отдаем файл pub человеку, который обслуживает git.

8. Идем к результату: Алгоритм работы для админа репозитария


  • Этот человек должен взять pub файл, положить его в папку локального репозитария gitolite-admin\keydir.
    Эту папка уже будет создана в профиле пользователя, откуда была запущена установка.
    Прописать имяфайла в gitolite.conf и отправить через git push в репозитарий.
    Потом gitolite создаст в профиле пользователя git настройки в своих файлах gitolite.conf.pm, authorized_keys и т.п.
    Можно считать, что пользователь заведен в системе правильно и из под него можно работать в windows.
    Чтобы работать из cygwin, нужно скопировать все файлы относительно /home/пользователь/.ssh/

9. Смотрим на результат


  • Чтобы увидеть- надо попробовать.
    Запускаем GitExtensions.
    Настраиваем его, на вкладке Git, должно быть следующуе:
    image
    Эта папка появляется, если вместе с GitExtensions установить mSysGit (его нужно установить каждому клиенту).
    Выбираем clone repository, в адресе ставим git@gitolite:testing.git, папку назначения любую.
    нажимаем clone и получаем пустой репозитарий testing.
    image
    и можно получить такое окно:
    image
    Которое означает нарушение безопасности в ssh соединении.
    В данном случае наш SSH сервер находится на нашем компьютере, поэтому чтобы быстро решить эту проблему, удаляем файлик c:\users\Alexei\.ssh\known_hosts, пытаемся еще раз сделать Clone.
    Появится следующее окно:
    image
    Нажимаем yes и Enter.
    Появится следующее окно:
    image
    Информация в нем означает, что вся цепочка работает.
    Открыв папку d:\test.rep увидим, там скрытую папку .git, что и означает успех.
  • Почему в адресе git@gitolite, gitolite, а не localhost? потому что есть файл config, в котором прописана настройка для слова gitolite. Если клиент ssh видит, что мы указали в адресе сервера слово, схожее с тем, что есть в config, то он применяет настроики из этого файла. В принципе, можно не использовать config, тогда приватный ключ будет называться по умолчанию id_rsa и адрес сервера localhost(или ip адрес).И это будет выглядеть так git@localhost. Но так сделать нельзя. Так как gitolite не поймет кто есть кто. Поэтому, у всех вместо id_rsa лежит файлик с приватной частью, а имя его отличается от всех других.
    Посмотрим на файл:
    image

10. Смотрим на ошибки


  1. SSH и вход с паролем
    Все из-за поломанного authorized_keys.
    или настройки ssh сервера, которые включают использование authorized_keys файла.
    если мы на этапе настройки git пользователя, то используем ssh-copy id, который копит pub версию ключа и редактирует authorized_keys. Если уже установили всю экосистему, то:
    /home/git/.gitolite/src/gl-setup-authkeys -batch /home/git/.gitolite/keydir
  2. Не принимается адрес вида git@gitolite:testing.git
    /home/git/.gitolite/src/gl-setup-authkeys -batch /home/git/.gitolite/keydir
    Все из-за поломанного authorized_keys. Генерим его с помощью этой команды заново.
  3. Постоянно сбивается вход без пароля из cygwin bash shell
    /home/git/.gitolite/src/gl-setup-authkeys -batch /home/git/.gitolite/keydir
    Все из-за поломанного authorized_keys, генерим его с помощью этой команды заново.
    А также вы, возможно, не установили в gitolite.rc запись:
    $ENV{PATH}="/usr/local/bin:/usr/bin:/bin";
    Поставьте ее доступными вами средствами.
  4. Синхронизировать пользователей между Windows и Cygwin
    mkpasswd -l >/etc/passwd
    Нужно, если вы хотите переназначить логины для ssh сервера и служебного логина для gitolite системы.
  5. Удалить SSH сервер
    cygrunsrv -R sshd
    Это удалит только службу cygserver ssh из windows, но логин останется.
    Для этого еще надо зачистить /etc/ssh* от файлов.
    Удалить логин cygserver из windows и синхронизировать /etc/passwd командой
    mkpasswd -l >/etc/passwd

Маленькая заметка о большом ньансе


  • Команда mkpasswd записывает в файл /etc/passwd путь рабочего каталога логина.
    Если не подходит папка по-умолчанию cygwin\home, можно задать папку c:\users\ применительно к Windows7 или другую с помощью такого ключа -p "$(cygpath -H)", когда будете создавать пользователя git.
    mkpasswd -l -p "$(cygpath -H)" > /etc/passwd
  • Также в данной статье, использована схема установки, когда сервер ssh и пользователь на одном компьютере.Что ведет еще к одному ньансу. По-умолчанию ваш логин в Cygwin смотрит в папку cygwin\home\%username%, в статье это обходится с помощью msysgit, у которого ваш логин смотрит в папку c:\users\%username% (для win7), поэтому сделано копирование ваших ключей из cygwin\home\%username% в c:\users\%username% (п. 7.3). Если передалть домашнюю папку в Cygwin для своего логина на c:\users\%username%, то надобность в msysgit отпадет.
    С ньансами завершено.
+19
14346
79

Комментарии (12)

+3
StWoland, #
А почему не TortoiseGit?
0
AlexeiKozlov, #
Вместо GitExtensions можно использовать и TortoiseGit. Дело вкуса.Я сам начал с GitExtensions, когда еще не было TortoiesGit, так и продолжил его использовать. Сам участвовал в багфиксах. Родная отчасти программка.
0
StWoland, #
Спасибо за статью, очень актуально: планируем разворачивать сервера с репозиториями.
Однако если сервер уже настроен, то мне TortoiseGit кажется оптимальным по времени установки, настройки и адаптации решением (потому что многие программисты уже знакомы с интерфейсом TortoiseSVN, что снижает порог вхождения).
0
MashaVokh, #
Переползающим с svn (и не только переползающим) можно посоветовать как аналог TortoiseSVN+AnkhSVN использовать связку msysgit+TortoiseSVN+Git Source Control Provider.
+5
Unlogic, #
Такую фразу получается сказать один-два раза в год, поэтому разрешите мне сделать это: насколько в Линуксе это проще.
Статья очень полная и добротная. Попадись бы она мне месяц назад (пытался пересадить коллегу-виндузятника на git, но msysgit как-то странно брыкался — коллега остановился на svn).
Только репозитарии уж больно глаза режут.
0
AlexeiKozlov, #
А, что там упрощается, по сравнению с Cygwin?
Я не сделал значительно больше действий, чем нужно было бы сделать из Linux.
+4
Unlogic, #
Да о том же cygwin'е речь. И о корявости msysgit'а. И о отдельной настройке cygserver'а, чтобы это всё время не держать cygwin открытым для работы ssh-сервера.
Нет, на самом деле я с вами согласен — количество работы практически идентично. Просто коробит меня от этого Cygwin'а, будто и дома, а стены другие.
0
neoroma, #
Кто бы еще рассказал как в Eclipse этим Git-ом пользоваться нормально
0
MashaVokh, #
Есть такая штука как EGit
0
MashaVokh, #
Гит — очень хорошая штука, но в связке Git+Windows очень все плохо с русскими буквами. Имена файлов, имена каталогов, имя пользователя в Windows — все должно быть английским.
Только тексты комментов можно писать на русском, и то только в определенной комбинации используемых интерфейсов.
Причин несколько — в гите все в utf8, а в Windows — cp1251 в именах файлов, cp866 в консоли, криворукость разработчиков оберток (к примеру, Tortoise в окне логов русские коммиты отображает нормально, а в диалоговых окнах — мусор).
0
AlexeiKozlov, #
нет. уже все давно не так. в GitExtensions все как нужно. никак проблем с плясками кодировок, не обнаружишь.
+3
Beholder, #
Насколько же с Mercurial проще…

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.