代码之家  ›  专栏  ›  技术社区  ›  Thomas Vander Stichele

如何通过程序获取cvs签出的最新提交日期

cvs
  •  9
  • Thomas Vander Stichele  · 技术社区  · 16 年前

    对于我正在使用cvs实现对分的脚本,我想知道当前签出的“时间戳”是什么。换句话说,如果我在一个分支/标记上,我想知道最后一个时间戳,一些东西被提交到该分支/标记上。如果我在头上,我想知道头上的最后一个时间戳。

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

    天真地,我以为

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

    本来打算这样做的,但结果是它贯穿了所有分支/标记的整个提交历史。

    3 回复  |  直到 6 年前
        1
  •  3
  •   nik    16 年前

    一个分支上的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来完成)

        2
  •  0
  •   Jon Gjengset    12 年前

    获取文件最新更改时间(基于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。

        3
  •  0
  •   mynameispaulie    6 年前

    我在寻找一种通过编程方式的标记来获取cvs中文件时间戳的方法时遇到了这个线程。其他答案已经足够了,但我想补充一下我自己的答案:

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

    我注意到在 -r <tag> . 它似乎是一系列的标签或修订 –r<tag1>:<tag2> 也是适当的。

    我还想得到包含完整时间戳的日期,发现使用 cut 对静态字符范围执行子字符串似乎比使用 sed .

    最后,最重要的是,我发现 rlog 命令作为远程日志工作,而 log 命令要求实际签出文件。在我的例子中,我只想根据一个标签查找文件的时间戳,而为了执行日志,必须签出文件这一增加的步骤是一个主要的威慑,所以我只想添加 原木 命令可能对您的需要有用。

    推荐文章