it-roy-ru.com

Как вернуться к предыдущей фиксации в CVS

По прежним причинам я использую CVS в проекте. Недавно я внес некоторые изменения, которые нарушили наш код, и мне нужно было их отменить. Что такое CVS-аналог git revert -r <old_revision>?

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

Кроме того, каков наилучший способ просмотреть прошлые изменения? Журнал CVS выводит слишком много информации, большая часть которой не нужна. Я хочу видеть сообщения о коммитах и ​​измененные файлы.

31
Fiona T

Документацию CVS можно найти здесь , но с этого сайта он рассказывает, как восстановить один файл:

ИЗГОТОВЛЕНИЕ СТАРЫХ ВЕРСИЙ ТЕКУЩЕЙ ВЕРСИИ

Сохраните версию «oldfile» в другом месте и проверьте «текущую» версию.
Примечание: вы все равно должны выполнить обновление -A, чтобы получить текущую версию, потому что даже если вы переименовали>
Тег «oldfile» по-прежнему связан с файлом «oldfile» и не удаляется до тех пор, пока не будет выполнено обновление> -A. 

Затем переименуйте «старую» версию в «текущую» версию.
% mv oldfile oldfile.old.ver
% cvs update -Aldfile
% mv oldfile.old.ver oldfile
% cvs commit -m "возврат к версии 1.5" oldfile 

Теперь вы можете продолжить проверку, редактирование и фиксацию файла в обычном режиме.

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

18
Dave M

Чтобы вернуть ревизию одного файла, используйте cvs admin -o.

Подробности смотрите в документации CVS (info cvs, если вы работаете в Unix-подобной системе), или смотрите эту ссылку .

Цитирование из руководства:

`-oRANGE'
     Deletes ("outdates") the revisions given by RANGE.

     Note that this command can be quite dangerous unless you know
     _exactly_ what you are doing (for example see the warnings below
     about how the REV1:REV2 syntax is confusing).

     If you are short on disc this option might help you.  But think
     twice before using it--there is no way short of restoring the
     latest backup to undo this command!  If you delete different
     revisions than you planned, either due to carelessness or (heaven
     forbid) a CVS bug, there is no opportunity to correct the error
     before the revisions are deleted.  It probably would be a good
     idea to experiment on a copy of the repository first.

Затем он дает несколько способов указать ревизию или диапазон ревизий для удаления.

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

Если вам не нужно изменять историю, как это, просто возьмите копию старой версии и отметьте ее поверх плохой ревизии, как предполагает ответ Дейва М.

И вы правы, CVS делает упор на отдельные файлы; более современные системы имеют тенденцию подчеркивать состояние всего хранилища.

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

Но вы можете извлечь весь модуль по состоянию на указанную дату в отдельный каталог (cvs checkout -D date), затем скопировать файлы поверх текущей копии модуля и проверить все. Если вы это сделаете, обязательно выполните команду "cvs" diff ", чтобы вы точно знали, какие изменения вы делаете.

Я не знаю, как получить более краткую информацию о журнале. cvs log без аргументов выдает журнал для каждого файла, а не в хронологическом порядке. cvs log filename предоставляет вам журнал для указанного файла, но не связывает его с другими файлами, которые могли быть изменены одновременно. Лично я мог бы подумать о написании сценария Perl, который собирает информацию, напечатанную с помощью cvs log, и переупорядочивает ее для отображения, но это, вероятно, больше работы, чем вам интересно.

Существуют инструменты для импорта репозиториев CVS в нечто более современное.

10
Keith Thompson

Вот команды.

1) ложный коммит случается 

2) проверьте его последнюю версию.

cvs log file.txt

допустим, 1.25 является последней версией из-за ложного принятия, поэтому мы хотим вернуться к своей старой версии 1.24.

3) Итак, давайте идти дальше, как показано ниже.

cvs update -r 1.24 file.txt // checkout older version
cp file.txt old.txt // create backup
cvs update -A file.txt // again move to latest one
cp old.txt file.txt // replace old to at latest one.
cvs status file.txt // It will shows as locally modified.
cvs commit -m "Reverting false commit"  file.txt
cvs log file.txt // new 1.26 will be created.

4) Просто чтобы убедиться, что различия между 1.26 и 1.24 одинаковы.

cvs diff -r 1.26 -r 1.24 file.txt 

Если все вышеперечисленные шаги верны, то diff не покажет разницы.

4
Jeegar Patel

С двумя опциями -j CVS объединит изменения между двумя соответствующими ревизиями. 

Пример:

Если файл @file {foo.c} основан на ревизии 1.6 и вы хотите удалить изменения, сделанные между 1.3 и 1.5, вы можете сделать следующее:

$ cvs update -j1.5 -j1.3 foo.c   # note the order...
1
Vijay Shetty

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

У меня была похожая ситуация, и я сделал следующее, что повлияло на всю папку, а не на файл за файлом:

  • cvs экспортирует «старую версию» по тегу (или вы можете сделать это по дате) в новую папку
  • убедитесь, что «текущая версия» извлечена, обновлена ​​и доступна
  • скопируйте файлы из старой версии в папку с текущей версией
  • зафиксируйте результат подходящим комментарием

Этот подход потребует модификации, если какие-либо файлы были добавлены/удалены между старой версией и текущей версией.

История CVS покажет реверсию.

1
sparklewhiskers