由于遗留原因,我在项目中使用CVS。最近我做了一些改变,破坏了我们的代码,我需要将它们还原。什么是CVS的模拟git revert -r <old_revision>
?
查看过去的问题,例如How to revert big change,CVS提交不会对已更改的文件进行分组。是使用日期还原的唯一方法吗?
此外,查看过去更改的最佳方式是什么? CVS日志输出太多信息,其中大部分都是不必要的。我想看到提交消息和更改的文件。
答案 0 :(得分:18)
可以找到here的CVS文档,但是从site它可以了解如何还原单个文件:
使旧版本成为当前版本
将“oldfile”的版本保存到其他内容并查看“当前”版本 注意:您仍然必须更新-A以获取当前版本,因为即使您有&gt;改名
“oldfile”标签仍然与文件“oldfile”相关联,并且直到&gt;才会删除。更新-A完成。然后将“旧”版本重命名为“当前”版本 %mv oldfile oldfile.old.ver
%cvs update -A oldfile
%mv oldfile.old.ver oldfile
%cvs commit -m“恢复到版本1.5”oldfile您现在可以正常检查,编辑和提交文件。
这不会以递归的方式处理许多文件,但希望有所帮助。
答案 1 :(得分:10)
要退出单个文件的修订版,请使用cvs admin -o
。
有关详细信息,请参阅CVS文档(info cvs
,如果您使用的是类Unix系统),或参阅this link。
从手册中引用:
`-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脚本来收集cvs log
打印的信息并重新排列以供显示,但这可能比您感兴趣的工作更多。
有一些工具可以将CVS存储库导入更现代的东西。
答案 2 :(得分:4)
这是命令。
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将没有显示差异。
答案 3 :(得分:2)
使用两个-j选项,CVS将合并两个相应修订版之间的更改。
示例:强>
如果文件@file {foo.c}基于版本1.6,并且您要删除1.3和1.5之间的更改,则可能会执行以下操作:
$ cvs update -j1.5 -j1.3 foo.c # note the order...
答案 4 :(得分:1)
除了按日期还原之外,还可以按标记还原,如果您想要返回的文件集被标记。
我认为是类似的情况我做了以下影响整个文件夹而不是逐个文件:
如果在旧版本和当前版本之间添加/删除了任何文件,则需要修改此方法。
CVS历史记录将显示回归。