我的脚本依赖于CVS / *文件,但不需要实际拥有所有文件。是否可以在不实际检出存储库中的所有文件的情况下获取CVS / *文件? 签出所有文件需要花费大量时间。
答案 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;你可能能够破解消息来源。