当前位置:  开发笔记 > 运维 > 正文

如何恢复CVS的重大变化?

如何解决《如何恢复CVS的重大变化?》经验,为你挑选了1个好方法。

我的一位同事完全搞砸了我们主CVS存储库中目录的内容.我需要将整个模块恢复到去年年底的状态.请问CVS命令是什么?

他添加并删除了数百个文件,因此简单的"复制旧签出和提交文件"是不够的.

我有RTFM和STFW,我试过这个:

cvs co modulename  # Note no -P option
cvs up -jHEAD -jMAIN:2008-12-30 modulename

但这不起作用 - 他创建的新文件被删除,但旧的文件和目录不会被复活.(我没有承诺).

我可以为此编写一个shell脚本,但是这个功能肯定已经在CVS了吗?

更新:一些澄清:

我可以在特定日期获得模块的本地结账.问题是如何将其重新纳入CVS.

我确实有备份,但使用像CVS这样的修订控制系统的要点是它应该很容易获得任何历史状态.下次发生这样的事情时,我可能没有足够的幸运能够备份(例如备份是每天,所以我可能会失去一天的工作).

我知道CVS已经老了,我们应该转向更新的东西.但是在拥有大量基于CVS的工具(结账和构建脚本,夜间构建服务器等)的大型团队中,此类迁移的时间成本相当可观.(评估,更新脚本,测试,迁移,培训,丢​​失开发人员时间,并行维护两个系统,因为旧分支仍然需要CVS).因此,这必须由管理层规划和安排.

更新#2:我将在此开始赏金. 要获得赏金资格,您必须解释如何使用普通的CVS命令恢复,而不是使用hacky shell脚本.

更新#3:服务器是CVS 1.12.13.通过pserver访问.我可以在Linux PC上使用相同版本的CVS,或在Windows上使用CVSNT 2.0.51d客户端.



1> Ralph..:

实际上,您的初始方法非常接近解决方案.问题是,基于日期的加入不能正确处理已删除的文件和目录.您需要先为要加入的代码库设置标记:

mkdir code_base1 && cd code_base1
cvs co -D "2008-12-30" modulename
cvs tag code_base_2008_12_30

现在做基于连接标记,减去现在和2008-12-30之间的所有变化:

cd .. && mkdir code_base2 && cd code_base2
cvs co modulename
cvs update -d -j HEAD -j code_base_2008_12_30  # use -d to resurrect deleted directories

比较code_base1和code_base2的内容.它们应该是相同的,除了CVS元信息.最后将代码提交到2008-12-30作为新的HEAD:

cvs commit -m "Revert all changes this year"

请注意,标记您希望加入的代码不起作用,因为当使用-D时,rtag也无法正确处理已删除的文件和目录:

cvs rtag -D "2008-12-30" code_base_2008_12_30 modulename

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有