Найти тему
NoraDev

Репозиторий Mercurial для чайников. Я разобрался - так что Вам не придется!

Предисловие

Не смотря на мой большой опыт в программировании, есть вещи, которыми я не особо пользовался, а именно - системами хранения и контроля версий кода.

Системы контроля версий (CVS) — это программные инструменты, помогающие командам разработчиков управлять изменениями в исходном коде с течением времени.

Нет, ну GitHub, я конечно, использовал, но очень редко. Меня огорчала одна мысль, что я не могу бесплатно положить код и закрыть к нему доступ (бесплатно я могу только оставить код открытым для всех), да и доверять свои наработки кому-то из вне не особо хочется (Это моя личная паранойя xD).

К политике GitHub я отношусь нормально, просто я могу оставить код на долгое время забыв о нем, а это будет влетать в копеечку, да и политика GitHub может меняться.

Потому, обычно, различные версии кода у меня лежали в облаках, на сервере или внешнем жёстком диске с указанием дат.

Решение хоть и простое, но требует много места и со временем копируя код на ПК - начинаешь путаться - а последняя ли версия кода тут лежит?

Сами понимаете, контроль версий тут "как никогда кстати".

Так я и остановился с выбором на Mercurial (спустя много лет ;D).

Инструкций по его использованию много, но они на английском или слишком замудренные (есть парочку и по проще, но все же), так что я решил по простому объяснить, как им пользоваться, заодно оставлю себе памятку.

Данная статья может помочь тем, кто ищет базовую информацию о Mercurial и не хочет тратить столько же времени на изучение, сколько ушло у меня.

Что такое Mercurial

Логотип
Логотип

Mercurial - это программа, работающая на скриптах Python (можно сказать - набор скриптов), позволяющая добавлять, редактировать, удалять и синхронизировать версии кода.

Папка с проектом, которая будет подвержена махинациям (с вложенной папкой .hg) - это репозиторий (Да, репозиторий разворачивается даже на Вашем ПК, но об этом дальше).

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

Советую структурировать каталоги так, чтобы Вы могли в них ориентироваться. ;)
Я например создал папку projects, а в ней папки с названием языков программирования и уже внутри - назвал их по именам проектов.

Уточню, что Mercurial - "распределенная система" и не подразумевает централизацию репозитория, что поначалу сбивает с толку после GitHub (у которого есть единый сервер github.com), однако любую "машину" Вы можете использовать как серверную и складировать свой код туда (что уже ближе к принципам GitHub). Причем не важно - Ваш это ПК или Вашего друга. Где хранить код - решать Вам.

Да и Вы вообще можете обойтись без каких-то серверов и просто контролировать версии кода внутри вашего ПК. Просто создаете репозиторий (папки с .hg) и делаете коммиты (типа снимков состояния) вашего кода при тех или иных изменениях.

В остальном - он работает как GitHub, так что Вы можете добавлять, удалять файлы, делать "коммиты", создавать ветки кода, отправлять на сервер и получать последние изменения (и не только последние).

Для передачи кода с одного ПК на другой Вы можете использовать как WEB HTTP сайт, так и SSH протокол. Если у Вас все ПК на Windows - используйте HTTP, если же какой-то на Linux - можно HTTP, а можно SSH.

Настройка Mercurial в Ubuntu и Windows

Для начала - мы должны получить саму программу Mercurial (или hg).

Скачать Вы можете его с официального сайта (если Вы на Windows) или просто установить через пакетный менеджер (например, если у Вас Ubuntu: sudo apt-get install mercurial), при этом для Windows нужен еще putty (а точнее - установочник с plink.exe в составе, так как он нам и нужен будет), без него Вы не сможете отправлять изменения по SSH, но можете обойтись и без него.

Если у Вас Windows 7 - то Вы можете скачать версию Mercurial по старее, вот Вам список старых версий.
На Windows 7 отлично работает версия 3.7.3 x86 и x64.

