Как вернуться к предыдущему коммиту в CVS - PullRequest
31 голосов
/ 06 февраля 2012

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

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

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

Ответы [ 5 ]

18 голосов
/ 06 февраля 2012

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

MAKING OLDВЕРСИЯ ТЕКУЩЕЙ ВЕРСИИ

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

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

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

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

10 голосов
/ 06 февраля 2012

Чтобы отменить ревизию одного файла, используйте 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в нечто более современное.

4 голосов
/ 07 декабря 2016

Вот команды.

1) произошла ложная фиксация

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

cvs log file.txt

скажем, 1.25 - последняя версия из-за falseКогда мы сделаем коммит, мы хотим вернуться к его более старой версии 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) Просто чтобы убедиться, что diff использует 1.26 и 1.24тот же самый.

cvs diff -r 1.26 -r 1.24 file.txt 

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

2 голосов
/ 26 апреля 2017

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

Пример:

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

$ cvs update -j1.5 -j1.3 foo.c   # note the order...
1 голос
/ 20 августа 2015

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...