7

CVS 真的快把我逼疯了!

有什么技巧可以在不更新文件内容的情况下删除粘性标签吗?我知道'cvs up -A',但这也改变了我的文件。

或者反过来:有什么方法可以将完整的目录更新到以前的日期而不首先设置粘性标签?

背景:我使用了一个同时使用 CVS 和 HG 进行版本控制的工作副本,但我把它搞砸了,所以我不想回到它同步的最新点,然后检查 CVS 会输入什么。

谢谢并恭祝安康。

4

3 回答 3

11

这可能取决于您的 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/Entries 并搜索你的文件名,你会发现:

/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/Entries 中的每个文件(或只有那些你想修改的行)。你当然应该谨慎使用。我使用 perl,并保留一个 .backup 以防万一:

perl -pi.backup -e 's|//T[\.0-9]+$|//|' CVS/Entries
于 2014-11-06T18:38:12.667 回答
1

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

于 2013-12-17T20:01:27.833 回答
0

或者反过来:有什么方法可以将完整的目录更新到以前的日期而不首先设置粘性标签?

粘性标签用于记住您不在 HEAD 中。如果您提交更改,那么它们将不会去那里。在正常情况下,仅仅移除粘性标签可能是危险的。

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

在干净(但未同步的仓库)上:

$ cvs diff -R -D date_when_synced >patchfile

$ patch -R -pNUM <patchfile

然后在 repo 中你做了你不想丢失的修改cvs up -A

$ cvs diff -R >patchfile2

然后在“干净”存储库中应用补丁:

$ patch -pNUM <patchfile2

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

于 2013-08-09T16:58:43.490 回答