Итак, Вы установили Mercurial (будь то Linux или Windows). Первым делом правим конфигурационный файл.

В Ubuntu он находится в "/var/lib/mercurial-server/.hgrc".

Чтобы отредактировать его достаточно написать:

sudo nano /var/lib/mercurial-server/.hgrc

Нужно вставить вот эти данные:

[ui]
username = ваш ник <ваша почта>
verbose = True

[web]
allow_push = *
push_ssl = false
Мой файл .hgrc
Мой файл .hgrc

После чего нажать Ctrl+O для сохранения и Ctrl+X для выхода из nano.

На данном этапе - ник и почта не сильно важны, просто укажите то, что будете использовать в качестве своего ника везде. Это ни на что конкретно здесь не влияет (в этом уроке), просто задел на будущее, да и коммиты будут подписаны этими данными. Verbose - выводит данные в консоль о событиях.

То что начинается с [web] нужно для того, чтобы Ваши друзья или Вы спокойно могли отправлять данные по HTTP (поверьте, это избавит Вас от части геморроя и долгого гугления).

Так же советую установить пароль для пользователя hg. Обычно он сам создается при установке Mercurial в Ubuntu. Но на всякий.

Создание пользователя:

sudo useradd hg

Установка пароля:

sudo passwd hg

После чего впишите пароль пользователя 2 раза.

Вы можете использовать и своего пользователя для создания репозитория, просто по SSH нужно будет отправлять изменения именно под этим самым пользователем. Я дал такие полномочия пользователю hg.

В Windows файл настроек должен лежать в "C:\Users\Ваш пользователь\mercurial.ini".

Просто создайте в блокноте или notepad++ новый файл и воткните следующие данные:

[ui]
username = ваш ник <ваша почта>
verbose = True
ssh="C:\Program Files (x86)\PuTTY\plink.exe" -pw тут_ваш_пароль_от_пользователя_ssh -ssh

[web]
allow_push = *
push_ssl = false
Мой файл mercurial.ini
Мой файл mercurial.ini

После этого сохраните файл по пути "C:\Users\Ваш пользователь\mercurial.ini" с расширением ini. Это Важно, потому что блокнот может поставить "mercurial.txt.ini", это надо будет исправить на "mercurial.ini".

Если Вы пропустили текст с Linux - повторюсь: То что начинается с [web] нужно для того, чтобы Ваши друзья или Вы спокойно могли отправлять данные по HTTP (поверьте, это избавит Вас от части геморроя и долгого гугления). Verbose - выводит данные в консоль о событиях.
Параметр SSH можно не указывать, если Вы не будете обращаться к linux серверу по этому протоколу а обойдетесь HTTP, например, чисто по Windows компьютерам.

По умолчанию Mercurial должен сам добавиться в Path (окружение Windows). Чтобы проверить - есть ли он в Path - откройте cmd (или перезапустите cmd, если оно уже было запущено) и напишите "hg".

Если увидите такую картину - то все хорошо:

Windows 7
Windows 7

Но если cmd лишь выдало ошибку: Правой кнопкой мыши по "Компьютер" (мой, этот, не важно) -> Свойства -> Дополнительные параметры системы -> Вкладка Дополнительно ->Переменные среды -> Окно "Системные переменные" -> Patch. Ставите в конце строки "Значение переменной" точку с запятой ";" и вставляете путь до Mercurial (У меня это "C:\Program Files (x86)\Mercurial"), после чего закрываете все и сохраняете

Как добавить Path в Windows 7 (свои ОС вы можете посмотреть в интернете)
Как добавить Path в Windows 7 (свои ОС вы можете посмотреть в интернете)

Ну все, теперь можно переходить к созданию репозитория.

Создание и использование репозитория

Создали папку для проекта и готовы писать и отправлять код на сервер? Чтож, открываем cmd (или terminal в linux) в этой папке и пишем:

hg init

