Изменения

Перейти к: навигация, поиск

Сравнение DVCS - несколько задач

1368 байтов добавлено, 01:30, 26 ноября 2009
Mercurial
=== Mercurial ===
'''Mercurial''': хорошо. отлично (5-)! Есть несколько расширений — [http://mercurial.selenic.com/wiki/HgSubversion hgsubversion], [http://pypi.python.org/pypi/hgsvn hgsvn], [http://mercurial.selenic.com/wiki/ConvertExtension convert], позволяющих работать с Subversion тем или иным образом, и не совместимых друг с другом. Самое вменяемое из них — '''hgsubversion''', хотя и заявлено, что оно ещё сырое, и, к сожалению, не распространяется вместе с Mercurial’ом. Имеет фактически весь необходимый функционал — можно делать и <tt>push</tt>, и <tt>pull</tt> в/из Subversion, можно клонировать SVN-репозиторий с сохранением веток и меток (правда, обязательно стандартное их расположение в корневых поддиректориях <tt>/trunk</tt>, <tt>/branches</tt>, <tt>/tags</tt>), эти два метода совместимы, <tt>rebase</tt> также работает, а граф ветвлений сохраняется. Очень крут тот факт, что ветка, которая создавалась неполным копированием <tt>trunk</tt>'а, то есть, копированием некоторых его поддиректорий, успешно подцепилась в нужное место графа ветвлений. Ни Bazaar, ни Git этого не смогли.
В бочке мёдаВместо 5 всё-таки 5-, так как всегда, есть ложка дёгтябыл обнаружен очень неприятный баг: push из mercurial-копии репозитория без веток и меток (то есть вида просто одной директории) в Subversion не работает работал вообще — [http://groups.google.com/group/hgsubversion/browse_thread/thread/3749eb3cbf007855 обсуждение в группе hgsubversion]. Правда, я потратил час времени и баг этот пофиксил — фикс очень простой, на две строчки: <div style="height: 150px; overflow: scroll"><source lang="diff">--- hgsubversion/pushmod.py 2009-11-18 21:04:05.697192616 +0300+++ hgsubversion/pushmod.py 2009-11-26 04:14:39.000000000 +0300@@ -158,7 +158,7 @@ def commit(ui, repo, rev_ctx, meta, base file_data[file] = base_data, new_data, action  def svnpath(p):- return ('%s/%s' % (branch_path, p)).rstrip('/')+ return ('%s/%s' % (branch_path, p)).strip('/')  changeddirs = [] for d, v1, v2 in extchanges:@@ -181,7 +181,7 @@ def commit(ui, repo, rev_ctx, meta, base  new_target_files = [svnpath(f) for f in file_data] for tf, ntf in zip(file_data, new_target_files):- if tf in file_data:+ if tf in file_data and tf != ntf: file_data[ntf] = file_data[tf] if tf in props: props[ntf] = props[tf]</source></div> Поэтому итоговая оценка почти не снижается. Тем не менее, грабли можно расценить как показатель некой «сырости» продукта. Об этом всё-таки надо помнить.
Остальные два экстенжна «нинужны»: <tt>hgsvn</tt> — нечто более старое, работает сбоку от общего механизма, тоже позволяет делать push и pull, но не клонирует весь репозиторий, а только извлекает (checkout’ит) последнюю версию, чтобы далее можно было использовать Subversion и Mercurial вместе. Ну и конечно, оно не совместимо с <tt>hgsubversion</tt>. <tt>convert</tt> же предназначен для конвертации истории проекта из нескольких различных систем контроля версий в Mercurial, ни черта не совместим ни с <tt>hgsvn</tt>, ни с <tt>hgsubversion</tt> и не сохраняет граф ветвлений. Зато, правда, поддерживает возможность использования других имён поддиректорий <tt>trunk/branches/tags</tt>.

Навигация