Только для читателей Lifeexample возможно открыть интернет-магазин на Moguta.CMS со скидкой в 15%

<<< SOS мой блог исчез! Копирование базы данных || Moguta.CMS – вторая версия >>>

Tortoise HG — клиент для Mercurial

26.10.2012
Tortoise HG - клиент для Mercurial

Здравствуйте, уважаемые читатели блога LifeExample, за последний месяц мой проект MOGUTA.CMS приобрел более-менее устоявшийся состав команды, и мы вместе принялись дописывать продукт, разработанный в цикле статей о создании интернет магазина.

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

Эта задача легко разрешима при использовании одной из распространенных систем контроля версий (VCS — Version Control System), таких как SVN, GIT, Mercurial, Bazaar.

Однажды на блоге я уже писал о системе контроля версий — SVN, в статье "Настройка SVN", и сначала при организации, совместных, процессов разработки MOGUTA.CMS, мы даже стали использовать именно SVN, но впоследствии окончательный выбор пал на Mercurial.

Этому решению способствовало несколько фактов:

  1. Mercurialболее производителен в отличии от SVN, за счет своей концепции в основе которой лежит использование распределенных хранилищ.
  2. Mercurialочень прост в понимании использовании.

Учитывая то, что наша команда состоит в основном из людей, не работавших с системами контроля версий, мы приняли решение использовать подкупившего своей простотой Mercurial’a.

Для полноценного тестирования примеров из этой статьи вы можете воспользоваться сервисом https://www.assembla.com, предоставляющим бесплатные сервера для Mercurial и других VCS.

После регистрации на этом сервисе и проведенных настроек для использования Mercurial, мы получим ссылку для доступа к главному репозиторию на удаленном сервере, примерно такого вида: https://hg.assembla.com/moguta

Имея в наличии эту ссылку, мы можем приступить к использованию хранилища с помощью клиентской программы Tortoise hg. Скачать и установить ее себе на компьютер можно с официального сайта http://tortoisehg.bitbucket.org

Как использовать Tortoise hg

Следующая инструкция не описывает, все возможности программы Tortoise hg, но с ее помощью вы получите наглядное представление, о том, как работать с системой контроля версий Mercurial.

  1. После установки Tortoise hg, в контекстное меню проводника добавятся два пункта: "Hg WorkBench" и "TourtoiseHg".
  2. tortoiseHg пункты в меню
  3. Создадим папку для хранения нашей рабочей копии проекта, желательно, в том месте откуда запускаются локальные сайты. Т.к. для тестирования локальных сайтов я пользуюсь денвером, то в моем случае это C:\WebServers\home\mogutacms.ru\www
  4. Кликнув по созданной папке правой кнопкой мыши, перейдем в пункт TourtoiseHg -> Clone и вставим в поле источник, ссылку репозитория.
  5. клонирование проекта через tortoise Hg
  6. Жмем "Клонировать", программа установив соединение с сервером запросит у вас параметры доступа. При работе с сервером от assembla.com, логин и пароль нужно вводить от учетной записи assembla.

    Если вы пользуетесь другим сервером, тогда логин и пароль должен выдать администратор.

  7. После успешного клонирования, можно начинать работу с проектом , изменяя, добавляя и удаляя принадлежащие ему файлы.
  8. После того как будет внесён, какой-то набор правок, мы можем записать его в узел дерева изменений проекта. Тем самым увековечив эту версию в памяти Mercuriala.
  9. Чтобы записать сделанные изменения перейдем в интерфейс программы Tortoise Hg, кликнув по пункту "Hg WorkBench" из контекстного меню папки с проектом.

    Hg workbench
  10. Вот так показывает нам проект Mercurial, обратите внимание на выделенные области. Картинку можно увеличить, кликнув на нее.
  11. Самое важное в работе с VCS, понимать, как работает система веток. Если взглянуть на граф ревизий, то можно увидеть множество переплетающихся между собой версий проекта

    Слияние веток в tortoise Hg

Такие переплетения являются результатом слияния, двух различных версий разработчиков. К примеру, в команде работают два программиста и один дизайнер, и каждый из них должен внести свои правки в проект. Чтобы максимально комфортно сделать это сразу всем участникам команды, каждому из них необходимо создать свою ветку разработки и вести все изменения в ней.

Это примерно так же, как скопировать в другую папку на диске все файлы и работать уже с ними, не мешая остальным. Только благодаря системе Mercurial, переносом данных в разные папки заниматься не приходится, все, что для этого нужно сделать, это в несколько кликов мыши создать коммит в новую ветку.

Коммит – по-русски говоря это сохранение текущего набора изменений в новую ревизию (версию проекта).

Как создать ветку в Tortoise HG

Мы остановились на том, что создали новый файл в проекте и открыли интерфейс управления Tortoise HG. Посмотрите на приведенную выше иллюстрацию.

