10
Ноя

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
    3
    mkdir /var/www/myrepository.git
    cd /var/www/myrepository.git
    git --bare init
  • устанавливаем права доступа на репозитарий, чтобы http-сервис смог не только читать, но и писать
    1
    chown -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). Но все данные о версиях файлов будут сохранятся только в нашем локальном репозитарии, сетевой будет по-прежнему девственно чист. Для синхронизации репозитариев надо сделать следующее

  • добавить в конфигурацию ссылку на удаленный репозитарий (это достаточно сделать один раз для данной рабочей копии)
    1
    git-config remote.upload.url https://username@git.myserver.com/myrepository.git/
  • синхронизировать репозитарии при помощи команды
    1
    git push upload master

    , где master – текущий локальный репозитарий, а upload – вышесконфигурированное удаленное хранилище.

На последней операции я словил неприятный глюк с OpenSUSE 11, установленной у меня на рабочем компьютере. Git усиленно утверждал, что ментод http-push ему неведом, поэтому потребовалась ручная сборка из исходников с предоставлением требуемых библиотек. Сборка под домашний Mac не была столь избирательной и работала из коробки.

Много полезной информации по Git можно почерпнуть на официальном сайте. Там же есть шпаргалка с основными командами.


Прокомментировать

Мой Круг — Максим Крентовский

Рекомендую

Автомобильные видеорегистраторы с GPS на gadgetz.ru