Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
hgbook.pdf
Скачиваний:
52
Добавлен:
17.03.2015
Размер:
3.15 Mб
Скачать

Глава 4. За кулисами

В отличии от многочисленных систем контроля версий концепция Mercurial достаточно проста, чтобы понять, как в действительности работает программа. Эти знания, безусловно, не являются необходимыми, но я считаю, что полезно иметь «мысленную модель» того, что происходит.

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

В этой главе мы сначала узнаем о внутреннем устройстве Mercurial, а затем обсудим интересные детали его реализации.

4.1. Запись истории в Mercurial

4.1.1. Отслеживание истории одного файла

Когда Mercurial отслеживает изменения файла, он сохраняет историю этого файла в объекте метаданных называемом filelog. Каждая запись в filelog содержит достаточно информации чтобы восстановить одну ревизию отслеженного файла. Filelog'и хранятся в виде файлов в папке .hg/store/data. Они содержат два вида информации: данные о ревизиях и индексы, помогающие Mercurial эффективно искать ревизии.

Для большого или имеющего длинную историю файла filelog хранится раздельно в файлах с данными (расширение «.d») и с индексом (расширение «.i»). Для маленьких файлов с небольшой историей ревизионные данные и индекс хранятся в едином файле с расширением «.i». Связь между файлом в рабочей директории и filelog'ом, который отслеживает его историю в хранилище, показана на Рисунок 4.1, «Связь между файлами в рабочей директории и filelog'ом в репозитории».

Рисунок 4.1. Связь между файлами в рабочей директории и filelog'ом в репозитории

4.1.2. Управление отслеживаемыми файлами

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

4.1.3. Запись информации о ревизиях

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

34

За кулисами

4.1.4. Зависимости между ревизиями

Внутри журнала изменений, манифеста или filelog'а каждая ревизия хранит указатель на своего непосредственного родителя (или на двух родителей, если эта ревизия получена при слиянии). Как я упоминал выше, есть также отношения между ревизиями через эти структуры, и они являются иерархическими по природе.

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

Рисунок 4.2. Взаимосвязь метаданных

35

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]