Он должен ничего не ответить, но если посмотрите каталоги (в Windows "dir", а в linux "ls -la"), то Вы увидите, что появилась папка ".hg", которая в Linux скрыта, а в Windows просто лежит в папке с проектом.

".hg" - означающий, что это теперь репозиторий
".hg" - означающий, что это теперь репозиторий
Отлично. Вот Ваш и репозиторий, хоть и локальный, однако давайте для начала разберемся как им управлять, а уже потом отсылать другу на комп. :)

Теперь, когда репозиторий готов - поместите свои файлы и папки внутрь этой папки (не в .hg. Папка .hg должна лежать рядом с файлами, а не содержать их).

После добавления нужных файлов или их создания впишите команду:

hg add
Все, теперь файл testo.txt считается частью следующего коммита
Все, теперь файл testo.txt считается частью следующего коммита

Это сделает файлы, лежащие в репозитории готовыми к коммиту.

Коммит - это процесс фиксации текущего кода в его состоянии (мы как бы заморозили копию этого кода, чтобы потом, в случае чего, достать обратно).
Если у Вас тоже Windows 7, как на фото и Вы видите "кракозябры", вместо русских букв - сначала впишите "chcp 1251" в cmd при каждом запуске, и включите lucida console, - тогда в следующих операциях будет выводиться русский текст. Так Вы поменяете кодировку CMD на cp1251, стандарт для Windows текста.

Прежде чем коммитить код - давайте глянем, что изменилось.

Чтобы посмотреть изменения - впишите:

hg diff
Результат у меня
Результат у меня

Данная команда выведет информацию о том, что изменилось в файле. "---" - это то, что удалено, "+++" - это то, что добавилось, "-" - то, что удалено в этом фале, а "+" - то, что встало вместо предыдущей записи или добавилось вообще. Однако, изменения он показывает только относительно последнего коммита и новых данных, так что, чтобы проверить мое объяснение - давайте сначала за коммитим наши изменения.

Есть 2 способа сделать "commit" - "с открытием редактора текста, чтобы описать изменения", и "с указанием заранее изменений". Каким пользоваться - решать Вам, но я покажу оба.

Чтобы открыть редактор текста напишите:

hg commit

Когда напишите текст - не забудьте нажать кнопку "сохранить". Я написал слово "test", после чего закрыл блокнот и nano.

Результат в Windows
Результат в Windows

Все, коммит готов.

Вторым способом мы обходимся без редактора кода и пишем описание прям в CMD или терминале:

hg commit -m "Тут могла быть Ваша реклама"

И все, после этого так же все коммитится.

Если после этого попробовать сделать коммит снова, то hg ответит, что изменений не было, надо или менять код, или добавлять файлы и папки (включая использование "hg add") или что-то удалить. Только после этого Вы сможете сделать следующий коммит, который зафиксирует изменения.

Давайте вернемся к "hg diff", которая показывает изменения. Для наглядности - попробуйте теперь изменить какой-то файл в репозитории (Только .hg не трогайте, ее вообще нельзя трогать!).

Я вот впишу другой текст в свой testo.txt.

И снова напишите:

hg diff

Если Вы добавляли или удаляли файлы - перед этой командой используйте:

hg add
-12

Как видите теперь он написал "-тесто" и "+тесто1111" (так он показал, что я изменил запись с "тесто" на "тесто1111").

Кстати, Вы так же можете посмотреть состояние Ваших файлов в репозитории при помощи комманды:

hg status
Статус репозитория
Статус репозитория

M - изменился, ! - удален, ? - создан, но не добавлен при помощи "hg add".

Давайте снова закоммитим изменения, чтобы рассмотреть еще одну команду.

hg commit -m "Тут может быть вторая Ваша реклама, но это не точно xD"
Коммит принял изменения
Коммит принял изменения

И теперь перейдем к рассмотрению версий. Давайте посмотрим сколько всего версий (коммитов) у нас было:

hg log
У меня 2 коммита.
У меня 2 коммита.

