svn
Я лет 5 сижу на работе на svn и тортилле. И все мне в них нравится, кроме того, что информация о мержах нигде наглядно не отображается. 5 лет назад svn вообще не умел хранить такую информацию и я завел привычку в комментарии к мержу указывать, с чем именно был сделан мерж. Примерно так:
[m657-549] Слито с веткой хххх
Это здорово выручает при всяких выяснениях. Проблема только в том, что чтобы получить наглядное представление о слияниях, надо брать карандаш и бумагу и рисовать интересующие ветки и мержи. Что задалбывает.
В svn 1.5 (а может и более позднем) появилось хранение информации о мержах в свойствах. Однако не знаю почему, но тортилла так до сих пор и не научилась показывать эту информацию на графе. Единственное, что она умеет с ней делать - при выборе ревизий для мержа уже смерженные "засериваются". Это приятно, но мало. Еще одна проблема с таким хранением - не знаю уж почему, но иногда эта инфа распространяется из корневой папки в дочерние папки и файлы. При этом при каждом мерже показывается куча объектов, у которых поменялись только свойства, а не содержимое. А так как фильтрануть по этому признаку можно не во всех диалогах, то это весьма надоедает.
Еще я иногда езжу в командировки, а иногда работаю дома (а иногда админы роняют сервер :) ). При этом хотелось бы также иметь доступ к своим репозитариям.
dvcs
Года полтора назад я начал присматриваться к распределенным системам. Гит мне как-то не глянулся своей линуксовой природой, да и начитался всякого о багах под виндой. Остались базар с меркуриалом.
Базар
Базар вроде как понавороченнее. Тут и легковесные ветки, куча форматов репа, "хитрые" номера ревизий, показывающие, откуда пришел мерж.
Однако его тортилла как-то не фонтан. Стартовое окно не сильно полезное, периодически вылетает, заставить ее использовать tortoise diff/merge я так и не смог. По дефолту во встроенном просмотрщике диффов используется utf-8, в то время как у меня в основном cp1251. Причем даже если поменять руками, то просмотрщик не сохраняет этих изменений. Сравнивать ворд или опенофис в отличие от tortoise svn не умеет. Обновление иконок сильно запаздывает. А когда выяснилось, что в путях с русскими буквами не пашет сравнение, причем это судя по моим изысканиям, бага самого базара, я в нем окончательно разочаровался.
Меркуриал
Меркуриаловская тортилла мне глянулась значительно больше. Падает она редко. По умолчанию открывается страница с журналом. Офисовские файлы сравнивать умеет (как я понял, скрипты для этого они позаимствовали у svn). Тортилловские diff и merge настроились влет. С русскими буквами проблем нет.
Не нравится только ее политика в отношении длинных сообщений - при показе в журнале она их режет до 80 символов (даже если место на экране еще есть), а при просмотре в окне всего сообщения не переносит по границам слов.
Но в принципе ладно, я согласен в случае длинного сообщения делать отдельную "выжимку", а после нее писать само сообщение.
Далее встал вопрос, как хранить центральные репозитарии. На сайте меркуриала обнаружилась масса
полезных ссылок, в частности
SCM-manager. Последний написан на яве и влет встал на уже имеющийся у меня на работе tomcat. Там же лежит ссылка на
RhodeCode, который судя по скринам, понавороченней. Но с ним у меня пока не заладилось - при установке он попытался чего-то скомпилировать, компилятора на сервере нет, и я пока на него забил.
SCM-manager умеет раздавать mercurial и svn репозитарии, а также показывать их в браузере. Также для него можно настроить http-аутентификацию (что я легко сделал) и, судя по доке, относительно легко - ssl (на что я пока забил).
Нажитое
Остался последний вопрос - что делать с уже имеющейся историей. В свое время при переходе с cvs на svn я истории лишился. Нормально перенести ее у меня не получилось, решил начать с нуля, а если что - смотреть историю в cvs. Однако после переустановки винды cvs-тулы я просто не поставил, а через некоторое время прочно забыл, как ими пользоваться и где вообще лежал мой реп :)
Так что теперь я решил все сделать по человечески.
Меркуриал вроде как заявляет работу с svn с помощью встроенного расширения convert. Однако реп у меня устроен не по классической схеме - с иерархией в ветках и тегах, с несколькими транками, иногда изменения делались прямо в тегах, проектов в нем штук 15, и лежат они в одном общем транке. Кроме того, я отмечал мержи и не хочу их лишиться.
С помощью convert мне удалось максимум вытащить ветку, причем начиная с момента ее создания (т.е. до начального ее копирования из другой ветки).
Тогда я вспомнил, что базар тоже работает с svn и попробовал конвертацию свн->базар->меркуриал. Эта схема оказалась лучше - мне удалось скопировать ветку целиком (начиная с ревизии 1). Однако это все равно не то, что мне надо.
Тогда я решил написать свой собственный конвертер. Писал я его на питоне. Вроде как все несложно - с svn я работаю через pysvn (скомпилированная версия для винды есть на офсайте), а с меркуриалом - просто через командную строку.
Меркуриал позволяет при коммите указать дату и пользователя. Осталось только заново "проиграть" всю историю.
Однако вожусь я с этим вот уже третью неделю (в свободное от основной работы время, но все же). Вылезла масса всяких нюансов - переименование тегов, положенные в svn бинарные файлы (я сдуру когда-то запихал туда инсталлированный компилятор :) ), ветки, созданные из тегов, ошибки при коммитах, ....
Так что программа-конвертер разрослась уже за 1000 строк и местами весьма запутанна. Кроме того, прилагается немаленький файл с исключениями :)
Хорошей идеей оказалось прикрутить diff и в ключевых точках (например в тегах) делать автоматическое сравнение рабочих копий hg и svn. Еще одна хорошая идея - с шагом в несколько ревизий делать бэкапы репозиториев hg - чтобы при ошибках начинать не с начала.
Пока удалось сконвертить чуть больше четверти репа, посмотрим что вылезет дальше