Перед тем как продолжить, вам нужно немного узнать о том, как идентифицировать отдельную правку в хранилище. Как вы узнали в «Правки» правка представляет собой «снимок» хранилища в конкретный момент времени. По мере продолжения фиксаций и увеличения хранилища вам потребуется механизм для идентифицированния этих снимков.
Для указания этих правок используется ключ
--revision
(-r
) плюс нужная
правка; также можно указать диапазон правок, разделяя начало и конец
диапазона двоеточием:
(svn --revision REV1:REV2). Subversion
позволяет обращаться к правкам по номеру, ключевому слову или
дате.
Когда вы создаете новое хранилище Subversion, оно получает номер правки "ноль", каждая последующая фиксация увеличивает этот номер на единицу. Каждый раз по завершении фиксации клиент Subversion сообщает вам новый номер правки:
$ svn commit --message "Corrected number of cheese slices." Sending sandwich.txt Transmitting file data . Committed revision 3.
В будущем, в любой момент времени, если вам нужно будет сослаться на эту правку (как и почему может возникнуть такая необходимость, будет видно дальше по тексту) вы можете сослаться на нее как на «3».
Subversion клиент понимает определенное количество
ключевых слов правок. Эти ключевые слова
могут быть использованы в место цифровых аргументов в параметре
--revision
и будут преобразованы Subversion
в конкретные номера правок:
В каждом каталоге рабочей копии есть служебный
подкаталог .svn
. Для каждого файла в
каталоге Subversion сохраняет копию этого файла в
служебной папке. Эта копия является немодифицированной
(без раскрытия ключевых слов, без преобразования концовок строк,
без чего-либо другого) копией файла какой он есть в последней
правке (названой «BASE») до которой вы обновили
его в вашей рабочей копии. Мы обращаемся к этому файлу, как
к первоисточнику или
базовой версии вашего файла; он всегда
является точной побайтовой копией файла, находящегося в
хранилище.
Последняя правка хранилища
«Исходная» правка элемента в рабочей копии.
Последняя правка, в которой элемент изменялся в диапазоне до
(или включая) BASE
.
Правка, предшествующая последней
правке, в которой элемент был изменен. (Технически,
COMMITTED
- 1.)
PREV
, BASE
и
COMMITTED
могут использоваться при обращении по
локальным путям, но не по URL.
Ниже приведено несколько примеров использования ключевых слов правок. Не волнуйтесь, если смысл команд пока не понятен; в дальнейшем мы объясним эти команды:
$ svn diff --revision PREV:COMMITTED foo.c
# показать последнее изменение зафиксированное для foo.c
$ svn log --revision HEAD
# показать лог для последней фиксации хранилища
$ svn diff --revision HEAD
# сравнить ваш рабочый файл (с учетом локальных изменений)
# с последней правкой в хранилище
$ svn diff --revision BASE:HEAD foo.c
# сравнить ваш «исходный» foo.c (без учета локальных
# изменений) с последней версией в хранилище
$ svn log --revision BASE:HEAD
# показать все логи фиксаций со времени вашего последнего обновления
$ svn update --revision PREV foo.c
# отменить последние изменения в foo.c
# (рабочая правка foo.c понижается)
Эти ключевые слова позволят вам выполнять многие часто используемые (и полезные) операции без необходимости обращаться к конкретным номерам правок или точно помнить номер правке своей рабочей копии.
Везде, где вы указываете номер правки или ключевое слово, вы так же можете использовать и дату, указав ее в фигурных скобках «{}». Вы даже можете получить доступ к диапазону изменений в хранилище, указывая даты и номера правок одновременно!
Вот примеры форматов, используемых для указания даты, которые принимает Subversion. Не забывайте использовать кавычки при написании даты, содержащей пробелы.
$ svn checkout --revision {2002-02-17} $ svn checkout --revision {15:30} $ svn checkout --revision {15:30:00.200000} $ svn checkout --revision {"2002-02-17 15:30"} $ svn checkout --revision {"2002-02-17 15:30 +0230"} $ svn checkout --revision {2002-02-17T15:30} $ svn checkout --revision {2002-02-17T15:30Z} $ svn checkout --revision {2002-02-17T15:30-04:00} $ svn checkout --revision {20020217T1530} $ svn checkout --revision {20020217T1530Z} $ svn checkout --revision {20020217T1530-0500} …
Когда вы указываете в качестве правки дату, Subversion найдет правку наиболее соответствующую запрошенной дате:
$ svn log --revision {2002-11-28} ------------------------------------------------------------------------ r12 | ira | 2002-11-27 12:31:51 -0600 (Wed, 27 Nov 2002) | 6 lines …
Кроме того, вы можете использовать диапазоны дат. Subversion найдет все правки между обеими датами включительно:
$ svn log --revision {2002-11-20}:{2002-11-29} …
Как мы уже говорили, вы можете использовать даты и номера правок одновременно:
$ svn log --revision {2002-11-20}:4040
Пользователи должны осознавать тонкость, которая может стать камнем преткновения при работе с Subversion. Так как временная метка правки сохраняется как свойство правки — как неотслеживаемое, изменяемое свойство правки — временная метка правки может быть изменена, что приведет к искажению истинной хронологии, или даже полной ее потере. Такие действия нарушат работу внутреннего механизма перевода даты в номер правки используемого Subversion.