Пронумерованные поля, выделенные, красным контуром предназначены для следующих действий:

  • 1: показывает, в какой ветке мы сейчас находимся, об этом говорит, помещенное между двух звезд описание: "Рабочий каталог".
  • 2: также показывает название текущей ветки, а кроме этого является кнопкой для создания новой. Нажав на нее, Tortoise HG предложит создать именованную ветку. Сделаем новое ответвление проекта.
  • создание новой ветки в mercurial
  • 3: отображает список добавленных, или измененных файлов.
  • 4: поле для комментария к новой версии проекта.
  • 5: показывает отличия предыдущей версии файла от новой. Перед фиксацией, обязательно просматривайте все изменения, для контроля от попадания ненужных в проекте функций таких как echo, var_dump, print_r и другого мусора.
  • 6: кнопка фиксации, она же кнопка коммита, она же кнопка сохранения изменений. Нажав на, которую все изменения запишутся в новую версию, и поместятся в созданую ветку. Если ветка не была создана, то запишутся в текущую.
  • изменился граф ревизий tortoisehG

Как слить ветки в Tortoise HG

С внесением правок и созданием новой ветки вроде разобрались.

Хочу обратить внимание: при следующем коммите, не надо создавать новую ветку, делайте все тоже, что описано в предыдущем разделе, но миновав пункт с созданием именованной ветки.

Делать много коммитов в одной ветке полезно, для того чтобы в нужный момент откатиться до предыдущей версии и посмотреть как работала система ранее. Но злоупотреблять коммитами я не рекомендую, делайте их только тогда когда считаете, что закончили какую-то часть работы. Обычно хватает, делать коммит в конце и/или начале рабочего дня.

Как обновляться до предыдущей ревизии

Tortoise HG позволяет двумя простыми кликами мыши, обновиться до любого узла имеющегося в графе ревизий. Кто-бы ни являлся автором коммита, мы всегда можем, нажав правой кнопкой мыши на узел графа, выбрать пункт – "Обновить…" и получить желаемую версию проекта.

mercurial обновиться до ревизии

После обновления, внешний вид графа несколько изменится, но на его структуру это никак не повлияет, просто Tortoise HG отобразит его более удобным для восприятия способом. С обновлением до какой либо ревизии поменяются данные в полях 1 и 2, приведенных на иллюстрации с разметкой.

Вот так будет выглядеть в нашем примере граф после обновления:

граф после обновления

Как слить ветки проекта

Выражение "Слить ветки" в Mercurial и других системах контроля версий, означает объединить изменения двух разных версий. Сливать ветки можно как свои, так и чужие, и самое главное сливать можно с дефолтной веткой.

Кстати, я упустил момент, и не сказал, что дефолтная ветка – это ветка, которая содержит текущую стабильную версию проекта, т.е. сливаться с ней можно только тогда, когда все правки отлажены и протестированы.

Новые разработчики при клонировании проекта, должны иметь возможность получить сразу полный комплект стабильных изменений, чтобы приступить к внесению собственных, как это сделали мы в примере.

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

tortoise hg Обновиться до дефолтной ветки

А затем кликом правой кнопкой мыши, по узлу графа, с нашим коммитом (ревизия 69), выберем меню "Слить с локальной".

mercurial слить с локальной

После клика по пункту, будут появляться диалоговые окна, во всех них, жмем "Далее".
В результате получим такую картину графа, и обновленную дефолтную ветвь проекта.

объединение двух версий в tortoise-hg

Сливать ветки можно как справа налево, так и слева на право. Если вы разрабатываете какой либо собственный модуль, требующий долгого времени, но в этот период дефолтная ветка обновляется другими разработчиками, вам надо сливать изменения из дефолтной ветки в свою, но не наоборот. Причем делать это нужно, настолько часто, настолько часто обновляется дефолтная ветка.

Как узнать, что дефолтная ветка обновилась

Каждый раз, перед тем как сутра продолжать разработку, необходимо затягивать все изменения проекта, внесенные другими разработчиками ночью. Это нужно делать как можно чаще, чтобы не возникла ситуация когда два разных человека правят один и тот же файл, в корне переписывая его.

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

Чтобы затянуть изменения, если таковые имеются, в панели управления Tortoise HG, есть советующая иконка, которая называется "Затянуть входящие изменения с выбранного URL".

Затянуть изменения

Вот что я получил, нажав на кнопку затянуть изменения с сервера:

Mercurial изменения в параллельных ветках

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

Я еще не упоминал об этом, и вот время пришло. Все действия которые мы делали, производились над нашей локальной рабочей копией хранилища. Вот она, та самая удобность, которая есть у Mercurial и нет у SVN, все коммиты которые мы делали, сохранялись только на нашем компьютере, и не мешали другим.

Как применить свои изменения на центральном сервере

Теперь, когда все отлажено и нет конфликтов с только что затянувшимися ветками, мы можем сделать обратную операцию: отправить все свои изменения на централизованный сервер.

Делается это нажатием на кнопку "Протолкнуть исходящие изменения на выбранный URL"

Синхронизация с хранилищем Mercurial

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

Проблема с отправкой на сервер

К сожалению, не все так гладко как описано выше, в реальности при отправке на сервер своих правок, часто можно получить похожую ошибку:

searching for changes
abort: push creates new remote head 3a37da9642d5!
(you should pull and merge or use push -f to force)