Как видите, коммиты описываются текстом, что Вы написали, а также от 0 до "Вашего последнего коммита" пронумерованы (первая строка "0:XXXXXXXXXXX") и любой из них можно восстановить командой:

hg update -r номер_версии
так я восстановил мое "тесто" вместо "тесто1111"
так я восстановил мое "тесто" вместо "тесто1111"

Аргумент "-r 0" - ревизия 0, а 0 берем из "hg log" как самый первый коммит.

Так же Вы можете получить актуальную версию коммандой.

hg update
Мое "тесто1111" снова на месте
Мое "тесто1111" снова на месте

Так же Вы можете посмотреть разницу между двумя конкретными версиями коммитов командой:

hg diff -r первый_коммит:второй_коммит
В принципе, у меня всего 2 коммита, так что результат тот же, но если у Вас много коммитов сравнить можно даже первый с последним (например 0:99 или 7:9).
В принципе, у меня всего 2 коммита, так что результат тот же, но если у Вас много коммитов сравнить можно даже первый с последним (например 0:99 или 7:9).

Так и получаем изменения указанных версий коммитов.

Обмен репозиториями по сети

Конечно, Вы может просто копировать репозиторий на флешку и переносить куда угодно, но зачем, если мы можем его скачать, получить изменения и отправить на другой ПК?

Уточню, что то, что я покажу - подходит для простой передачи данных между Вашими ПК или сервером, но не подразумевает никакой защиты логином и паролем (за исключением SSH, конечно). В нормальном случае Вам стоит обратиться к документации mercurial и поднять нормальный WEB сервер, с которым и будет обмен. Тут я буду рассматривать то, что Вы можете сделать, но без должной защиты.
Если Вы решили использовать данный метод для сервера - настоятельно рекомендую использовать собственный VPN (придется и его поднимать) или SSH проброс портов. Не надо выталкивать WEB сервер без защиты на всеобщее обозрение в интернет! Мало того, что Ваш код смогут спереть, так еще и запихнуть в него эксплоит (вирус) без Вашего желания!
Также учтите - нормальный сервер требует SSL сертификаты (для Вашей же защиты), так что нужен HTTPS протокол.

Чтож, вот мы сделали несколько коммитов и хотим поделиться репозиторием с другом, но как?

Ответ прост - поднимем WEB сервер, для этого выполните команду:

hg serve --config web.push_ssl=No

Аргументы "--config web.push_ssl=No" нужны для того, чтобы при отправке по HTTP изменений на репозиторий из вне - Mercurial не ругался на отсутствие SSL сертификатов.

Для домашнего репозитория - можно обойтись HTTP протоколом.
Все, теперь сервер запущен
Все, теперь сервер запущен

Как видно из надписи в кносоли - мой сайт откроется, если я напишу в браузере http://stellar:8000/.

Вот что открылось
Вот что открылось

Однако, все это "ложь, крыздешь и провокация", потому что в 90% случаев ПК Вашего друга, даже находясь в пределах одного WiFi "знать - не знает" доменного имени Вашего ПК (Если конечно, у Вас нет доменного сервера, который это все будет фиксировать и при условии что оба Ваших ПК настроены на чтение информации с него. Не каждый роутер берет на себя такую роль!). Чтобы все же открыть сайт на ПК Вашего друга, если Вы в локальной сети (если нет - SSH или VPN в помощь) - это написать:

http://ip_адрес_ПК:8000

Кто не знает ip адрес можно получить так:

В Windows:

ipconfig
-21

В Linux

ifconfig
Если у Вас WiFi, то еще может быть какой-то wl0s2 и тд. WiFi модули пишутся с буквы "w"
Если у Вас WiFi, то еще может быть какой-то wl0s2 и тд. WiFi модули пишутся с буквы "w"

Итак. Сервер запущен, Мы его открыли, он отображается. Даже файлы можно посмотреть с изменениями в более понятном виде.

