Графы ревизий

Рисунок 4.63. Граф ревизий

Граф ревизий


Иногда вам бывает необходимо узнать, из какого места ствола были созданы ответвления и метки, и идеальный способ просмотра этого типа информации - граф или структура в виде дерева. Именно в этой ситуации применяется TortoiseSVNГраф ревизий

Эта команда анализирует историю ревизий и пытается создать дерево, отображающее точки, в которых были сделаны копии, и где эти ответвления/метки были удалены.

Важно

Для того, чтобы сформировать граф, TortoiseSVN должен извлечь все сообщения журнала из корня хранилища. Не стоит говорить, что это может занять несколько минут, даже когда в хранилище находится всего несколько тысяч ревизий, и зависит от скорости сервера, пропускной способности сети и т.п. Если вы попробуете это на проекте вроде Apache, который сейчас имеет более 500,000 ревизий, вам придётся подождать некоторое время.

Хорошая новость заключается в том, что при использовании кэша сообщений журнала вам придётся подождать единожды. После этого данные журнала хранятся локально. Кэширование сообщений журнала включается в настройках TortoiseSVN.

Узлы графа ревизий

Каждый узел графа ревизий олицетворяет ревизию в хранилище, которая что-либо изменила в отображаемом дереве. Разнотипные узлы различаются формой и цветом. Форма не может быть изменена, а цвет можно задать, используя TortoiseSVNНастройки

Добавленные или скопированные узлы

Элементы, которые были добавлены или созданы путем копирования другого файла/папки показываются в виде закругленного прямоугольника. Цвет по умолчанию зеленый. Метки и стволы (trunks) рассматриваются как особый случай и используют различные тени в зависимости от TortoiseSVNНастройки.

Удалённые узлы

Удаленные элементы, например, больше ненужные ответвления, показываются в виде восьмиугольника (прямоугольник со срезанными углами). По умолчанию красного цвета.

Переименованные узлы

Переименованные элементы также показываются в виде восьмиугольника, но цвет по умолчанию синий.

Верхние ревизии ответвлений

Граф обычно показывает только точки ответвлений, но часто бывает полезно увидеть ещё и соответствующую ведущую ревизию для каждого ответвления. Если выбрать Показать ведущие ревизии, то будет показан каждый узел ведущей ревизии (в эллипсе). Заметьте, что здесь ведущая ревизия имеет смысл последней ревизии, зафиксированной по этому пути, а не ведущей ревизии хранилища.

Ревизия рабочей копии

Если вы вызвали граф ревизий из рабочей копии, то у вас есть возможность показать базовую ревизию на графе при помощи Показать ревизию рабочей копии, обводящее базовый узел толстой рамочкой.

Изменённая рабочая копия

Если вы вызвали граф ревизий из рабочей копии, вы можете показать дополнительный узел, представляющий вашу изменённую рабочую копию, при помощи Показать изменения рабочей копии. Это по умолчанию красный узел в форме эллипса с толстой рамочкой.

Обычный элемент

Все остальные элементы отображаются в виде обычного прямоугольника.

Обратите внимание: по умолчанию граф показывает только те точки, в которых элементы были добавлены, скопированы или удалены. Отображение каждой ревизии проекта породит слишком большой граф для нетривиальных случаев. Если вы действительно желаете увидеть все ревизии, в которых были произведены изменения, то для этого есть специальная опция, расположенная в меню Вид и на панели инструментов.

Вид по умолчанию (группировка выключена) размещает узлы так, чтобы их положение по вертикали было в строгом соответствии с порядком ревизий, и у вас было наглядное представление о том, в какой последовательности что было сделано. Там, где два узла расположены в одной колонке, порядок очевиден. Когда два узла расположены в смежных колонках, смещение довольно мало, поскольку нет необходимости предотвращать перекрытие узлов, и в результате порядок немного менее очевиден. Такого рода оптимизации необходимы, чтобы удержать сложные графы в приемлемых размерах. Имейте ввиду, что размещение по порядку использует край узла с более старой стороны как точку отсчёта, т.е. нижний край узла, когда граф отображается с более старыми узлами снизу. Край, от которого производится отсчёт, важен, так как формы узлов не все одинаковой высоты.

Изменение вида

Поскольку граф ревизий часто получается довольно сложным, есть несколько возможностей, которые могут быть использованы для донастройки способа отображения графа под ваши нужды. Они доступны в меню Вид и в панели инструментов.

Сгруппировать ответвления

При поведении по умолчанию (группировка выключена) все строки сортируются строго по ревизии. В результате долгоживущие ответвления с редкими фиксациями занимают целую колонку всего лишь для нескольких изменений и граф получается слишком широким.

