- gosha20777
- Собственный Git на Windows
- Немного о платформе.
- Как его ставить?
- IIS Сервер + .NET Framework.
- Git Server
- Настройка.
- Свой Git сервер на Windows
- Подготовительный этап
- Клиентская часть
- Настройка Git на сервере
- И последнее — хуки
- 4.2 Git на сервере — Установка Git на сервер
- Установка Git на сервер
- Размещение голого репозитория на сервере
- Малые установки
- SSH доступ
gosha20777
Собственный Git на Windows
January 05, 2018 | 3 Minute Read
Н у вот наступил 11111100010 год ии у меня появилось свободная минутка, чтобы написать тут что-то полезное:-)
Случилось так, что понадобился приватный git репозиторий, а покупать VIP аккаунт на github не хотелось, да и политика безопасности компании, для которой разрабатывается проект, не позволяет это делать. По этому было принято решение о развертывании собственного git-сервера. Так как я C# developer, то речь пойдет конечно же о Windows Server и IIS Server. Пользователям Linux скажу, что там установка этого «богатства» еще проще и состоит из пары команд в терминале.
Немного о платформе.
Данный git-server был написан на C# на ASP.NET и представляет собой Web приложение. Все исходные коды доступны тут. Все желающие могут ознакомиться и оценить кривизну кода) А мы поехали дальше -)
Как его ставить?
Для успешной установки нам нужны
- Сам сервер на Windows Server 2008 R2/2012/2012 R2/2016 (кто-то сидит на ней?)
- Internet Information Services (IIS) 7 или 8
- .NET Framework 4.6
- visual redist 2012/2015 и CLR
- Server дистрибутив
Быстро пробежимся по основным пунктам. У меня стоит Windows Server 2012 R2. И показывать я буду на ней. Для Windows Server 2008 все примерно также. Предполагается, что Виндасервер у вас сконфигурирован и настроен. Если это не так – идите к документации)
IIS Сервер + .NET Framework.
Запускаем Server Manager (диспетчер серверов) -> Manage (Управление) -> Add Roles and Features (Добавить роли и компоненты) …
да да у меня виндосервер на русском.
Выбрать Role-based or Feature-based Installation (установка ролей или компонентов)
Далее выбираем наш сервер
.
В ролях выбираем Web Server (IIS).
.
В компонентах жмякаем на .NET framework 4.5 и на последнем шаге выбираем нужные настройки.
Установка… Потребует перезагрузки сервера. Загружаем .NET Framework 4.6 и ставим его. Все теперь можно ребутиться.
Для любителей консоли…
Git Server
Всё, теперь можно перейти к непосредственно развёртыванию git сервера. Разархивируем содержимое дистрибутива в wwwroot IIS-сервера ( C:\inetpub\wwwroot ) и даём права учетной записи IIS_IUSERS на модификацию каталога App_Data .
.
Запускаем IIS Manager и конвертируем Git в приложение.
.
После конвертации жмем Action – Browse (Управление приложением – обзор) и у нас должен открыться сайтик с формой для входа. Теперь он доступен по адресу IP сервера\git в локальной сети. При желании его можно вывезти во внешнюю сеть и вообще делать с ним все что душе угодно!
Настройка.
По стандарту логин пароль для входа admin\admin.
.
В настройках можно указать другой путь для хранения файлов, изменить язык и вообще сделать много полезного)
Можно добавлять новых пользователей и осуществлять контроль видимости репозиториев, выдавать исключительные права пользователям. Также можно объединять пользователей в команды и управлять ими. На пример команде Core Developers будут доступны все ветки в репозитории, а команде Testers только ветка Master.
Я надеюсь данная статья была полезна для вас. Ставьте Like за встроенный редактор кода и подсветку синтаксиса))) Приятного кодинга!
Свой Git сервер на Windows
В принципе все это легко нагуглить, но тем не менее опишу свой опыт. Итак, есть windows сервер (в моем случае Windows Server 2008, но все описанное ниже применимо ко всем windows), на этом севере работает некое веб-приложение, которое хочется коллективно развивать командой из нескольких человек. Идеи лучше чем Git в голову не пришло.
Подготовительный этап
На сервере ставим и настраиваем SSH сервер (в моем случае это оказался Bitvise SSH Server, далее все настройки буду описывать относительно него).
Создаем пары public и private ключей для нужных пользователей, в настройках этих пользователей на SSH сервере добавляем им соответствующие public ключи и убеждаемся что разрешена авторизация по ключу.
Если требуется работать с Git из интернета, также пробрасываем соответствующий порт наружу, обычно это 22, но в моем случае получилось 222 по техническим причинам. Проверяем доступность сервера по SSH снаружи и возможность авторизации с ключом, PuTTY в помощь 🙂
Ставим собственно Git (в моем случае это msysgit). Народ предлагает ставить в короткий путь вроде C:/Git, но я ставил в каталог по-умолчанию, все работает. Через Git GUI создаем репозиторий, в моем случае это С:/Webroot/test-git.
Клиентская часть
В моем случае клиенты — тоже windows машины, на них потребуется Git (тот же msysgit) и клиент TurtoiseGit, в моем случае. На клиенте пытаемся склонировать наш репозиторий при помощи Git Clone, вводим урл
где mylogin — это ваш логин для ssh, example.com:222 — адрес сервера и порт (не обязательно), C:/Webroot/test-git — полный путь к репозиторию.
Жмем ОК, ждем, получаем ошибку и отправляемся дальше настраивать сервер.
Настройка Git на сервере
Первым делом идем в переменные окружения (Компьютер -> Свойства -> Дополнительные параметры системы -> Переменные среды). В разделе системные переменные находим PATH и жмем изменить. Убеждаемся что там есть, а если нет, то добавляем три папки:
C:\Program Files (x86)\Git\cmd;C:\Program Files (x86)\Git\bin;C:\Program Files (x86)\Git\libexec\git-core
На всякий случай напомню, что Git у нас стоит в C:\Program Files (x86)\Git.
Теперь проверяем, что Git доступен. Либо пытаемся еще раз Git Clone на клиенте и получаем другую ошибку, либо заходим по ssh и говорим git прямо и текущей папки, получаем краткий хелп от гита. Если ругается на неизвестную команду, ищем ошибку на предыдущем шаге.
Теперь наша проблема (если посмотреть логи ssh сервера) заключается в том, что git-upload-pack на вход получает путь, обернутый в одинарные кавычки, и естественно, не работает. Нормального решения нет, но есть подпорки, например как описано здесь. Моя версия проделанного:
C:\Program Files (x86)\Git\cmd\gitcmdhelper.sh
прописываем в него
Идем в настройки ssh сервера и для нужного пользователя (или группы) изменяем параметр Exec request prefix на
cmd.exe /c sh gitcmdhelper.sh
ВНИМАНИЕ! после .sh есть пробел! Строка получается вот такая «cmd.exe /c sh gitcmdhelper.sh «, без пробела на конце не будет работать!
Замечание. Эта подпорка лишает вас возможности работать с путями в которых есть пробелы, в большинстве случаев это не критично, но все же.
В глобальном конфиге Git вносим следующие изменения (как советуют на хабре), правим C:\Program Files (x86)\Git\etc\gitconfig
[core]
symlinks = false
autocrlf = true
ignorecase = true
quotepath = false
[i18n]
commitencoding = cp1251
logoutputencoding = cp1251
И, о чудо! Оно теперь работает! Ну по крайней мере мне удалось сделать Pull, Commit и Push.
И последнее — хуки
Поскольку в git-e не принято пушить в основной рабочий репозиторий (для этого есть ряд причин, кому интересно, в гугль), то можно сделать bare-репозиторий, в который будут приходить все пуши, а с помощью механизмов хуков изменения будет забирать рабочая копия.
Итак у нас есть bare-репозиторий C:\Webroot\test-git в который приходят все комиты и пуши, и рабочая копия C:\Webroot\test-git.production, на которую настроен document root сервера.
Рабочая копия должна быть «настроена на» bare-репозиторий, для этого в рабочей копии выполним команду
git remote add local C:/Webroot/test-git
результатом станет добавление в C:\Webroot\test-git.production\.git\config следующего
.
[remote «local»]
url = C:/Webroot/test-git
fetch = +refs/heads/*:refs/remotes/local/*
Для того чтоб заработали хуки, нужно положить файл с названием действия в папку в bare-репозитории .git/hooks/, в нашем случае это будет
обычно там уже заложен post-receive.sample, его достаточно просто переименовать. А в сам файл вписываем следующее содержимое, которое после получения данных заставит рабочую копию сделать pull:
unset GIT_DIR
cd C:/Webroot/test-git.production
git pull local master
Таким образом мы будем корректно обновлять рабочую копию при каждом push-е в bare-репозиторий.
Вот пара полезных ссылок по теме:
/bar.com.git, it will go to
Поднимать Git на windows, по моему мнению, не самое лучшее решение, если есть возможность все же лучше это сделать на Linux.
4.2 Git на сервере — Установка Git на сервер
Установка Git на сервер
Рассмотрим теперь установку сервиса Git с поддержкой этих протоколов на сервер.
Здесь мы приводим команды и шаги, необходимые для базовой, упрощённой установки на Linux-сервер, но эти сервисы можно запустить и на MacOS или Windows сервере. На самом деле, установка боевого сервера в вашей инфраструктуре неминуемо будет иметь отличия в настройках безопасности или инструментах операционной системы, но мы надеемся дать вам общее понимание происходящего.
Для того чтобы приступить к установке любого сервера Git, вы должны экспортировать существующий репозиторий в новый голый репозиторий — репозиторий без рабочего каталога. Делается это просто. Чтобы создать новый голый репозиторий — во время клонирования используйте параметр —bare . По существующему соглашению, каталоги с голыми репозиториями заканчиваются на .git , например:
Теперь у вас должна быть копия данных из каталога Git в каталоге my_project.git .
Грубо говоря, это эквивалентно команде:
Тут есть пара небольших различий в файле конфигурации, но в нашем случае эту разницу можно считать несущественной. В этом случае берётся репозиторий Git без рабочего каталога и помещается в отдельный каталог.
Размещение голого репозитория на сервере
Теперь, когда у вас есть голая копия вашего репозитория, осталось поместить её на сервер и настроить протоколы. Предположим, что вы уже настроили сервер git.example.com , имеете к нему доступ по SSH и хотите разместить все ваши репозитории Git в каталоге /srv/git . Считая, что /srv/git уже есть на сервере, вы можете добавить ваш новый репозиторий копированием голого репозитория:
Теперь другие пользователи, имеющие доступ к серверу по SSH и права на чтение каталога /srv/git , могут клонировать ваш репозиторий выполнив команду:
Если у пользователя есть права записи в каталог /srv/git/my_project.git , он автоматически получает возможность отправки изменений в репозиторий.
Git автоматически добавит права на запись в репозиторий для группы при запуске команды git init с параметром —shared . Следует отметить, что при запуске этой команды коммиты, ссылки и прочее удалены не будут.
Видите, как это просто, взять репозиторий Git, создать голую версию и поместить ее на сервер, к которому вы и ваши коллеги имеете доступ по SSH. Теперь вы готовы работать вместе над одним проектом.
Важно отметить, что это практически всё, что вам нужно сделать, чтобы получить рабочий Git-сервер, к которому имеют доступ несколько человек — просто добавьте учетные записи с возможностью доступа по SSH на сервер и положите голый репозиторий в то место, к которому эти пользователи имеют доступ на чтение и запись. И всё.
Из нескольких последующих разделов вы узнаете, как получить более сложные конфигурации. В том числе как не создавать учётные записи для каждого пользователя, как сделать публичный доступ на чтение репозитория, как установить веб-интерфейс и др. Однако, помните, что для совместной работы пары человек на закрытом проекте, всё что вам нужно ― это SSH-сервер и голый репозиторий.
Малые установки
Если вы небольшая компания или вы только пробуете использовать Git в вашей организации и у вас небольшое число разработчиков, то всё достаточно просто. Один из наиболее сложных аспектов настройки сервера Git — это управление пользователями. Если вы хотите, чтобы некоторые репозитории были доступны определенным пользователям только на чтение, а остальным на чтение и запись, то настроить доступ и привилегии будет несколько сложнее.
SSH доступ
Если у вас уже есть сервер, к которому все ваши разработчики имеют доступ по SSH, проще всего разместить ваш первый репозиторий там, поскольку вам не нужно практически ничего делать (как мы уже обсудили в предыдущем разделе). Если вы хотите более сложного управления правами доступа к вашим репозиториям, вы можете сделать это обычными правами файловой системы, предоставляемыми операционной системой вашего сервера.
Если вы хотите разместить ваши репозитории на сервере, где нет учётных записей для членов команды, которым требуются права на запись, то вы должны настроить доступ по SSH для них. Будем считать, что если у вас для этого есть сервер, то SSH-сервер на нем уже установлен и через него вы получаете доступ.
Есть несколько способов предоставить доступ всем участникам вашей команды. Первый — создать учётные записи для каждого, это просто, но может быть весьма обременительно. Вероятно, вы не захотите для каждого пользователя выполнять adduser (или useradd ) и задавать временные пароли.
Второй способ — это создать на сервере пользователя ‘git’, попросить всех участников, кому требуется доступ на запись, прислать вам открытый ключ SSH и добавить эти ключи в файл
/.ssh/authorized_keys в домашнем каталоге пользователя ‘git’. Теперь все будут иметь доступ к этой машине используя пользователя ‘git’. Это никак не повлияет на данные в коммите — пользователь, под которым вы соединяетесь с сервером по SSH, не воздействует на созданные вами коммиты.
Другой способ сделать это — настроить SSH сервер на использование аутентификации через LDAP-сервер или любой другой имеющийся у вас централизованный сервер аутентификации. Вы можете использовать любой механизм аутентификации на сервере и считать что он будет работать для Git, если пользователь может получить доступ к консоли по SSH.