Skip to content


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

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

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

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

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

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

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


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

  1. Первым делом нужно установить сам mercurial и apache httpd (для примера возьмём дистрибутив CentOS):
    1. yum install mercurial httpd mod_ssl
  2. Потом собственно создаём локальный (для веб-сервера) репозиторий:
    1. mkdir -p /var/www/repos.mydomain.com/hg/repos/myrepo
    2. cd /var/www/repos.mydomain.com/hg/repos
    3. hg init myrepo
  3. Далее создаём виртуальный хост:
    1. <VirtualHost 10.10.10.10:443>
    2.   SSLEngine on
    3.   ServerAdmin mercurial@myomain.com
    4.   ServerName repos.mydomain.com
    5.   DocumentRoot /var/www/repos.mydomain.com/html/
    6.   ErrorLog /var/www/repos.mydomain.com/logs/error_ssl_log
    7.   CustomLog /var/www/repos.mydomain.com/logs/access_ssl_log common
    8.  
    9.   SSLCertificateKeyFile /etc/ssl/mydomain.com/_.yourdomain.com.key
    10.   SSLCertificateFile /etc/ssl/mydomain.com/_.yourdomain.com.crt
    11.   SSLCertificateChainFile /etc/ssl/mydomain.com/gd_bundle.crt
    12.  
    13.   SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown \
    14.      downgrade-1.0 force-response-1.0
    15.  
    16.   ScriptAliasMatch ^/hg(.*) /var/www/repos.mydomain.com/cgi-bin/hgweb.cgi$1
    17.   <Directory /var/www/repos.mydomain.com/cgi-bin/>
    18.     Options ExecCGI FollowSymLinks
    19.     AllowOverride None
    20.   </Directory>
    21.  
    22.   <Location /hg/>
    23.     AuthType Basic
    24.     AuthName "Mercurial repositories"
    25.     AuthUserFile /var/www/repos.mydomain.com/conf/htpasswd.conf
    26.     Require valid-user
    27.   </Location>
    28. </VirtualHost>

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

  4. Далее в ту же директорию, куда скопировали hgweb.cgi, ложим файл hgweb.config такого содержания:
    1. # /prefix/to/strip/off = /root/of/tree/full/of/repos
    2. [collections]
    3. /var/www/repos.mydomain.com/hg/repos/ = /var/www/repos.mydomain.com/hg/repos/
    4.  
    5. [web]
    6. 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 следующего содержания:
    1. [web]
    2. allow_push = dev1, dev2
    3. allow_read = dev1, dev2, devjunior
    4. encoding = utf-8
    5.  
    6. [trusted]
    7. users = apache

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

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

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

    1. [web]
    2. allow_read = *
    3. deny_push = jenkins
    4. allow_push = *
    5. encoding = utf-8
    6. push_ssl = false
    7.  
    8. [trusted]
    9. users = apache

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

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

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

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

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

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

  1. [hostfingerprints]
  2. 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:

Размещено в категории *nix, Веб-приложения.

Комментариев: 4

Чтобы быть всегда в курсе здесь происходящего, Вы можете подписаться на RSS feed для комментариев на эту заметку.

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

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

    [web]
    push_ssl = false

  3. Admin said

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

  4. Васян said

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

Some HTML is OK

(required)

(required, but never shared)

, или ответить через trackback.

Страница 1 из 11