Git-репозитарий с доступом по HTTPS
Время, когда правил только CVS, прошло безвозвратно, а посему сейчас много систем контроля версий, хороших и разных, централизированных и распределенных. Прелесть последних состоит в том, что каждая рабочая копия репозитария может также служить как сервер для создания других рабочих копий, поэтому даже если с основным хранилищем произойдет что-то нехорошее – можно воспользоваться рабочей копией.
Прелесть распределенных систем не ограничивается подобной «устойчивостью к отказам». Если проект очень сложен, требуется сложная и инвариантная разработка с последующей интеграцией изменений, без распределенных систем контроля версий приходится очень туго. В частности, Git, написанный Линусом Торвальдсом, используется для разработки ядра ОС Linux, сложность разработки которого можно себе представить, если поглядеть на размер кода. Git очень удобен, с учетом многообразия его возможностей, которые позволяют построить на его базе действительно распределенное хранилище данных. К сожалению, использование Git ограничено в основном не-Windows системами, для разработки в рамках гетерогенных сред следует использовать Mercurial и другие DSCM.
Особенность git-репозитариев (а каждая рабочая копия представляет собой полноценный репозитарий) является их равноценность. Т.е. мы можем сделать копию (при помощи git clone) репозитария, с которой можно делать традиционные операции типа checkout, update (в Git используется pull), commit, создавать ветки (branch) и маркировать срезы (tag), создавать и применять патчи, совмещать ветки и распространять изменения (merge). Но при этом все изменения будут происходить в рамках единственного репозитария. В случае, если же мы хотим работать по традиционной схеме, по аналогии с Subversion, используя некий серверный репозитарий в качестве основного хранилища, нам необходимо передавать (push) и принимать (pull) изменения, синхронизируя локальный репозитарий (который одновременно является и рабочей копией) и удаленный. Доступ к удаленному репозитарию можно организовать посредством множества вариантов, например, поверх ssh, ftp, http (WebDAV), так и при помощи специализированного сервиса (URL в этом случае носит префикс git:).
В общем случае вполне достаточно доступа по https с авторизацией. Настроить Git-репозитарий в целом несложно:
- конфигурируем Apache для использования WebDAV с соответсвующей авторизацией по имени пользователя и паролю
1
2
3
4
5
6
7<Location /myrepository.git>
DAV on
AuthType Basic
AuthName "Git access"
AuthUserFile /etc/apache2/htpasswd.git
Require valid-user
</Location> - создаем пустой репозитарий
1
2
3mkdir /var/www/myrepository.git
cd /var/www/myrepository.git
git --bare init - устанавливаем права доступа на репозитарий, чтобы http-сервис смог не только читать, но и писать
1chown -R www-data:www-data /var/www/myrepository.git
Все. Теперь можно создать рабочий репозитарий при помощи команды git clone https://username@git.myserver.com/myrepository.git. Тут может произойти неприятность – если сертификат у вашего https-сервера сгенерирован при установке, то маловероятно, что он присутствует в локальном OpenSSL-хранилище. Поэтому можно отключить проверку сертификатов при помощи установки переменной среды окружения GIT_SSL_NO_VERIFY=»true». В этом случае проверка сертификата сервера производится не будет.
Хорошо, у нас есть локальная копия сетевого репозитория. Теперь мы можем делать git add и git commit (чаще используют команду git commit -a). Но все данные о версиях файлов будут сохранятся только в нашем локальном репозитарии, сетевой будет по-прежнему девственно чист. Для синхронизации репозитариев надо сделать следующее
- добавить в конфигурацию ссылку на удаленный репозитарий (это достаточно сделать один раз для данной рабочей копии)
1git-config remote.upload.url https://username@git.myserver.com/myrepository.git/
- синхронизировать репозитарии при помощи команды
1git push upload master
, где master – текущий локальный репозитарий, а upload – вышесконфигурированное удаленное хранилище.
На последней операции я словил неприятный глюк с OpenSUSE 11, установленной у меня на рабочем компьютере. Git усиленно утверждал, что ментод http-push ему неведом, поэтому потребовалась ручная сборка из исходников с предоставлением требуемых библиотек. Сборка под домашний Mac не была столь избирательной и работала из коробки.
Много полезной информации по Git можно почерпнуть на официальном сайте. Там же есть шпаргалка с основными командами.


