2009-06-25 50 views
8

对于我正在使用CVS实现二等分的脚本,我想弄清楚当前结帐的'时间戳记'。换句话说,如果我在分支/标签上,我想知道最后一个时间戳是否有某个分支/标签被提交。如果我在头上,我想知道最后的时间戳。如何以编程方式在CVS结账中获取最新提交日期

我知道这不是100%保证,因为CVS检出可以在不同的时间戳/修订版/ ...有不同的文件,但在我看来,大多数情况下正确的解决方案是正确的。

天真,我以为

cvs log -N | grep ^date: | sort | tail -n 1 | cut -d\; -f1 

是要做到这一点,但事实证明,它经历了整个提交历史,为所有分支机构/标签。

回答

2

分支上的CVS文件处于不同的时间戳,选择任何一个文件以获取分支的最后时间信息的准确性几乎不值得。

但是,如果有一些文件经常改变,它会变得更好。 例如,在我的一个基地中,有一个version.h文件,它在每个版本转换(小版或大版)上进行更新。这可以用于当前版本的时间信息(再次对分支中的所有文件都不准确,但确实给出了底线)。

所以,如果你知道一个文件,可以给你一个底线值,

cvs log path/to/version.h -r branch/tag | grep ^date | sort | tail -1 

会给你该文件最后的时间戳。


如果可以列举这样的碱的整个文件集合中的,

find /base/dir -type f | grep -v CVS > files.txt 

然后,可以循环的CVS上述命令为每个文件,

rm -f allFiles.txt 
for f in $(<files.txt); do cvs log $f ...etc... tail -1 >> allFiles.txt 
sort allFiles.txt | tail -1 

最后一行这种排序会为您提供最近一次提交的确切日期。
唉,你不会得到文件名(这也可以做更多的福)

+0

这是我能想出的唯一东西,大概。最后,我做了一个CVS日志,并解析了所有文件。在每个文件上做这件事情都会很慢。 – 2009-06-28 12:03:52

0

一个更快的方式来获取文件被更改的最新时间(它建立在nik给出的答案上)是:

cvs log -bd `date +%Y-%m-%d` ChangeLog | grep ^date 

如果你想获得只有日期,用途:

cvs log -bd `date +%Y-%m-%d` ChangeLog | grep ^date | sed 's/date: \([^ ]*\).*/\1/' 

它使用它使用默认分支和-d它允许你告诉CVS你只关心-b标志最新版本,直到特定时间。 ``表达式然后传递当前日期作为限制,给你最近的提交。

在gnuplot CVS存储库上,使用-d标志将执行时间从〜4s减少到〜1.5s。