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

C-x v u также нужна для разблокирования  файла, когда вы блокировали его, а потом решили не изменять.

Чтобы  отменить уже  зафиксированное  изменение, используйте  C-x v c  (vc-cancelversion).  Эта команда сбрасывает все записи о последней фиксированной  версии. C-x v c также  предлагает вернуть ваш рабочий файл и буфер к предыдущей версии (к  той, что предшествовала удаляемой).

Если вы отвечаете no, VC сохраняет ваши изменения в буфере и блокирует файл. Такая возможность полезна, когда вы зафиксировали  изменение, а затем обнаружили в нем тривиальную ошибку; вы можете отменить фиксирование, исправить ошибку и снова зафиксировать файл.

Когда C-x v c не возвращает  буфер, она вместо этого сворачивает все заголовки  версий (см. Раздел 14.7.8.3 [Заголовки версии], с. 128). Это делается по той причине, что буфер больше не соответствует  никакой существующей версии. Если вы снова зафиксируете его, заголовки будут раскрыты правильно относительно нового номера версии.

Однако, автоматически свернуть заголовок RCS ‘$Log$’ невозможно. Если вы пишете  этот заголовок, вы должны свернуть его вручную — удалив вхождение для версии, которую вы отменили.

Будьте осторожны при вызове C-x v c, так как при этом легко потерять много работы. Чтобы помочь вам не допустить ошибки, эта команда всегда требует подтверждения с yes.  Обратите  внимание также  на то, что эта команда выключена под CVS, поскольку там отмена версий очень опасна и не рекомендуется.

14.7.5.4  Dired  под VC

Когда  вы работаете  над большой программой, часто бывает полезно узнать, какие файлы были изменены в пределах целого дерева каталогов, или просмотреть статус всех файлов с управлением версиями одновременно и произвести какие-то операции над версиями для набора файлов. Вы можете использовать команду C-x v d (vc-directory), чтобы создать распечатку каталога, который включает только файлы, имеющие отношение к системе управления версиями.

C-x v d создает буфер, использующий режим VC Dired.   Он выглядит как  обычный буфер Dired (см.  Глава 28 [Dired], с. 291); однако, как правило в нем показаны только стоящие упоминания файлы (блокированные или необновленные). Это называется сжатым показом.  Если вы установите  переменную vc-dired-terse-display  равной nil,  то VC Dired показывает все относящиеся к делу файлы — те, что находятся под контролем системы управления версиями, плюс все подкаталоги (полный показ). Команда v t в буфере VC Dired переключает между сжатым и полным показом (см.  Раздел 14.7.5.5 [Команды VC Dired], с. 123).

По умолчанию VC Dired производит рекурсивую распечатку заслуживающих упоминания или релевантных  файлов в заданном каталоге и ниже. Вы можете изменить это, устанавливая переменную vc-dired-recurse равной nil;  тогда VC Dired показывает только файлы текущего каталога.

Строка для отдельного файла показывает состояние версии на месте числа жестких ссылок, владельца,  группу  и размер файла. Если файл не изменен, синхронизирован с мастер-файлом, статус версии пуст.  Иначе он состоит из текста в круглых  скобках. Под RCS и SCCS показывается имя пользователя, блокировавшего этот файл; под CVS используется сокращенная версия вывода ‘cvs status’. Вот пример с использованием RCS:

/home/jim/project:

-rw-r-r(jim)        Apr   2 23:39  file1

-r-r-r             Apr   5 20:21  file2

Файлы ‘file1’ и ‘file2’ находятся под управлеием RCS, ‘file1’ блокировал пользователь

jim, а ‘file2’ неблокирован.

Вот пример с использованием CVS:

/home/joe/develop:

-rw-r-r(modified) Aug  2   1997 file1.c

-rw-r-r               Apr   4 20:09  file2.c

-rw-r-r(merge)       Sep 13   1996 file3.c

Здесь ‘file1.c’ изменен по отношению к репозиторию, а ‘file2.c’ не изменен.  ‘file3.c’ изменен,  но в репозитории были также  зафиксированы другие изменения — вам нужно объединить их в рабочем файле перед фиксированием.

Когда  VC  Dired показывает подкаталоги (в режиме “полного” показа), он опускает некоторые из них, которые никогда не могут содержать файлов под контролем системы управления версиями. По умолчанию это включает каталоги, создаваемые этими системами, такие как ‘RCS’ и ‘CVS’; вы можете настраивать это, устанавливая переменную vcdirectory-exclusion-list.

Вы можете подобрать подходящий формат VC Dired, набрав C-u C-x v d — как в обыч-

ном Dired, что позволяет вам указывать дополнительные ключи для команды ls.

