Skip to content


Шпаргалка по mercurial

Руководство по созданию нового mercurial-репозитория

система контроля версий mercurial

Mercurial – это очень популярная распределённая (так как отсутствует центральное хранилище кода) система контроля версий, применяемая многими девелоперами. Работа с файлами проекта происходит в локальной директории. По мере завершения каких-то логических этапов работы выполняется commit изменений в данный локальный репозиторий. При необходимости производится синхронизация изменений с репозиториями других девелоперов: операция pull выполняет вливание чужих наборов изменений, а операция push отдаёт свои.

Считается, что оно даже круче, чем Subversion :) Чем именно круче я толком не знаю пока, ибо плотно не пользовался еще.

А я коммичу в мастер ветку без тестов

А я коммичу в мастер ветку без тестов


Далее речь пойдёт о том, как создать доступный по протоколу HTTPS защищенный mercurial-репозиторий, который будет условно считаться "основным" в процессе работы над проектом. Так SVN-нозависимым товарищам проще справится с новой идеологией распределённости. Да и процесс управления бекапами становится проще – административно объявляем, что бекапим только этот условно основной репозиторий, а остальные оставляем на совести отдельных девелоперов.

  1. Первым делом нужно установить сам mercurial и apache httpd (для примера возьмём дистрибутив CentOS):
    yum install mercurial httpd mod_ssl
  2. Потом собственно создаём локальный (для веб-сервера) репозиторий:
    mkdir -p /var/www/repos.mydomain.com/hg/repos/myrepo
    cd /var/www/repos.mydomain.com/hg/repos
    hg init myrepo
  3. Далее создаём виртуальный хост:
    <VirtualHost 10.10.10.10:443>
      SSLEngine on
      ServerAdmin [email protected]
      ServerName repos.mydomain.com
      DocumentRoot /var/www/repos.mydomain.com/html/
      ErrorLog /var/www/repos.mydomain.com/logs/error_ssl_log
      CustomLog /var/www/repos.mydomain.com/logs/access_ssl_log common
     
      SSLCertificateKeyFile /etc/ssl/mydomain.com/_.yourdomain.com.key
      SSLCertificateFile /etc/ssl/mydomain.com/_.yourdomain.com.crt
      SSLCertificateChainFile /etc/ssl/mydomain.com/gd_bundle.crt
     
      SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0
     
      ScriptAliasMatch ^/hg(.*) /var/www/repos.mydomain.com/cgi-bin/hgweb.cgi$1
      <Directory /var/www/repos.mydomain.com/cgi-bin/>
        Options ExecCGI FollowSymLinks
        AllowOverride None
      </Directory>
     
      <Location /hg/>
        AuthType Basic
        AuthName "Mercurial repositories"
        AuthUserFile /var/www/repos.mydomain.com/conf/htpasswd.conf
        Require valid-user
      </Location>
    </VirtualHost>

    Скрипт hgweb.cgi берётся из rpm-ки (по умолчанию ставится в /usr/share/doc/mercurial*/hgweb.cgi) и ложится в доступную апачу директорию, как указано в конфиге выше. В файл /var/www/repos.mydomain.com/conf/htpasswd.conf вносим пользователей, которые будут работать с репозиторием, с помощью команды htpasswd.

  4. Далее в ту же директорию, куда скопировали hgweb.cgi, ложим файл hgweb.config такого содержания:
    # /prefix/to/strip/off = /root/of/tree/full/of/repos
    [collections]
    /var/www/repos.mydomain.com/hg/repos/ = /var/www/repos.mydomain.com/hg/repos/
     
    [web]
    baseurl = /hg
  5. В файле /var/www/repos.mydomain.com/cgi-bin/hgweb.cgi изменяем значение переменной config (путь к hgweb.config).
  6. По умолчанию push (запись в репозиторий) запрещен, чтобы его разрешить, нужно создать файл /var/www/repos.mydomain.com/hg/repos/myrepo/.hg/hgrc следующего содержания:
    [web]
    allow_push = dev1, dev2
    allow_read = dev1, dev2, devjunior
    encoding = utf-8
     
    [trusted]
    users = apache

    Здесь подразумевается, что httpd выполняется под пользователем apache.

    С этого момента репозиторий готов и доступен по URL: https://repos.mydomain.com/hg/myrepo.
    Причём читать его могут три пользователя с логинами dev1, dev2 и devjunior, а вносить изменения – только два, с логинами dev1 и dev2.

    Если полный доступ нужно разрешить всем кроме некоторого списка READ-ONLY пользователей, то в сопровождении будет более удобным такой конфиг:

    [web]
    allow_read = *
    deny_push = jenkins 
    allow_push = *
    encoding = utf-8
    push_ssl = false
     
    [trusted]
    users = apache

Чтобы избавиться от предупреждений вроде этого

warning: repos.mydomain.com certificate with fingerprint
f8:85:d9:cb:b0:05:38:55:95:4e:74:a0:f9:3a:ba:5f:63:58:fd:b6
not verified (check hostfingerprints or web.cacerts config setting)

нужно добавить в конфиг-файл /etc/mercurial/hgrc такое:

[web]
cacerts = /etc/pki/tls/certs/ca-bundle.crt

Где /etc/pki/tls/certs/ca-bundle.crt - файл с корневыми SSL-сертификатами.

Другой способ решения (сработает только для одного конкретного репозитория с адресом repo.mydomain.com) – добавить в тот же файл

[hostfingerprints]
repo.mydomain.com = f8:85:d9:cb:b0:05:38:55:95:4e:74:a0:f9:3a:ba:5f:63:58:fd:b6

Дополнительная информация: http://mercurial.selenic.com/wiki

Также новичкам рекомендую посмотреть обучающее видео на тему эффективной работы с Mercurial:

Posted in *nix, Веб-приложения.


4 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. Петровский says

    Что-то у вас тут не клеится - в конфиге апача один путь (начинается с /var/www), а в hgweb.config - другой (начинается с /usr/hosting). Опечатка?

  2. Петровский says

    А если при push-е вылазит "remote: ssl required", то надо добавить в hgrc такое:

    [web]
    push_ssl = false

  3. Admin says

    Дизайн, спасибо, поправил.

  4. Васян says

    Коммитер без тестов позабавил :)

You must be logged in to post a comment.