Этот режим группирует изменения по веткам, так что нет глобального порядка ревизий: последовательные ревизии в ветке будут показаны (часто) в упорядоченных строках. Вложенные ветки, тем не менее, упорядочены таким образом, что поздние ветки будут показаны в той же колонке над ранними ветками чтобы сохранить граф стройным. В результате данная строка может содержать изменения из разных ревизий.

Старые сверху

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

Выровнять деревья поверху

Когда граф разбит на несколько меньших деревьев, деревья могут отображаться или в естественном порядке ревизий, или выровненными по нижнему краю окна, в зависимости от того, использовали ли вы опцию Сгруппировать по ответвлениям. А эту опцию применяйте, чтобы все деревья росли наоборот, сверху вниз.

Снизить число пересечений

Эта настройка обычно включена и предотвращает граф от показа со многими пересекающимися линиями. Тем не менее, это может сделать размещение колонок менее логичным, например, по диагонали нежели в колонку, и графу потребуется больше места для отрисовки. Если это для вас проблема, то это можно отключить в меню Вид.

Различающиеся части путей

Длинные имена путей могут занять много места и сделать блоки узлов очень большими. Используйте эту опцию, чтобы отображались только изменённые части пути (общая часть пути будет заменена точками). Например, если вы создали ответвление /branches/1.2.x/doc/html из /trunk/doc/html ответвление может быть показано в компактном виде как /branches/1.2.x/.. поскольку последние два уровня, doc и html, не изменились.

Показать все ревизии

Это делает именно то, что вы ожидаете и показывает каждую ревизию, в которой что-либо (в дереве, граф которого вы строите) было изменено. Для проектов с длинной историей это может порождать действительно громадный граф.

Показать ведущие ревизии

Эта опция обеспечивает отображение в графе самой поздней ревизии каждого ответвления.

Точные источники копирования

Поведение по умолчанию при создании ответвления/метки - показывать ответвление как созданное из последнего узла, где было произведено изменение. Строго говоря, это неточно, поскольку ответвления часто создаются из текущей ведущей ревизии, а не из какой-то конкретной ревизии. Поэтому есть возможность показывать более правильную (но менее полезную) ревизию, которая использовалась для создания копии. Заметьте, что эта ревизия может быть моложе, чем ведущая ревизия исходного ответвления.

Свернуть метки

Когда в проекте много меток, то отображение каждой метки как отдельный узел в графе занимает много места и запутывает более интересную структуру веток разработки. В то же время вам может понадобится просто найти содержание метки, чтобы сравнить ревизии. Эта настройка прячет узлы для меток и вместо этого показывает их во всплывающих подсказках для узла откуда они были скопированы. Значок метки на правой стороне исходного узла обозначет что были сделаны метки. Это очень упрощает обзор.

Обратите внимание, что если сама метка использовалась как источник для копии, возможно, новая ветка на основе метки, то такая метка будет показана отдельным узлом, а не свернутым.

Скрыть удалённые пути

Скрывает пути, которых больше нет в ведущей ревизии хранилища, например, удалённые ответвления.

Если вы выбрали настройку Свернуть метки и затем удаленная ветка, от которой была созданы метки, всё ещё показана, иначе метки исчезнут тоже. Последняя ревизия, для которой была создана метка, будет показана цветом используемым для удаленных узлов, вместо отображения отдельной ревизии удаления.

Если вы выбрали настройку Спрятать метки, эти ветки исчезнут опять, т. к. им не нужно показывать метки.

Спрятать неиспользованные ветки

Скрывает ответвления, в которых не было зафиксировано изменений в соответствующем файле или подпапке. Это необязательно показывает, что ответвление не использовалось, это показывает только то, что не было изменений в этой его части.

Показать ревизию рабочей копии

Выделяет ревизию в графе, соответствующую ревизии обновления элемента, для которого вы строите граф. Если вы только что обновились, это будет ведущая ревизия, но если другие фиксировали изменения с момента, когда вы последний раз обновляли рабочую копию, то она может быть несколькими ревизиями ниже. Узел выделяется толстой рамочкой.

Показать изменения рабочей копии

Если в вашей рабочей копии есть локальные изменения, эта опция нарисует их как отдельный эллиптический узел, связанный с узлом, до которого ваша рабочая копия была последний раз обновлена. Цвет рамки по умолчанию красный. Возможно, вам потребуется обновить граф при помощи F5 для учёта последних изменений.

Фильтр

Иногда в графе содержится больше ревизий, нежели вам необходимо просмотреть. Эта опция в открывающемся диалоговом окне позволяет ограничить диапазон показываемых ревизий, а также скрыть некоторые указанные по имени пути.

Если вы скрываете определенный путь и этот узел имеет узлы-потомки, потомки будут показаны отдельным деревом. Если вы хотите также скрыть всех потомков, то используйте флажок Убирать поддеревья полностью.

Деревья в полосах