14.7.5.5  Команды VC Dired

Все обычные команды Dired работают как всегда и в режиме VC Dired, за исключением v, которая переопределена как префикс управления версиями. Вы можете вызывать команды VC, такие как vc-diff и vc-print-log, набирая v = или v l и так далее. Большинство этих команд применяются к имени файла на текущей строке.

Команда v v (vc-next-action) обрабатывает все помеченные файлы, так что вы можете заблокировать или зафиксировать  несколько файлов  одновременно. Если она работает более чем с одним файлом, то обрабатывает каждый файл в соответствии с его статусом; таким образом, она может блокировать один файл, но зафиксировать другой.  Возможно, это смутит вас; но вы вольны избежать путаницы, помечая набор файлов с одним и тем же статусом.

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

Вы можете в любое время переключаться  между сжатым показом (только блокированные или необновленные файлы) и полным показом, набирая v t vc-dired-toggle-tersemode. Есть также особая команда * l (vc-dired-mark-locked), которая помечает все заблокированные в данный момент файлы (или, для CVS, все необновленные).   Таким образом, набор * l t k — это другой способ удалить из буфера все файлы, кроме тех,  что сейчас заблокированы.

14.7.6  Множество ветвей  файла

Одно из применений управления версиями — сопровождение нескольких “текущих” версий файла. Например, у вас могло бы быть несколько разных версий программы, в которой вы постепенно  добавляли различные незавершенные новые возможности. Каждая независимая линия разработки называется ветвью.  VC позволяет вам создавать ветви, переключаться между  разными ветвями и вливать изменения из одной ветви в другую. Пожалуйста, заметьте однако, что такие ветви на данный момент поддерживаются только для RCS.

Главная линия развития файла обычно называется стволом.  Версии ствола обычно нумеруются как 1.1, 1.2, 1.3, etc. На любой из этих версий вы можете начать независимую ветвь. Ветвь, начинающаяся на версии 1.2 имела бы номер 1.2.1.1, а последующие версии этой ветви имели бы номера 1.2.1.2, 1.2.1.3, 1.2.1.4 и так далее.  Если есть вторая ветвь, также начинающаяся на версии 1.2, она состояла бы из версий 1.2.2.1, 1.2.2.2, 1.2.2.3, etc.

Если вы опускаете последний компонент в номере версии, это называется номером ветви.  Он ссылается на самую верхнюю существующую версию этой ветви — ее головную версию. Ветви в примере выше имеют номера 1.2.1 и 1.2.2.

14.7.6.1  Переключение между ветвями

Чтобы переключиться между  ветвями, введите C-u C-x C-q и укажите  номер версии, который вы хотите выбрать. Тогда к этой версии делается обращение в неблокированном (защищенном от записи) режиме, так что вы можете просмотреть ее перед блокированием. Переключение ветвей таким способом допускается  только тогда, когда файл блокирован.

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

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

14.7.6.2  Создание  новых  ветвей

Чтобы создать новую ветвь из головной версии (последней в своей ветви), сначала выберите эту версию, если необходимо, заблокируйте ее командой C-x C-q и делайте нужные вам изменения. Затем, когда вы фиксируете  изменения, используйте  C-u C-x C-q.  Это позволит вам задать номер для новой версии. Вы должны задать подходящий  номер для ветви, отходящей от текущей версии. Например, если текущая версия — 2.5, то номер ветви должен быть 2.5.1, 2.5.2 и так далее в зависимости от номеров существующих ветвей в этой точке.

Чтобы создать новую ветвь от более старой версии (той, что уже не является головной в ветви), сначала выберите эту версию (см. Раздел 14.7.6.1 [Переключение ветвей], с. 124), затем заблокируйте ее с помощью C-x C-q. Когда вы блокируете старую версию, вас попросят подтвердить, что вы действительно имели в виду создание новой ветви, — если вы ответите нет, вам предоставят возможность блокировать вместо этого последнюю версию.

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

После того как ветвь создана, вы “остаетесь” в ней. Это означает, что последующие фиксирования создают новые версии в этой ветви. Чтобы покинуть ветвь, вы должны явно выбрать другую  версию с помощью C-u C-x C-q.  Чтобы перенести  изменения из одной ветви в другую, используйте команду объединения, описанную в следующем разделе.

14.7.6.3  Объединение  ветвей

Когда вы закончили изменения в конкретной ветви, вам часто будет нужно внести их в главную линию разработки файла (ствол).  Это нетривиальная процедура, потому что в стволе тоже могло идти развитие, поэтому вы должны объединить изменения с файлом, который уже  был изменен иначе.  VC позволяет вам сделать это (и другие вещи) при помощи команды vc-merge.

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

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

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

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