Система конкурирующих версий
 
08.07.2003
Андрей Гапанович


 
<< стр. 1
стр. 2

Когда вы извлекаете рабочую версию из хранилища, то по умолчанию выбираются последние версии файлов, если каталог для извлечения пустой. Чтобы извлечь помеченные файлы, необходимо в диалоге на закладке Checkout options поставить галочку By revision/ tag/branch и рядом ввести имя метки. Там же можно указать номер версии вместо метки или извлекать файлы с определенной датой. Но учтите: изменив после такой операции файлы рабочей копии, вы не сможете зафиксировать изменения в хранилище — там уже зафиксированы другие.

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

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

Чтобы создать ответвление, выделите нужные файлы, выберите пункт меню Modify Х Create a branch on selection и введите в диалоговом окне имя ответвления. После этого можете дальше развивать свою программу. Когда возникнет необходимость подправить что-то в предыдущей версии программы, вы сможете извлечь нужные версии файлов, указав имя ответвления там, где указывали имя метки. Теперь файлы можно изменять и фиксировать изменения в хранилище. А главное, что CVS может добавлять их автоматически. Для этого после фиксации изменений ветки нужно очистить рабочий каталог. Выделите его (он помечен галочкой) и выберите пункт меню Trace Х Release selection. В открывшемся диалоге поставьте птичку Remove working copy. Затем извлеките рабочую копию из хранилища, не указывая имя метки или ответвления. Будут извлечены последние версии ваших файлов на главном стволе. Теперь выберите пункт меню Modify Х Update selection и на закладке Merge options поставьте галочку Only this rev./tag, а рядом введите имя ответвления. После этого изменения, сделанные в ответвлении, будут добавлены в основной ствол.

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

<<<<<<< FILENAME
VARIANT1
=======
VARIANT2
>>>>>>> BRANCH_REVISION

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

Теперь рассмотрим ситуацию, когда с кодом работает сразу несколько программистов (для простоты договоримся, что их двое). Каждый из них должен прежде всего извлечь отдельную рабочую копию из хранилища, дабы иметь дело с наиболее свежей версией файлов. По мере редактирования файлов образуется две ветви изменений. Когда один из программистов решит зафиксировать изменения в хранилище, у него не возникнет никаких проблем. Но вот второму CVS не позволит этого сделать, так как своими изменениями он уничтожит те, что сделаны первым программистом. Дабы выйти из такого положения, второму программисту необходимо слить изменения, сделанные им и первым программистом. Для этого нужно выбрать пункт меню Modify Х Update selection. После успешного слияния и разрешения конфликтов он может зафиксировать изменения в хранилище. Теперь уже первый программист не сможет зафиксировать свои дальнейшие модификации без предварительного слияния изменений. Таким образом, над одними и теми же файлами могут работать несколько человек одновременно. Замечу, что при совместной работе необходимо фиксировать изменения как можно чаще, чтобы возникало поменьше конфликтов.

По мере работы над проектом могут появляться новые файлы и удаляться уже существующие. По умолчанию отображаются только те файлы, которые были занесены в хранилище при импорте. Если вы хотите увидеть остальные, следует выбрать другой фильтр (меню View Х File filter). Чтобы поместить новый файл в хранилище, нужно выделить его и выбрать пункт меню Modify Х Add selection или Modify Х Add selection binary, если файл двоичный. Теперь CVS будет сохранять историю и для этого файла. Чтобы удалить ненужный файл, надо выделить его и выбрать меню Modify Х Remove selection. Файл не будет уничтожен, просто CVS отметит, что он больше не используется (однако вы сможете извлечь его более раннюю рабочую копию). Аналогично обстоит дело и с добавленными файлами. Переименовать файл нельзя. Для этого нужно его удалить и затем добавить с новым именем. Тем же макаром можно добавлять и удалять каталоги. (Внимание! Радикально изменить структуру каталогов, в которых находятся файлы, весьма затруднительно, так что продумайте ее заранее.)

2Для каждого файла можно посмотреть его статус, историю, дерево изменений, сравнить две версии, дабы уяснить, чем они отличаются. Выберите пункт меню Query Х Status selection. Там вы можете узнать номер текущей версии, все метки и ответвления файла и посмотреть, каким номерам версий они соответствуют. Для просмотра истории изменений выберите пункт меню Query Х Log selection. При этом в хронологическом порядке можно увидеть информацию о каждой версии файла. Для каждой версии указывается, сколько строк было добавлено и сколько удалено; дата и время фиксации изменений; пояснения, которые были введены при фиксации; имя пользователя, производившего фиксацию; какие ответвления от этой версии существуют. Чтобы сравнить версию файла в рабочем каталоге с версией в хранилище, выберите пункт меню Query Х Diff selection. Вам будут показаны все различия между ними. Если выбрать пункт меню Query Х Graph selection, то можно увидеть все версии файла в виде дерева, ответвления на котором показаны отдельными ветками. Кроме того, на нем указаны все метки, назначавшиеся для файла. Выбрав версию, можно узнать информацию о ней, сравнить ее с текущей версией, извлечь ее из хранилища и т. п. (рис. 2).

Еще одна интересная возможность — подстановка ключевых слов. Например, если в тексте файла встречается строка вида «$Date: …$», то в этом месте будет вставлена дата модификации файла. Таким же способом можно добиться, чтобы в тексте файла присутствовал номер версии, история изменений и др. Я не буду подробно описывать все возможные варианты и их синтаксис. Вы без труда найдете их в справочных файлах. В некоторых случаях подстановка ключевых слов нежелательна — может, строка именно такого вида должна присутствовать в коде и не должна изменяться. Для подобных файлов при импорте нужно указывать Force no keyword expansion, тогда ключевые слова подставляться не будут.

Более подробно о возможностях CVS (и WinCVS) вы можете узнать из справочной системы. Я лишь расшифрую термины, использующиеся в программе:
- repository — хранилище;
- revision — версия;
- tag — метка;
- branch — ответвление.
Русскую версию справки для CVS можно найти, например, на linux.perm.ru/doc/devel/tools/ CVS/cvs-ru_toc.html.



 
<< стр. 1
стр. 2

<<Грабим и режем
Все материалы номера
Красный день календаря >>