Когда граф содержит несколько деревьев, бывает полезно использовать в фоне чередующиеся цвета, чтобы было проще понять, что к какому дереву относится.

Показать обзорное окно

Показывает небольшое изображение всего графа с текущим отображаемым окном в виде прямоугольника, который можно перемещать. Это позволяет передвигаться по графу намного легче. Обратите внимание: для очень больших графов обзорное окно может стать бесполезным из-за чрезмерной степени увеличения и поэтому в этом случае оно показано не будет.

Использование графа

Для того, чтобы легче ориентироваться в большом графе, можно использовать обзорное окно. Оно показывает весь граф в небольшом окне, и текущая показываемая часть в нём выделена. Вы можете перетаскивать зону выделения для изменения отображаемой области.

При прохождении мыши над прямоугольником ревизии во всплывающей подсказке отображаются дата ревизии, автор и сообщение журнала.

Если вы выберете две ревизии (используя Ctrl-левый щелчок), вы можете воспользоваться контекстным меню для просмотра различий между этими ревизиями. Конечно, вы можете выбрать просмотр различий в точках создания ответвлений, но обычно бывает желательно просмотреть различия в конечных точках ответвлений, т.е. в ведущей ревизии.

Вы можете просмотреть различия как файл объединённых различий, который показывает все различия в одном файле с некоторым минимальным контекстом. Если выбрать Контекстное менюСравнить ревизии, появится список измененных файлов. Выполните двойной щелчок на имени файла для извлечения обеих ревизий файла и их сравнения с использованием визуального средства просмотра различий.

После правого щелчка на ревизии вы можете выбрать Контекстное менюЖурнал для просмотра истории.

Вы можете также произвести слияние изменений из выбранных ревизий с другой рабочей копией. При помощи диалога выбора папки можно выбрать рабочую копию, в которой будет проводиться слияние, но после этого не предоставляется ни запроса подтверждения, ни возможности выполнить пробный запуск. Хорошей практикой является производить слияние с неизменённой рабочей копией, чтобы вы смогли отменить изменения, если слияние не сработает как надо! Это полезная возможность, если вы желаете слить выбранные ревизии из одного ответвления в другое.

Учимся читать граф ревизий

Начинающие пользователи могут быть удивлены тем, что граф ревизий отображает нечто, не соответствующее мысленной модели пользователя. Например, если ревизия изменяет несколько копий или ответвлений файла или папки, то будет несколько узлов для этой единственной ревизии. Хорошей привычкой будет начать с самых левых опций в панели инструментов и настраивать граф шаг за шагом, пока он не будет близок к вашей мысленной модели.

Все опции фильтров стараются терять настолько мало информации, насколько это возможно. Это может привести к тому, что некоторые узлы поменяют свой цвет, например. Всякий раз, когда результат оказывается неожиданным, отмените последнее применение фильтра и попробуйте понять, что такого особенного в данной ревизии или ответвлении. В большинстве случаев, изначально ожидаемый результат применения фильтра будет или неточным, или обманчивым.

Обновление вида

Если вы желаете вновь запросить сервер на предмет новой информации, вы можете просто обновить вид при помощи F5. Если используется кэширование журнала (по умолчанию включено), то хранилище будет проверено на наличие более новых фиксаций и будут загружены только они. Если кэш журнала работает в автономном режиме, то будет произведена попытка переключиться обратно в оперативный режим.

Если вы используете кэширование журнала, и вы думаете, что содержимое сообщения или его автор были изменены, вы должны воспользоваться диалогом журнала для обновления необходимых сообщений. Поскольку граф ревизий работает, начиная с корня хранилища, будет сделан недействительным весь кэш журнала, и повторное его заполнение может занять очень долгое время.

Подрезка деревьев

В большом дереве может быть трудно ориентироваться, и иногда бывает необходимо скрыть его часть, или разбить его на лес более маленьких деревьев. Если навести мышь на точку, где соединительная линия входит или выходит из узла, то появится одна или несколько кнопок, которые позволяют это сделать.

Щёлкните на кнопке с минусом для сворачивания присоединённого поддерева.

Щёлкните на кнопке с плюсом для разворачивания свёрнутого поддерева. Когда дерево свёрнуто, эта кнопка остаётся видимой, чтобы показать наличие скрытого поддерева.

Щёлкните на кнопке с крестом для отделения присоединённого поддерева и отображения его как отдельного дерева в графе.

Щёлкните на кнопке с кругом, чтобы присоединить отделённое дерево. Когда дерево отделено, эта кнопка остаётся видимой, чтобы показать наличие отдельного поддерева.

Щёлкните на фоне графа для вызова главного контекстного меню, предлагающего опции Развернуть все и Соединить все. Если ещё ни одно ответвление не было свёрнуто или отделено, контекстное меню не показывается.