четверг, 27 марта 2008 г.

Контроль версий с mercurial...

У каждой системы контроля версий своя логика работы, и наверное поэтому они плохо позволяют обмениваться данными друг с другом. Я прекрасно понимаю мысли разработчиков Subversion, которые, создав легкое копирование, отказались одним махом и от тэгов и от бранчей. Но логика подсказывает что бранчи всетаки не такие. Бранчи - это как бы третье измерение контроля версий. Первое измерение - файлы и каталоги, второе - время (история изменений). В Subversion они как бы развернули третье измерение - независимые ветви разработки на первое.

И вот недавно я решил поглядеть на Mercurial.

Вообще я нигиллист наверное. Я и в Subversion никогда не пользовался традиционными trunk/tag/branch, благо это распределение чисто условно. Но вот думаю - как можно содержимое репозитория с такой логикой корректно перенести в репозиторий с правильной? (чем женская логика отличается от железной?) Дык почитай почти никак. Можно перенести все дерево, но функциональность бранчей пропадет. Однако ближе к теме...

Mercurial весьма близок к git. У них одинаковая логика работы, они оба хранят базу изменений непосредственно в рабочем каталоге проекта. В отличии от такого же распределенного monotone, который требует отдельную базу. И еще одно выгодное отличие от monotone в том, что и mercurial и git поразительно быстры. mercurial наверное более дружелюбен к пользователю тем, что имеет меньший набор команд. git в принципе имеет более компактную базу, но чтобы добиваться этой компактности - базу надо специальной командой паковать.

Помню, как в былые времена cvs, доступ к которому можно было получить только по cvs или по ssh протоколу многочисленные проблемы с доступом к репозиторию с работы. Но эти времена прошли. Subversion работает практически как угодно. Не знаю как работает git, но mercurial можно установить просто на http хостинг, правда для вливания в него изменений всеравно придется пользоваться ssh, но какой http хостинг ныне обходится без ssh?

Кроме того, как говорил Линус Торвальд, распределнные системы паразительно удобны. История проекта, которая всегда с тобой.

Но возвращаясь к ранее высказанной мысли - взаимодействие с svn в mercurial в принципе есть. Для этого существуют различные плагины как для импорта, так и для синхронизации. Но не слишком ли разная у них логика работы? Для svn я буду и дальше использовать распределенный svk.

PS: Кстати в mercurial есть замечательная команда - addremove, которая позволяет добавить на контроль все, что не добавлено и удалить все что отсутствует в рабочей копии. Даже в git для этих целей приходится немного нелогично изголяться - git add * - добавить все неподконтрольное; git commit -a - при коммите удалить все отсутствующее.

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