Предисловие
Не смотря на мой большой опыт в программировании, есть вещи, которыми я не особо пользовался, а именно - системами хранения и контроля версий кода.
Системы контроля версий (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
После чего нажать 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
После этого сохраните файл по пути "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".
Если увидите такую картину - то все хорошо:
Но если cmd лишь выдало ошибку: Правой кнопкой мыши по "Компьютер" (мой, этот, не важно) -> Свойства -> Дополнительные параметры системы -> Вкладка Дополнительно ->Переменные среды -> Окно "Системные переменные" -> Patch. Ставите в конце строки "Значение переменной" точку с запятой ";" и вставляете путь до Mercurial (У меня это "C:\Program Files (x86)\Mercurial"), после чего закрываете все и сохраняете
Ну все, теперь можно переходить к созданию репозитория.
Создание и использование репозитория
Создали папку для проекта и готовы писать и отправлять код на сервер? Чтож, открываем cmd (или terminal в linux) в этой папке и пишем:
hg init
Он должен ничего не ответить, но если посмотрите каталоги (в Windows "dir", а в linux "ls -la"), то Вы увидите, что появилась папка ".hg", которая в Linux скрыта, а в Windows просто лежит в папке с проектом.
Отлично. Вот Ваш и репозиторий, хоть и локальный, однако давайте для начала разберемся как им управлять, а уже потом отсылать другу на комп. :)
Теперь, когда репозиторий готов - поместите свои файлы и папки внутрь этой папки (не в .hg. Папка .hg должна лежать рядом с файлами, а не содержать их).
После добавления нужных файлов или их создания впишите команду:
hg add
Это сделает файлы, лежащие в репозитории готовыми к коммиту.
Коммит - это процесс фиксации текущего кода в его состоянии (мы как бы заморозили копию этого кода, чтобы потом, в случае чего, достать обратно).
Если у Вас тоже Windows 7, как на фото и Вы видите "кракозябры", вместо русских букв - сначала впишите "chcp 1251" в cmd при каждом запуске, и включите lucida console, - тогда в следующих операциях будет выводиться русский текст. Так Вы поменяете кодировку CMD на cp1251, стандарт для Windows текста.
Прежде чем коммитить код - давайте глянем, что изменилось.
Чтобы посмотреть изменения - впишите:
hg diff
Данная команда выведет информацию о том, что изменилось в файле. "---" - это то, что удалено, "+++" - это то, что добавилось, "-" - то, что удалено в этом фале, а "+" - то, что встало вместо предыдущей записи или добавилось вообще. Однако, изменения он показывает только относительно последнего коммита и новых данных, так что, чтобы проверить мое объяснение - давайте сначала за коммитим наши изменения.
Есть 2 способа сделать "commit" - "с открытием редактора текста, чтобы описать изменения", и "с указанием заранее изменений". Каким пользоваться - решать Вам, но я покажу оба.
Чтобы открыть редактор текста напишите:
hg commit
Когда напишите текст - не забудьте нажать кнопку "сохранить". Я написал слово "test", после чего закрыл блокнот и nano.
Все, коммит готов.
Вторым способом мы обходимся без редактора кода и пишем описание прям в CMD или терминале:
hg commit -m "Тут могла быть Ваша реклама"
И все, после этого так же все коммитится.
Если после этого попробовать сделать коммит снова, то hg ответит, что изменений не было, надо или менять код, или добавлять файлы и папки (включая использование "hg add") или что-то удалить. Только после этого Вы сможете сделать следующий коммит, который зафиксирует изменения.
Давайте вернемся к "hg diff", которая показывает изменения. Для наглядности - попробуйте теперь изменить какой-то файл в репозитории (Только .hg не трогайте, ее вообще нельзя трогать!).
Я вот впишу другой текст в свой testo.txt.
И снова напишите:
hg diff
Если Вы добавляли или удаляли файлы - перед этой командой используйте:
hg add
Как видите теперь он написал "-тесто" и "+тесто1111" (так он показал, что я изменил запись с "тесто" на "тесто1111").
Кстати, Вы так же можете посмотреть состояние Ваших файлов в репозитории при помощи комманды:
hg status
M - изменился, ! - удален, ? - создан, но не добавлен при помощи "hg add".
Давайте снова закоммитим изменения, чтобы рассмотреть еще одну команду.
hg commit -m "Тут может быть вторая Ваша реклама, но это не точно xD"
И теперь перейдем к рассмотрению версий. Давайте посмотрим сколько всего версий (коммитов) у нас было:
hg log
Как видите, коммиты описываются текстом, что Вы написали, а также от 0 до "Вашего последнего коммита" пронумерованы (первая строка "0:XXXXXXXXXXX") и любой из них можно восстановить командой:
hg update -r номер_версии
Аргумент "-r 0" - ревизия 0, а 0 берем из "hg log" как самый первый коммит.
Так же Вы можете получить актуальную версию коммандой.
hg update
Так же Вы можете посмотреть разницу между двумя конкретными версиями коммитов командой:
hg diff -r первый_коммит:второй_коммит
Так и получаем изменения указанных версий коммитов.
Обмен репозиториями по сети
Конечно, Вы может просто копировать репозиторий на флешку и переносить куда угодно, но зачем, если мы можем его скачать, получить изменения и отправить на другой ПК?
Уточню, что то, что я покажу - подходит для простой передачи данных между Вашими ПК или сервером, но не подразумевает никакой защиты логином и паролем (за исключением 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
В Linux
ifconfig
Итак. Сервер запущен, Мы его открыли, он отображается. Даже файлы можно посмотреть с изменениями в более понятном виде.
Что делать дальше? Ну... для начала нужно установить Mercurial на ПК друга. Думаю, инструкция в начале - напомнит - как это делать.
Затем Ваш друг должен зайти в папку, где он хочет расположить папку проекта и написать:
hg clone http://ip_адрес:8000 имя_папки_репозитория
После чего заходим в папку нашей копии репозитория:
cd имя_репозитория
В этой папке мы снова можем что-то поменять и отправить на сервер обратно.
Я добавлю новый файлик к репозиторию 1.txt для примера.
Так же коммитим результат и пора отправить его на сервер. И опять же - как?
Тут есть 2 способа, первый по WEB, другой по SSH (если нужно отправить на linux).
Отправка и получение по WEB
Отправка по WEB самая простая, просто напишите:
hg push http://ip-адрес_вашего_ПК:8000
Получаем изменения так же, только push меняем на pull:
hg pull http://ip-адрес_вашего_ПК:8000
Отправка и получение по 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, "приятного кода, дамы и господа"!