Изменения

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

301 байт добавлено, 21:57, 19 ноября 2009
Управление патчами
== Управление патчами ==
Первое, что приходит на ум — это, конечно, аналоги [http://savannah.nongnu.org/projects/quilt quilt]'а, работающие поверх DVCS: [http://mercurial.selenic.com/wiki/MqExtension Mercurial Queues](MQ), [https://launchpad.net/bzr-loom Bazaar Loom], [http://www.procode.org/stgit/ StGIT]. Все они очень похожи и друг на друга, и на сам '''quilt'''. MQ и StGIT достаточно развиты и стабильны. bzr-loom же пока находится на стадии развития.
'''quilt''' вещь  — вещь банальная, позволяющая автоматизировать тупое накатывание последовательности большого числа патчей и правку патча, который находится где-то в середине: можно откатить N верхних патчей, внести изменения в файлы и сказать <tt>refresh</tt>, и верхний на данный момент патч (то есть патч откуда-то из середины) обновится, дабы соответствовать внесённым изменениям. '''quilt''' создан на основе скриптов человека, который не использует системы контроля версий — Эндрю Мортона (Andrew Morton) — второго по значимости участника разработки ядра Linux после Линуса Торвальдса.
Из реализаций quilt поверх DVCS первым появился именно '''MQ ''' и долгое время, судя по всему, был «изюминкой» Mercurial’а, хотя на самом деле неидеален — совсем не идеален — идея добавления и удаления истории из/в репозиторий всё-таки странновата, а патчи не хранятся в том же репозитории, что и код — то есть, при клонировании исчезают. Этого недостатка лишены и '''bzr-loom''', и '''StGIT'''.
Крут ли quilt, нет ли — каждый решает сам для себя. Конечно, поддержке Debian-патчей на какой-нибудь Midnight Commander (их там в районе 60-и) quilt очень… помогает. Тем не менее, с моей точки зрения, некорректно закладываться на жёстко последовательное применение всех патчей. На самом деле, такие патчи логично организовывать '''в виде графа ''' (графа зависимостей). Сразу будет видно, что большинство патчей независимы друг от друга, а реально существующие зависимости окажутся на виду.
Таким образом, задачу управления патчами удобнее всего решать, заводя ''по отдельной ветке '' на каждый патч. Причём даже для этого есть даже расширения Mercurial '''[http://arrenbrecht.ch/mercurial/pbranch/ pbranch] ''' (от patch branches) и Git '''[http://repo.or.cz/w/topgit.git TopGit] ''' (от topic branches). Для Bazaar’а подобного расширения, увы, нет.
'''Mercurial''''овский '''pbranch''': хорошо. Умеет весьма немногое. Самые полезные команды — это <tt>pdiff</tt>, <tt>pgraph</tt> и <tt>pmerge</tt>. <tt>pdiff</tt> экспортирует текущий патч '''без его родителей''' в стандартном формате. <tt>pgraph</tt> показывает граф зависимостей патчей, из которого можно, по сути, понять, в какой последовательности их накатывать, если они сами уже экспортированы. Ну и просто вообще граф патчей — это удобно. <tt>pmerge</tt> объединяет изменения, произошедшие в зависимостях патча, в патч.
Другие команды расширения:
;reapply: применить некую уже закоммиченную ревизию в ветку патча.
Чего не хватает (а хочется):
* легко создавать патчи, зависящие от нескольких других.