Означает она, то что, после того как вы затянули изменения (а может и не затянули, хотя обязаны) в графе ревизий появилось две головы одной и той же ветки. Такое может случиться когда два разработчика работают в одной ветке, и периодически делают коммиты.

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

Другими словами, нам надо сделать из двух версий одной и той же ветки лишь одну.

Для этого необходимо слить наши изменения и те, что сделаны другим разработчиком. При слиянии могут возникнуть конфликты, если были затронуты одни и те же участки кода в двух версиях. В этом случае необходимо воспользоваться встроенным редактором конфликтов от Tortoise HG, и построчно сверить файлы, выбирая для разных конфликтов наиболее подходящий вариант решения.

Более простой способ решения конфликтов, это указать программе взять целиком наш локальный файл. В этом случае в объединенной версии окажется ваш файл, без чужих правок. Это поможет завершить слияние и протолкнуть в общее хранилище, но может вызвать проблемы в работоспособности проекта, т.к. изменений, которые делались другим разработчиком теперь не существует в текущей версии.

Чтобы решить эту ситуацию, лучше связаться со вторым человеком и постараться вместе найти те участки кода, в которых нужно вставить его код.

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

Tortoise HG все время требует логин и пароль

Если вы опробовали в действии Tortoise HG, то наверняка заметили назойливую проверку каждого действия, запросом логина и пароля. Дабы не утруждать Tortoise HG, запрашивать у нас эти данные, нужно сделать одну настройку.

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

То что было:

[paths]
default = https:// hg.assembla.com/moguta

То что должно быть:

[paths]
default = https://ВашНик:ВашПароль@hg.assembla.com/moguta

Сохраним файл, и перезапустим Workbench HG.
После этих действий, запрос пароля перестанет докучать нам.

Эта статья по обзору Tortoise HG получилась очень насыщенной информацией и иллюстрациями. Надеюсь, она поможет разобраться с основными аспектами работы с Mercurial.

Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.

Нравится

Комментарии

  • Дiмка

    Эх, Марк! Где ты был раньше с этой статьей??))) Столько времени позволила бы она сэкономить))

    Внесу свои 5 копеек! В конце статьи описано как настроить логин- пароль. Есть немного простой путь. Не надо не куда лазить, это можно сделать прямо в программе.
    Нажав пункт меню «Синхронизация». 3 картинка справа в виде двух стрелок. Нажав ее и выбрав правой кнопкой в «Пути настройках хранилища:» URL с хранилищем правим его, добавляя после «https://» — Логин:Пароль@ а затем «hg.assembla.com/moguta«, те в таком виде:
    _https://dmgriny:***@hg.assembla.com

  • Vadim

    Здарвствуйте Марк, хотел спросить, получается для каждого проекта нужно делать отдельный репозитарий???

    • Да, каждый проект это отдельное хранилище. Ну теоретически можно с первой ревизии начинать новую ветку для нового проекта, хотя это не очень удобно.

  • Artyom

    Здравствуйте!
    «Перед фиксацией, обязательно просматривайте все изменения, для контроля от попадания ненужных в проекте функций таких как echo, var_dump, print_r и другого мусора.»

    Что значит «ненужные функции, мусор»? Поясните, пожалуйста.

    • Ненужные функции и мусор — это функции использованные для отладки приложения, например var_dump. А мусор, это куски закоментированного кода, который уже не нужен.

  • Павло

    Здравствуйте!

    Скажите пожалуйста, можно ли подключить каким-то образом TortoiseHg к удаленному серверу (хостинг, выделенка или VPS…).

    Проблема возникла, поскольку у всей комманды динамические ip и для того, чтобы показать результат заказчику, приходиться качать файли на сервер через ФТП — можно ли как нибуть автоматизировать этот процес?

    Спасибо за ответ.

    • Павло, попробуйте вот этот сервис: _https://bitbucket.org/ для ведении удаленной работы всей команды в Mercurial. Мы пользуемся им для работы над проектом moguta.cms.

  • insolor

    > Перед фиксацией, обязательно просматривайте все изменения, для контроля от попадания ненужных в проекте функций таких как echo, var_dump, print_r и другого мусора.

    Достаточно убирать отладочный и прочий ненужный код, когда в нем уже нет необходимости. А убирать его перед коммитом и восстанавливать обратно — не вариант. А уже чистый код можно мержить в основную ветку.

  • Начинающий

    Отстой статья!!! Ничего непонятно!!!!

    • Статья рассчитана на людей с базовыми умениями работы с компьютером.

  • мария

    Добрый день,вы не подскажете как скачать таким способом 1 ветку репозитория на компьютер

    • Дiмка

      Мария, на компьютере пользователя храниться локальная версия хранилища полностью. Возможно лишь отдельно сохранить необходимые файлы в любой ревизии (через контекстное меню)

  • Игорь

    Спасибо большое за информацию. Убрал надоедающее подтверждение пароля

  • Оставить комментарий

    Подписаться на комментарии к этой статье по RSS

    Размещение статей и контекстных ссылок
    Яндекс.Метрика