Джино: хостинг и веб-сервисы

Система Orphus
Russian version
Добавить на Del.icio.us
English version
Добавить на Digg.com

 dkLab | Конструктор | Plainmerge: скоростное и упрощенное слияние веток в Subversion 

Карта сайта :: Форум «Лаборатории» :: Проект «Денвер»
Проект «Orphus» :: Куроводство: наблы :: Конструктор


2009-06-28
Обсудить на форуме

Plainmerge — это простая и быстрая утилита для Subversion (Windows), позволяющая вам авторитарно сливать ветки в проектах с очень большим числом файлов. Ее удобно применять, если в вашем проекте есть 2 основные ветки:

  1. trunk: ветка для ведения разработки.
  2. RELEASE: ветка, которая работает на продакшен-версии проекта. При выполнении полного релиза в эту ветку копируется все содержимое trunk. Если же нужно "прокинуть" критический багфикс, он переносится в RELEASE в индивидуальном порядке.

Чайник 

Если вы довольны стандартным механизмом слияния Subversion, значит, вам не нужна никакая утилита. Если же вы в своем проекте (как я) сидите и ждете по 10 минут, пока закончится merge, то plainmerge — для вас.

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

Для частичного (или полного) "проброса" изменений из trunk в RELEASE воспользуйтесь следующей командой:

Листинг 1: Запуск plainmerge
plainmerge.bat  proto://server_url/trunk  proto://server_url/branches/RELEASE

// или в общем виде (причем репозитории даже могут различаться):
plainmerge.bat  url_источника  url_места_назначения

Лирическое отступление 
Первый запуск утилиты займет много времени, т.к. plainmerge выполняет начальную инициализацию и сохраняет результат во временную директорию. Выпейте чаю. Зато последующие запуски (даже через месяц) будут уже быстрыми.


Дождитесь окончания операции. Откроется программа визуального сравнения двух веток. При использовании Araxis Merge вы попадете в 3-панельный режим сравнения (см. рис. ниже): в нем нужно "перекинуть" изменения из правой панели (trunk) в среднюю (RELEASE), используя левую (ORIG-RELEASE) просто в качестве эталонной подсказки, если понадобится отменить изменение.

Чайник 

Т.к. Araxis Merge платный, то в дистрибутив plainmerge он не входит. Зато в него входит WinMerge, в котором есть только 2-панельный режим сравнения (справа будет по-прежнему trunk, а слева — RELEASE).


Щелкнув на тот или иной файл, можно просмотреть изменения в нем, а также скопировать часть из них (или все) в ветку RELEASE:


Как только вы закончите слияние, закройте программу. Через несколько секунд plainmerge сформирует финальный diff-файл со всеми изменениями, которые попадут в ветку RELEASE. Проверьте их визуально: все ли правильно. Чтобы продолжить, закройте программу.


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


Зачем эта утилита?

Чайник 

Мое личное мнение таково: тема веток и слияний — больная как для CVS, так и для Subversion. Причем несмотря на то, что разработчики Subversion делают определенные шаги для упрощения слияний, медлительность GUI-клиентов сводит на нет все их устилия.

Главная цель, которая преследовалась при создании утилиты plainmerge, — сделать инструмент, который:

  • не "тормозит" при повторных запусках;
  • не требует явного извлечения рабочей копии (т.е. выполняет как бы "слияние на сервере");
  • позволяет выбирать изменения в визуальном режиме;
  • "прозрачно" отслеживает операции добавления и удаления файлов.

К сожалению, у скорости есть своя цена: plainmerge не учитывает историю коммитов, поэтому, пробрасывая изменения из ветки в ветку, вы не можете посмотреть, кто их сделал. Решайте сами: можете ли вы пожертвовать этим в своем проекте или нет. (Мы можем.)

Чайник 

Кстати говоря, описанных проблем просто не существует, если использовать Git. В частности, Git позволяет "единично пробрасывать" коммиты из ветки в ветку без потери информации об их авторе, и делает это быстро. Мой искренний совет вам: если есть возможность, переходите на Git.

Программы визуального слияния

В настоящий момент plainmerge поддерживает работу с программами WinMerge (бесплатная, входит в дистрибутив plainmerge) и Araxis Merge (платная, зато поддерживает 3-way comparision, крайне удобный в слияниях).

По умолчанию запускается WinMerge. Чтобы подключить Araxis, просто скопируйте его файлы (обычно расположенные в C:/Program Files/Araxis Merge) в папку bin/araxis.

Чайник 

Готовя релиз plainmerge, я просмотрел 8 различных GUI-программ для выполнения визуального слияния (как платных, так и свободных). Araxis Merge оказался самым удобным, хотя он и платный. Очень рекомендую попробовать. На втором месте — бесплатный WinMerge.

Состав дистрибутива

В состав plainmerge входят "кусочки" следующих программ:

  • Plainmerge: сама утилита.
  • Perl: урезанная версия (на нем и написана утилита, если вам интересно).
  • SlikSvn: урезанная Win32-версия консольных утилит Subversion.
  • TortoiseSvn: только утилита UDiff для наглядного отображения diff-файлов.
  • WinMerge: урезанная версия WinMerge.
  • Дополнительно можно подключить Araxis Merge, расположив его в директории bin/araxis.

Резюме

Plainmerge — весьма специфическая утилита. Она намеренно нарушает "книжные" каноны выполнения слияний в Subversion, которые подчас оказываются очень сложными и медлительными в больших проектах. Взамен дается быстрый инструмент для удобной "прокидки" изменений в другую ветку. В качестве расплаты — при слиянии не учитываются авторы коммитов, а сравниваются, фактически, две статические версии одного проекта. Поэтому тот, кто выполняет слияние, должен неплохо ориентироваться в коде проекта и быть в контакте со всеми разработчиками.

Решайте сами, пользоваться утилитой, переходить на Git (Mercuria, Bazaar и т. д.) или же продолжать наслаждаться стандартным merge в Subversion.







Дмитрий Котеров, Лаборатория dk. ©1999-2016
GZip
Добавить на Del.icio.us   Добавить на Digg.com   Добавить на reddit.com
1) Warning: Subroutine Pager::basename redefined at /usr/share/perl/5.18/Exporter.pm line 66.
2) Warning: Subroutine Pager::dirname redefined at /usr/share/perl/5.18/Exporter.pm line 66.