Что делать дальше? Ну... для начала нужно установить Mercurial на ПК друга. Думаю, инструкция в начале - напомнит - как это делать.

Затем Ваш друг должен зайти в папку, где он хочет расположить папку проекта и написать:

hg clone http://ip_адрес:8000 имя_папки_репозитория
И вот мы получили репозиторий test в папку test
И вот мы получили репозиторий test в папку test

После чего заходим в папку нашей копии репозитория:

cd имя_репозитория
И, "о чудо!", копия есть!
И, "о чудо!", копия есть!

В этой папке мы снова можем что-то поменять и отправить на сервер обратно.

Я добавлю новый файлик к репозиторию 1.txt для примера.
Новый коммит, только уже в другом месте готов
Новый коммит, только уже в другом месте готов

Так же коммитим результат и пора отправить его на сервер. И опять же - как?

Тут есть 2 способа, первый по WEB, другой по SSH (если нужно отправить на linux).

Отправка и получение по WEB

Отправка по WEB самая простая, просто напишите:

hg push http://ip-адрес_вашего_ПК:8000
Как видите - все хорошо отправилось
Как видите - все хорошо отправилось

Получаем изменения так же, только push меняем на pull:

hg pull http://ip-адрес_вашего_ПК:8000
Я ничего не менял в репозитории, где крутится WEB сервер, так что у меня ничего не пришло
Я ничего не менял в репозитории, где крутится WEB сервер, так что у меня ничего не пришло

Отправка и получение по SSH

Чтобы отправить по SSH - пишем:

hg push ssh://имя_пользователя_создавшег_репозиторий@ip_адрес_ПК//полный_путь_до_папки_с_репозиторием/имя_репозитрия

Если Вы отправляете с Windows на Linux - настоятельно прошу как и я - забить пароль SSH в mercurial.ini на этом ПК, и перед использованием комманды - сначала зайти в папку с putty в CMD и написать:

plink.exe -ssh имя_пользователя_создавшег_репозиторий@ip_адрес_ПК

Он запросит вписать ключ SSH - ну а Вы соглашаетесь "Y" и после этого можете закрывать окно CMD.

Зачем это надо? Иначе у Вас просто зависнет hg push и все. дело в том, что при выполнении отправки по SSH - hg перенаправляет вывод информации с plink на себя, что делает plink не управляемым и как-следствие - Вы даже не увидите окно запроса нажатия "Y" или ввода пароля, потому-то и нужно пароль прописать в mercurial.ini заранее.

В Linux же такой проблемы нет, просто напишите, например:

hg push ssh://petya@192.168.0.35//home/petya/repo/test

Где test - имя папки репозитория, в которой лежит ".hg".

Получаем изменения так же, только push меняем на pull:

hg pull ssh://имя_пользователя_создавшег_репозиторий@ip_адрес_ПК//полный_путь_до_папки_с_репозиторием/имя_репозитрия

Продолжим

Что делать, если при hg pull скачался репозиторий, но файлов почему-то нет? Или Вы случайно удалили файл? Просто запрашиваем восстановление и все:

hg revert -all
Файлы восстановились
Файлы восстановились

И "вуаля", "все как в аптеке"!

После всех махинаций - можно закрыть сервер - нажав Ctrl+C (стандартная комбинация клавиш - выхода из консольного приложения).

Отмечу еще одну важную вещь: если Вы впервые отправлете по push данные в пустой репозиторий - не забудьте на той машине, куда идет отправка - заранее создать папку и прописать "hg init", иначе Mercurial не найдет репозиторий! Если с WEB это еще очевидно, то с SSH - может Вам "наломать дров".

Заключение

Вот Мы и рассмотрели Mercurial, создали что-то простое (что легко может перерасти в сложное) и научились не только создавать репозитории, но и делиться ими с друзьями.

Надеюсь, моя статья Вам помогла разобраться на первых порах в Mercurial, "приятного кода, дамы и господа"!