如何恢复到CVS中的先前提交

时间:2012-02-05 23:12:23

标签: cvs legacy

由于遗留原因,我在项目中使用CVS。最近我做了一些改变,破坏了我们的代码,我需要将它们还原。什么是CVS的模拟git revert -r <old_revision>

查看过去的问题,例如How to revert big change,CVS提交不会对已更改的文件进行分组。是使用日期还原的唯一方法吗?

此外,查看过去更改的最佳方式是什么? CVS日志输出太多信息,其中大部分都是不必要的。我想看到提交消息和更改的文件。

5 个答案:

答案 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导出旧版本&#39;按标签(或您可以按日期执行)到新文件夹
  • 确保当前版本&#39;已签出,更新并生效
  • 将旧版本的文件复制到当前版本的文件夹
  • 使用合适的评论提交结果

如果在旧版本和当前版本之间添加/删除了任何文件,则需要修改此方法。

CVS历史记录将显示回归。