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

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

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

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


person Fiona T    schedule 05.02.2012    source источник
comment
+1. Хороший вопрос. Добро пожаловать в SO.   -  person Joseph Quinsey    schedule 06.02.2012


Ответы (5)


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

СОЗДАНИЕ СТАРОЙ ВЕРСИИ ТЕКУЩЕЙ ВЕРСИИ

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

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

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

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

person Dave M    schedule 05.02.2012
comment
Привет, Дэйв, спасибо за ответ. Я закончил тем, что использовал cvs update -j ‹current rev› -j ‹old rev› ‹filename›, чтобы вернуться, вы знаете, в чем разница между этими методами? - person Fiona T; 06.02.2012
comment
@FionaT, они практически одинаковы. Метод, описанный в моем ответе, просто заменяет рабочую копию старой ревизией, которую вы затем фиксируете как следующую ревизию. Используя метод «соединения», CVS выполняет всю работу за вас, сравнивая две ревизии и создавая патч, который фиксирует различия между двумя ревизиями и затем применяет его к локальному файлу. Обратите внимание (я уверен, что вы знаете), что вам все равно нужно зафиксировать локальный файл после использования метода соединения, который вы использовали. - person Dave M; 06.02.2012

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

Но ответ Дэйва М, вероятно, вам нужен.

Я должен подчеркнуть (пересматривая этот ответ через 8 лет после того, как я впервые его написал), что это не эквивалентно git revert. Команда git revert создает новую фиксацию, которая отменяет эффект предыдущей фиксации. Команда 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 в нечто более современное.

person Keith Thompson    schedule 05.02.2012
comment
О, я не знал об удалении подмножества исправлений. Звучит опасно, особенно с учетом того, что репозиторий мне не принадлежит. Хотя может быть интересно поиграть! Вы знаете, часто ли люди используют это на практике? - person Fiona T; 10.02.2012
comment
@PoC Это удивительно. Конечно cvs admin -o... опасно, но это особенность CVS. Если вам это нужно, вы всегда можете собрать CVS из исходного кода. (Я вижу отрицательный голос примерно в то же время, что и ваш комментарий, что кажется странным. Я всегда могу обновить ответ этой информацией.) - person Keith Thompson; 22.04.2020
comment
@PoC Я только что попробовал cvs admin -o... на Debian 10 buster (CVS 1.12.13-MirDebian-27), и это сработало. Можете ли вы предоставить доказательства того, что это недопустимый вариант? - person Keith Thompson; 22.04.2020
comment
Нет, не могу. Я не нашел -o на странице руководства, но, возможно, я слишком торопился. Я удалю свои комментарии завтра, чтобы не создавать путаницы. Голос против - потому что мне больше всего нравится метод Виджая Шетти. Ответ короткий и лаконичный, и он действительно помог мне, в то время как другие ответы здесь были громоздкими с переименованием, удалением и многим другим. - person PoC; 24.04.2020

Вот команды.

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 

Если все вышеперечисленные шаги верны, разница не будет отображаться.

person Jeegar Patel    schedule 07.12.2016

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

Пример:

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

$ cvs update -j1.5 -j1.3 foo.c   # note the order...
person Vijay Shetty    schedule 26.04.2017
comment
Это самое простое и прямое решение. Никакого перемещения, копирования или переименования файлов - позвольте VCS делать то, для чего она создана. Никаких множественных команд - только одна релевантная. Синтаксис с обоими номерами ревизий отражает синтаксис diff, который прекрасно работает, потому что с ним вы можете точно увидеть, что будет делать ваш откат. Поменяйте местами номера ревизий, и вы вернете свои изменения; полезно, когда кто-то просит вас что-то вынуть, а затем, в последнюю минуту, вы все-таки положили это. - person Brandon Essler; 06.11.2019

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

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

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

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

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

person sparklewhiskers    schedule 20.08.2015