如何以编程方式获取CVS结帐时的最新提交日期

时间:2009-06-25 15:39:49

标签: cvs

对于我正在使用CVS实现二分法的脚本,我想弄清楚当前结账的“时间戳”是什么。换句话说,如果我在分支/标签上,我想知道最后一个时间戳被提交到该分支/标签。如果我在头上,我想知道最后的时间戳。

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

天真,我以为

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

将会这样做,但事实证明它贯穿整个提交历史记录,适用于所有分支/标签。

3 个答案:

答案 0 :(得分:3)

分支上的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

排序的最后一行将为您提供最近提交的确切日期 唉,你不会得到文件名(也可以用更多的fu来完成)

答案 1 :(得分: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/'

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

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

答案 2 :(得分:0)

我在寻找一种通过标签以编程方式在CVS中获取文件时间戳的方法时遇到了这个线程。其他答案就足够了,但我想添加以下内容:

cvs rlog -r<tag_or_revision> <file_path> | grep ^date | cut -c 7-25

我注意到-r<tag>之间不能有空格。似乎有一系列标记或修订,因为–r<tag1>:<tag2>也很合适。

我还想获取包含完整时间戳记的日期,发现使用cut对静态字符范围执行子字符串似乎比使用sed容易。

最后,也是最重要的是,我发现rlog命令可作为远程日志,而log命令则要求将文件实际检出。就我而言,我只是想根据标签查找文件的时间戳,而增加的必须签出文件以执行日志的步骤是一个主要的威慑因素,因此我只想补充一点,rlog命令可能可以满足您的需求。