Работа  с файлами – ЧАСТЬ 8

C-x v m (vc-merge)

Вливает изменения в рабочий файл.

C-x v m  (vc-merge) берет набор изменений и вливает их в текущую версию рабочего файла. Сначала она спрашивает у вас номер ветви или пару номеров версий в минибуфере.  Затем она находит отличия от этой ветви или между  двумя заданными версиями и объединяет их в текущей версии текущего файла.

В качестве примера предположим, что вы завершили некоторое добавление  в ветви

1.3.1. Тем временем разработка ствола продвинулась до версии 1.5. Чтобы влить измене-

ния в ствол, сначала перейдите в головную версию ствола, набрав C-u C-x C-q RET. Версия

1.5 теперь стала текущей. Если для этого файла используется блокирование, наберите C-x

C-q для блокирования  версии 1.5, чтобы вы могли ее изменять. Затем наберите C-x v m

1.3.1 RET.  Это возьмет весь набор изменений в ветви 1.3.1 (относительно  версии 1.3, где ветвь была начата, и до самой последней версии этой ветви) и вливает их в текущую версию рабочего файла. Теперь вы можете зафиксировать  измененный  файл, созадвая таким образом версию 1.6, содержащую изменения из ветви.

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

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

Когда во время объединения возникают конфликты, VC замечает их, говорит вам о них в эхо-области и спрашивает, хотите ли вы помочь в объединении.  Если вы отвечаете да, VC запускает сеанс Ediff (см. раздел “Ediff ” в The Ediff Manual).

Если вы говорите нет, в файл вставляются  оба конфликтующих изменения, окруженные маркерами конфликта. Пример ниже показывает, как выглядят конфликтующие области; файл называется ‘имя-файла’,  а номер текущей версии в мастер-файле,  где  находятся с изменения пользователя Б — 1.11.

<<<<<<<  имя-файла

Версия пользователя А

=======

Версия пользователя Б

>>>>>>>  1.11

Теперь вы можете  разрешить конфликт, редактируя файл вручную.  Или вы можете напечатать M-x vc-resolve-conflicts после обращения  к  файлу.  Это запускает сеанс Ediff, как описано выше.

14.7.6.4  Многопользовательские разветвления

Часто нескольким разработчикам бывает полезно работать одновременно над различными ветвями файла. CVS позволяет это по умолчанию; в RCS это возможно, если вы создадите несколько исходных каталогов. Каждый исходный каталог должен иметь ссылку  с именем ‘RCS’,  которая указывает на общий каталог с мастер-файлами  RCS. Тогда каждый исходный каталог может хранить собственный набор выбранных версий, но все они разделяют одни общие записи RCS.

Этот  метод работает надежно  и автоматически, при условии, что  исходные файлы содержат заголовки RCS о версии (см.  Раздел 14.7.8.3 [Заголовки версии], с. 128).  Эти заголовки позволяют Emacs всегда точно знать номер версии, присутсвующей в рабочем файле.

Если в файлах нет заголовков версии, вы должны в каждом сеансе явно говорить Emacs, над какой ветвью вы работаете.  Чтобы сделать так, сначала обратитесь к файлу, затем наберите C-u C-x C-q и укажите правильный номер версии. Это должно гарантировать, что Emacs знает, какая ветвь используется во время конкретного сеанса редактирования.

14.7.7  Снимки

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

14.7.7.1  Создание  и использование снимков

Есть две основные команды для работы со снимками; одна создает снимок с заданным именем, а вторая извлекает именованный снимок.

C-x v s имя hRETi

Определяет последние сохраненные версии каждого зарегистрированного файла в текущем каталоге или ниже него как снимок с заданным именем (vc-createsnapshot).

C-x v r имя hRETi

Для всех зарегистрированных  файлов на уровне текущего каталога или ниже выбирает версии, соответствующие снимку с заданным именем (vc-retrievesnapshot).

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

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

Вы можете предоставить в качестве аргумента для C-x v = или C-x v ~ имя снимка (см. Раздел 14.7.4 [Старые версии], с. 120). Таким образом, вы можете использовать это для сравнения снимка с текущими файлами, или двух снимков друг с другом или снимка с заданной версией.

14.7.7.2  Опасные  места при работе со снимками

Работа со снимками в VC смоделирована на основе поддежки именованных конфигураций в RCS. Для нее используются  встроенные  средства RCS, поэтому снимки, сделанные под VC с использованием RCS, видны, даже когда вы обходите VC.

