Как вернуться к предыдущей фиксации в CVS
По старым причинам я использую CVS для проекта. Недавно я совершил некоторые изменения, которые нарушили наш код, и мне нужно было их вернуть. Какой CVS-аналог git revert -r <old_revision>
?
Глядя на прошлые вопросы, такие как Как вернуть большие изменения, коммиты CVS не группируют файлы, которые были изменены. Единственный способ вернуться с помощью дат?
Кроме того, какой лучший способ просмотреть прошлые изменения? CVS log выводит слишком много информации, большинство из которых не нужно. Я хочу видеть сообщения фиксации и измененные файлы.
Ответы
Ответ 1
Документацию CVS можно найти здесь, но из этого сайт он сообщает, как вернуть один файл:
СОХРАНЕНИЕ СТАРШЕЙ ВЕРСИИ ТЕКУЩАЯ ВЕРСИЯ
Сохраните версию "oldfile" на что-то еще и проверьте "текущую" версию.
Примечание: вам нужно еще выполнить обновление -A, чтобы получить текущую версию, потому что даже если у вас есть > переименовано "oldfile" тег по-прежнему связан с файлом "oldfile" и не удаляется до > обновления -A.
Затем переименуйте "старую" версию в "текущую" версию.
% mv oldfile oldfile.old.ver
% cvs update -A oldfile
% mv oldfile.old.ver oldfile
% cvs commit -m "возврат к версии 1.5" oldfile
Теперь вы можете продолжить проверку, редактирование и передачу файла как обычно.
Это не будет обрабатывать многие файлы рекурсивно, но, надеюсь, поможет.
Ответ 2
Чтобы отменить ревизию одного файла, используйте 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.
Затем он дает несколько способов указать версию или диапазон исправлений для удаления.
Как говорится, это может быть довольно опасно; он удаляет информацию из репозитория, что обычно является тем, что пытается предотвратить система контроля версий.
Если вам не нужно менять историю, как это, просто возьмите копию старой версии и проверьте ее поверх плохой ревизии, как предлагает Dave M.
И вы правы, акцент CVS на отдельные файлы; более современные системы, как правило, подчеркивают состояние всего хранилища.
Пока все это позволяет обрабатывать только один файл за раз.
Но вы можете проверить весь модуль на указанную дату в отдельный каталог (cvs checkout -D date
), а затем скопировать файлы поверх текущей копии модуля и проверить все. Если вы это сделаете, убедитесь, что сделать "cvs diff", чтобы вы точно знали, какие изменения вы делаете.
Я не знаю, как лучше получить более краткий журнал. cvs log
без аргументов дает вам журнал для каждого файла, а не в хронологическом порядке. cvs log filename
дает вам журнал для указанного файла, но не относится к другим файлам, которые могут быть изменены в одно и то же время. Лично я мог бы подумать над написанием Perl script, который собирает информацию, напечатанную cvs log
, и переупорядочивает ее для отображения, но это, вероятно, больше работы, чем вам интересно.
Есть инструменты для импорта репозиториев CVS во что-то более современное.
Ответ 3
Вот команды.
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) Чтобы убедиться, что diff отличается тем, что 1.26 и 1.24 являются одинаковыми.
cvs diff -r 1.26 -r 1.24 file.txt
Если все вышеописанные шаги верны, diff не будет показывать разницы.
Ответ 4
Также, как и возврат по дате, вы можете вернуться с помощью тега, если отмечен набор файлов, на которые вы хотите вернуться.
У меня было то, что я думаю, это аналогичная ситуация, и я сделал следующее, которое повлияло на всю папку, а не на файл:
- cvs экспортирует "старую версию" по тегу (или вы можете сделать это по дате) в новую папку
- убедитесь, что "текущая версия" проверена, обновлена и доступна.
- скопируйте файлы из старой версии в папку с текущей версией
- зафиксировать результат с подходящим комментарием
Этот подход нуждается в изменении, если какие-либо файлы были добавлены/удалены между старой версией и текущей версией.
История CVS покажет реверсию.
Ответ 5
cvs update -j 1.6 -j 1.5 Filename.java