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:

Логин Alexei мой логин в windows, base имя машины. Все сходится.
4. Идем к результату: Настройка SSH сервера
Запускаем Cygwin Terminal.
Запускаем конфигурацию SSH сервера командой ssh-host-config.







Заходим в /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).
Собственно, сейчас мы и сделаем так, чтобы работало как сказано выше.
- Вводим еще одного юзера под именем 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
Оживляем профиль пользователя командой:
Выходим из профиля нажав Ctrl+D или командой exit.
- Генерируем для своего логина ключ. В моем случае для логина Alexei.
Команда ssh-keygen -t rsa создаст ключ в папке, который будет состоять из двух файлов
id_rsa (приватная часть, хранится у вас ) и id_rsa.pub (публичная часть ключа).
дальше вносим публичную часть ключа в файл authorized_keys в профиль пользователя git
через команду ssh-copy-id -i git@localhost.
Запускаем SSH сервер командной:
Копируем публичную часть ключа в профиль git:
Проверяем получилось ли настроить как нам нужно. Запускаем команду ssh git@localhost и ожидаем приглашения терминала
от пользователя git.
Все получилось настроить.
Если не получилось, переходим к пункту 10
5. Идем к результату: Настройка Gitolite
- Теперь нужно установить gitolite, так же он установит и настроит репозитарии для хранения файлов. Переходим в /tmp и скачиваем средствами git программу gitolite:
Дальше заходим в /gitolite/src/ и запускаем ./gl-easy-install со следующими ключами
git localhost Alexei. git — это логин куда будет установлен gitolite, localhost адрес SSH сервера, Alexei имя пользователя одновременно и имя приватной и публичной части ключа.
Когда спросит ввести пароль, то нажимаем просто Enter, так как пароль нигде не нужен.
- Далее проходим до следующего экрана установки
Это окно показывает открытый файл .gitolite.rc в редакторе vim.
Нужно пройти курсором до места вставки текста, нажать I, ввести текст
$ENV{PATH}="/usr/local/bin:/usr/bin:/bin";
Текст нужно вводить без ошибок, иначе запутаетесь в этом редакторе.
Для простоты, можно скопировать текст, потом переместить курсор в нужное место, нажать I, потом нажать на
иконке черного окошка(терминала, командной строки и т.п.) выбрать edit->paste и строчка вставиться.
Нажимаем после ввода ESC, нажимаем shift+:, набираем wq, нажимаем Enter.
Эта строка позволит gitolite вызывать программы из cygwin окружения, у которых схожие имена с программами windows. Например команда find есть и там и там. И если не указать, gitolite будет работать с ошибками и даже программа установки, будет работать с ошибками, так как будет использоваться find из windows.
Нажимаем еще несколько раз Enter и получаем следующую картинку:
6. Идем к результату: Настройка GitExtensions
- Теперь переходим к установке GitExtensions по адресу http://code.google.com/p/gitextensions/
Его ставим с msysgit, gitextensions будет использовать его, после настройки.
Также отмечаем openssh впользу putty.
Настройка пользователя и email для GitExtensions рассматривать не буду.
Там происходит все гладко.
7. Идем к результату: Настройка пользователя
Теперь нужно настроить профиль windows текущего пользователя.
- Обеспечить наличие файла Alexei в папке .ssh/ текущего профиля c:/users/Alexei/.ssh/
- Обеспечить наличие файлика config в той же папке.
- для того, чтобы это сделать, нужно взять их из c:\cygwin\home\вашеимя\.ssh\config и вашеимя
и скопировать в c:\users\вашеимя\.ssh\ - Это вариант, для случая когда за нас уже была сделана часть работы, в данном случае программой gitolite.
в начале она сгенерировала для нас вашеимя и вашемя.pub файлы ключа. Отправила pub версию в файлик authrozied_keys профиля git.
и еще дописала настройки к этому ключу в authorized_keys.
Посмотрим этот измененный authorized_keys
- Пояснение к информации.
Приватные части ключей размещены блоками с пометкой в конце: для какой пользователя и с какого адреса.
Первая приватка- от моего первого ключа 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, должно быть следующуе:
Эта папка появляется, если вместе с GitExtensions установить mSysGit (его нужно установить каждому клиенту).
Выбираем clone repository, в адресе ставим git@gitolite:testing.git, папку назначения любую.
нажимаем clone и получаем пустой репозитарий testing.
и можно получить такое окно:
Которое означает нарушение безопасности в ssh соединении.
В данном случае наш SSH сервер находится на нашем компьютере, поэтому чтобы быстро решить эту проблему, удаляем файлик c:\users\Alexei\.ssh\known_hosts, пытаемся еще раз сделать Clone.
Появится следующее окно:
Нажимаем yes и Enter.
Появится следующее окно:
Информация в нем означает, что вся цепочка работает.
Открыв папку d:\test.rep увидим, там скрытую папку .git, что и означает успех.
- Почему в адресе git@gitolite, gitolite, а не localhost? потому что есть файл config, в котором прописана настройка для слова gitolite. Если клиент ssh видит, что мы указали в адресе сервера слово, схожее с тем, что есть в config, то он применяет настроики из этого файла. В принципе, можно не использовать config, тогда приватный ключ будет называться по умолчанию id_rsa и адрес сервера localhost(или ip адрес).И это будет выглядеть так git@localhost. Но так сделать нельзя. Так как gitolite не поймет кто есть кто. Поэтому, у всех вместо id_rsa лежит файлик с приватной частью, а имя его отличается от всех других.
Посмотрим на файл:
10. Смотрим на ошибки
- 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 - Не принимается адрес вида git@gitolite:testing.git
/home/git/.gitolite/src/gl-setup-authkeys -batch /home/git/.gitolite/keydir
Все из-за поломанного authorized_keys. Генерим его с помощью этой команды заново. - Постоянно сбивается вход без пароля из 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";
Поставьте ее доступными вами средствами. - Синхронизировать пользователей между Windows и Cygwin
mkpasswd -l >/etc/passwd
Нужно, если вы хотите переназначить логины для ssh сервера и служебного логина для gitolite системы. - Удалить 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 отпадет.
С ньансами завершено.