2013-07-09 27 views
7

CVS真的让我疯狂!CVS删除粘贴标签没有更新

是否有任何技巧在不更新文件内容的情况下移除粘性标签? 我知道'cvs up -A',但这也改变了我的文件。

或其他方式: 有什么办法可以在不设置粘性标签的情况下将完整的目录更新为上一个日期?

背景: 我用CVS和HG版本的工作副本,我搞砸了,所以我不想回到它同步的最新点,然后检查会发生什么来自CVS。

感谢和问候。

+0

我也是,现在,我既HG和CVS(HG版本为自己的方便,CVS因为它是传统项目)。我已经做了类似于HG/GIT/CVS/RCS/BZR/...我们需要找到,。或者自己写一篇关于这种多个VCS跟踪的指导。 –

回答

10

这可能取决于您的CVS版本,并附带说明它不受支持,但我曾用手动删除CVS/Entries文件中的粘性标签。当我想将我的工作版本回滚到过去的版本时,我做了很多工作,但是避免使用粘性标签,以便在准备就绪时正常更新。

首先,只需将文件从存储库更新到所需的版本即可。为了清洁,我习惯于先删除本地拷贝。

rm myfile 
cvs update -r 1.20 myfile 

这当然会留下粘性标签。

cvs status myfile 
=================================================================== 
File: myfile  Status: Up-to-date 

    Working revision: 1.20 
    Repository revision: 1.20 /cvsroot/myproject/myfile,v 
    Sticky Tag:   1.20 
    Sticky Date:   (none) 
    Sticky Options:  (none) 

粘性标签存储在最后一个字段的CVS/Entries文件中。如果你看一下CVS /项用文本编辑器和搜索文件名的时候,你会发现这一点:

/myfile/1.20/Thu Nov 6 18:22:05 2014//T1.20 

末的T1.20表示粘性标签。您可以简单地删除它,留下行:

/myfile/1.20/Thu Nov 6 18:22:05 2014// 

现在,粘性标签已消失。如果有人签入了新版本,并且您尚未更新,则处于与您处于相同状态的状态。

cvs status myfile 
=================================================================== 
File: myfile  Status: Needs Patch 

    Working revision: 1.20 
    Repository revision: 1.21 /cvsroot/myproject/myfile,v 
    Sticky Tag:   (none) 
    Sticky Date:   (none) 
    Sticky Options:  (none) 

一旦你确认这个工作在一个单一的文件,并获得勇敢,你可以,如果你想使用自己喜欢的工具(Perl中,awk中,等等)来修改每个文件做整个目录一次在CVS /条目中(或者只有那些你想修改的行)。当然,你应该谨慎使用。我用perl,并保持在的.backup任何麻烦的情况下,依傍:

perl -pi.backup -e 's|//T[\.0-9]+$|//|' CVS/Entries 
+0

顺便说一句,我不觉得删除粘贴标签是危险的概念。当然通过支持的方法会更好。但正如我所说的那样,结果状态与您最初签出之后签入到存储库的状态完全相同,而您尚未更新。如果你有本地修改,你会被告知合并,然后才能更新。如果你没有本地修改,那么你可以干净地更新。 – biomiker

+0

幸运的是,我不必再为遗留的CVS项目工作,所以我没有测试过这个答案,但我会接受这个答案作为接受的答案,因为它与我所寻找的最接近。 – Peter

+0

正在工作的修订版本号在版本库的最后面。因此,我无法再次提交“检索”版本。错误消息:“最新检查失败”。解决方案是否存在? –

0

或者反过来想:有什么办法来更新完整的 目录到以前的日期,而不在第一 地方设置粘性标签?

粘性标签在那里要记住你不在头部。如果你提交更改,他们将不会去那里。在正常情况下,删除粘性标签可能会很危险。

我认为最好的方法是从存储库同步到更新副本的日期创建一个修补程序。然后应用补丁反转。用修改后的更改创建补丁并应用于其他存储库。

在一个干净的(但不是同步回购):

$ cvs diff -R -D date_when_synced >patchfile

$ patch -R -pNUM <patchfile

然后在你做你不想与cvs up -A失去修改回购:

$ cvs diff -R >patchfile2

然后在“clean”存储库中应用该补丁:

​​

我认为这可能做你想做的,如果我理解正确的话。

1

您可以使用-p选项将“cvs up”写入标准输出,您可以使用“>”将其重定向到原始文件。这避免了粘性。

+1

这确实有效,但会让您处于“本地修改”状态。如果你想稍后更新,你需要再次处理这个文件。 – biomiker