hgsubversion
Иван Сагалаев начал тему взаимодействия DVCS с Subversion, я продолжу и расскажу про свой опыт с Mercurial+Subversion.
У нас, как и у многих других, используется Subversion. Однако меня после тесного общения с Mercurial и Git как-то очень быстро стали утомлять:
svn stat/diffпоказывает изменения только в текущей директорииsvn upдолго-долго шуршит винчестером прежде чем что-то сделать- нет сети — нет работы. Дело даже не в коммите, а хотя бы посмотреть лог
и еще тысяча маленьких полезных вещей, которые с ходу не вспомнишь, но отсутствие которых допекает (цветные diff’ы, быстрый revert всех правок, удаление “левых” файлов, удобные add, возможность скопировать/перенести файл с правками и прочее и прочая).
Я было соблазнился на git-svn, но Александр Соловьев, адепт Mercurial посоветовал hgsubversion. Правда автор этого расширения предупреждает: “right now it is not ready for production use” и это похоже на правду.
Инсталляция не доставляет хлопот: практически все необходимые зависимости есть в Ubuntu 9.04 (разве что сам Mercurial нужно обновить до 1.3).
После этого появляется возможность работать с репозиториями svn+http:// почти
как с настоящими hg-репо. Т.е. никаких дополнительных/специфичных
команд не требуется, а все обычные команды работают как должны —
hg pull “вытаскивает” изменения с удаленного репозитория, hg commit коммитит
в локальный репо, hg push — отсылает изменения с локального на удаленный
репозиторий, hg in показывает какие новые изменения придут с pull-ом, а
hg out — какие уйдут с push-ем.
Всё хорошо ровно до того момента, как вы пожелаете сделать мердж. hg push
невнятно ругнётся и вы вспомните, что еще не добавили плагин rebase для Mercurial ;) Собственно именно в этом и заключается особенность работы с svn-репо.
Перед push-ем, вам нужно “линеаризовать” историю, “перенести” свою ветку изменений
поверх последнего коммита так, чтобы история была линейной.
После этого можно будет успешно отослать изменения в svn-репозиторий.
Собственно именно к rebase у меня больше всего нареканий.
Во-первых, hg не делает rebase автоматически. В большинстве случаев при работе с svn понятно какие коммиты куда переносить (коммиты, которых еще нет в svn-репо перенести поверх тех, которые уже там есть), но приходится делать “рукаи”: hg glog глазами смотришь, запоминаешь/записываешь на бумажке с какой на какую ревизию переносить, hg rebase -s X -d Y.
Во-вторых, rebase переносит коммиты “как есть”. Т.е. нельзя сказать “перенеси не коммиты, но изменения с этой ветки”. Т.е. было у вас 20 коммитов в ветке, они перенесутся как 20 коммитов. И тут есть два нюанса:
- до обновления ваши коммиты были “правильными”, после rebase несмотря на отсутствие конфликтов, они могли поломать что-то в обновлениях, пришедших из svn. Т.е. вы обновились, реализовали фичу/закрыли тикет, написали/исправили тесты, всё ок, закоммитили. Потом вы снова обновляетесь с svn и надо бы “перенести” свои коммиты поверх изменений, проверить тесты, и потом закоммитить, но hg в отсутствие конфликтов перенесет коммиты as is, поэтому есть вероятность писать еще фикс “в догонку”.
- иногда всё же хочется, чтобы был один коммит: “сделано то-то”, а не четыре: “сделана база для того-то”, “написаны основные тесты”, “реализована вся функциональность”, “дополнительные тесты и фиксы”. rebase такого не делает.
Знатоки hg скажут, что это я валю с больной головы на здоровую, и что rebase не для этого, и что нужно использовать patch queue, но я попробовал и мне с ними не особо комфортно.
Далее, еще один “баг”, с которым я столкнулся: бранчи из hg-репо не переносятся в svn. Т.е. в hg нельзя создать новый svn-бранч. Это очень плохо.
Но это еще не всё. Mercurial не особо помогает и в мерджах между бранчами. Т.е. если у нас есть в svn trunk (который переносится в hg как default) и бранч M3 (который переносится в hg как бранч M3), то hg нам не поможет их смерджить.
Обычный hg merge не работает, потому что для svn нужна линейная история, а hg rebase не подходит, потому что нам по факту нужно скопировать изменения одним патчем, а не перенести коммиты.
Если подвести итоги, то hgsubversion достаточно хорош как svn-клиент, но полноценно комфортно взаимодействовать hg с svn он не позволяет.

Комментарии
А чем плохо? В bzr та же ситуация: свои родные бранчи в subversion никак не отражаются. Но мне ни разу и не хотелось :-). То есть, юзкейс какой?
Создать бранч, чтобы коллеги могли его использовать :-)
Тут на самом деле у меня больше диссонанс в концепции. Clone мы делаем со всего репо (не с trunk), svn-бранчи вижу, в бранчи коммитить могу, а создавать — нет.
Если бы концепция: trunk — отдельный репо, branches/* — отдельные репо, тогда вопросов бы не было :)
http://bitbucket.org/durin42/histedit/ ;-)
Самое забавное, что от того же человека, что и hgsubversion ;-)
Да и еще, забыл добавить: обычные svn-пользователи вряд ли освоят такое кунг-фу, только закоренелые hg-маньяки. Так что мотивация “соблазню коллегу фишками, он попробует на hgsubversion, а уж потом и на hg переберется” не работает.
Кстати, обновил hgsubversion, rebase стал намного более комфортным:
hg rebase --svnделает всё как надо :)Я вот использую только cvs и subversion. Благодаря тому, что многие разработчики на python используют гиты и меркуалы — пришлось познакомиться с ним. Но переходить нет никакого желания, достаточно одну систему выучить и знать досконально. Хотя может просто старею.
Достаточно для кого? Для тебя — отлично! Мне не достаточно :)
Лучше день потерять, потом за пять минут долететь. (c) Крылья, ноги и хвосты.
Возможно вы сможете помочь. Пытаюсь настроить систему для работы с hgsubversion.
Немного поколдовав, добился таки выполнения
python -c 'import hgsubversion'без ошибок (Иван сегодня спрашивал вас по моей просьбе =)), в /etc/mercurial/hgrc сейчас прописано следующее:[extension] hgext.rebase= hgsubversion=
Но при попытке выполнить пример из хелпа hgsubversion получаю ошибку:
$ hg clone svn+http://python-nose.googlecode.com/svn nose-hgabort: repository svn+http://python-nose.googlecode.com/svn not found!Просто SVN
$ svn co http://python-nose.googlecode.com/svn nose-svnотрабатывает нормально, т.е. с самим репозиторием все в порядке.
Подскажите, что я мог не учесть.
np, свяжись со мной джаббером j2a@jabber.ru или скайпом yyurevich — поэкспериментируем ;)
P.S. УМВР.
Форма комментирования для «hgsubversion»