如何在不查看实际文件的情况下获取CVS / *文件?

时间:2012-01-10 22:15:16

标签: cvs

我的脚本依赖于CVS / *文件,但不需要实际拥有所有文件。是否可以在不实际检出存储库中的所有文件的情况下获取CVS / *文件? 签出所有文件需要花费大量时间。

2 个答案:

答案 0 :(得分:1)

  

目前它只对来自不同标签的两个条目文件进行比较,并输出XML / JSON或人类可读信息以及标签之间的差异:删除,新建,修订版本,修订版本。 - davidlt

您的方法存在一些问题。您已经知道第一个:需要签出标签,即使您不关心实际文件。

另一个问题是CVS / *文件是本地的,可以编辑和/或损坏。此外,如果您进行部分结帐,则条目文件将仅包含您签出的内容,而不是与teh标签关联的所有内容。因此,不能保证该文件是“真相”的来源。

如果您刚刚更改了哪些文件,则可以使用rdiff -s选项。

rdiff options文档说:

  

-s

     

创建摘要更改报告而不是修补程序。摘要包括有关在发行版之间更改或添加的文件的信息。它被发送到标准输出设备。例如,这对于找出哪些文件在两个日期或修订版之间发生了变化非常有用。

该文档还包含this example

  

假设您已经发布了1.3版本,并分叉了一个名为R_1_3fix的分支来修复错误。 R_1_3_1对应于1.3.1版本,这是前一段时间发布的。现在,您想要了解在分支上已完成了多少开发。可以使用此命令:

$ cvs patch -s -r R_1_3_1 -r R_1_3fix module-name
cvs rdiff: Diffing module-name
File ChangeLog,v changed from revision 1.52.2.5 to 1.52.2.6
File foo.c,v changed from revision 1.52.2.3 to 1.52.2.4
File bar.h,v changed from revision 1.29.2.1 to 1.2

我自己运行它,这是新消息和已删除消息的样子:

cvs rdiff -s -r v5_8_0_1 -r v5_8_0_2 <module>

File abc is new; v5_8_0_2 revision 1.1.2.2
File xyz is removed; v5_8_0_1 revision 1.1.4.1

修改

您没有指定您所使用的平台,但是cvs命令的非统一输出当然可以通过清理命令传递,以便于管理。例如。以下awk会将其转换为CSV输出,只有您感兴趣的四条信息。

cvs rdiff -s -r <tag1> -r <tag2> <module> | awk '
    / new; /     { print "NEW, \"" $2 "\", , " $7 }
    /changed /   { print "CHANGED, \"" $2 "\", " $6 ", " $8 }
    / removed; / { print "REMOVED, \"" $2 "\", " $7 ", " }
'

答案 1 :(得分:0)

你的意思是这些文件:

CVS/Entries
CVS/Repository
CVS/Root
CVS/Tag

这是部分解决方案:

cvs ... checkout -D 1970-01-01 ...

这将在不晚于1970年1月1日的情况下检查最新版本,其中几乎肯定没有。

但它只检查顶级目录。如果你想递归获取所有子目录,事情会变得有点棘手。关键是cvs checkout打印出stderr上子目录的名称,即使它没有创建它们。

所以这个shell脚本似乎可以解决问题(用你需要的任何东西替换...):

#!/bin/bash

export CVSROOT=...
module=...

for dir in $(cvs checkout -D 1970-01-01 $module 2>&1 | sed 's/.* //')
do
    cvs checkout -D 1970-01-01 $dir
done

我对此解决方案并不完全满意,因为它基于观察到的行为,而不是基于记录的行为。如果任何模块或目录名称包含空格,它也可能会中断。

编辑:正如Clare Macrae在评论中指出的那样,这会创建几乎空的CVS/Entries文件(仅包含目录的条目),因此这可能不适合您的目的。

可能没有办法做你想做的事。 CVS是freeware;你可能能够破解消息来源。