Для SCCS, VC  реализует снимки сама.  Используемые  ей файлы содержат тройки имя/файл/номер-версии. Такие снимки видны только через VC.

Снимок — это набор зафиксированных  версий. Поэтому при создании снимка вы долж-

ны убедиться, что все файлы зафиксированы  и неблокированы.

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

Если вы переименовываете зарегистрированный  файл, вам нужно переименовать и его мастер-файл (команда vc-rename-file делает это автоматически). Если вы пользуетесь SCCS, вы должны также обновить записи о снимках, чтобы они ссылались на этот файл по новому имени (vc-rename-file делает и это тоже).  Старый снимок, ссылающийся на мастер-файл, который больше не существует под записанным именем, уже не корректен; VC больше не может извлечь его. Достаточное углубление в подробности об RCS и SCCS для объяснения процесса ручного обновления снимков вышло бы за рамки данного руководства.

Использование vc-rename-file сохраняет корректность снимка для извлечения, но не решает всех проблем. Например, некоторые файлы в программе вероятно ссылаются на другие файлы по именам. По самой меньшей мере, переименованный вами файл упомянут в Make-файле.  Если вы извлекаете старый снимок, переименованный  файл получает свое новое имя, а не то, которое ожидает Make-файл. Поэтому на самом деле программа не заработает в том виде, в каком ее извлекли.

14.7.8  Различные команды и возможности VC

Этот раздел рассказывает о других возможностях VC, применяемых  не столь часто.

14.7.8.1  Журналы изменений  и VC

Если вы используете для программы RCS или CVS и также сопровождаете  файл журнала ее изменений   (см.   Раздел 22.12 [Change Log], с. 224), вы можете  автоматически генерировать вхождения для него из журнальных записей системы управления версиями:

C-x v a      Обращается к журнальному файлу текущего каталога и создает  для зарегистрированных файлов в этом каталоге новые вхождения для версий, зафиксированных позже последнего вхождения в этом журнальном файле (vc-updatechange-log).

Эта команда работает только с RCS или CVS, но не с SCCS.

C-u C-x v a

M-1 C-x v a

Как выше, но находит вхождения только для файла текущего буфера.

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

Для примера предположим, что  первая строка в ‘ChangeLog’  датирована 1999-04-10,

и что  с тех  пор случилось только фиксирование,  сделанное  Натениэлом Боудичем для

‘rcs2log’ 1999-05-22 с журнальной записью ‘Ignore log messages that start with  ‘#’.’.

Тогда C-x v a обращается к ‘ChangeLog’ в вставляет подобный текст:

1999-05-22   Nathaniel Bowditch   <nat@apn.org>

* rcs2log: Ignore  log  messages  that start with  ‘#’.

Теперь вы можете еще отредактировать новое вхождение  в журнал по своему желанию.

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

Обычно вхождение в журнале  для файла ‘foo’  отображается как  ‘* foo: текст вхо

ждения’.   Знак ‘:’  после  ‘foo’  опускается, если текст  вхождения начинается со строки

‘(имяфункции): ’. Например, если вхождение для ‘vc.el’ такое: ‘(vc-do-command):  Check call-process status.’, то текст в ‘ChangeLog’ выглядит как:

1999-05-06   Nathaniel Bowditch   <nat@apn.org>

* vc.el (vc-do-command):  Check call-process status.

Когда  C-x v a добавляет несколько вхождений одновременно, она группирует связан-

ные между собой журнальные записи вместе, если все они зафиксированы одним автором

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

Для ‘vc.texinfo’: ‘Fix  expansion  typos.’

Для ‘vc.el’: ‘Don’t  call expand-file-name.’

Для ‘vc-hooks.el’: ‘Don’t  call expand-file-name.’

В ‘ChangeLog’ они появятся так:

1999-04-01   Nathaniel Bowditch   <nat@apn.org>

* vc.texinfo:  Fix  expansion  typos.

* vc.el, vc-hooks.el:  Don’t  call expand-file-name.

Обычно C-x v a разделяет журнальные записи пустой  строкой,  но вы можете  сделать так, чтобы несколько  связанных  записей сцеплялись вместе (без промежуточной пустой строки), начиная текст каждой из связанных журнальных записей с метки в форме

Источник: Ричард Столмен, Руководство по GNU Emacs

Похожие посты:

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий