代码之家  ›  专栏  ›  技术社区  ›  Tahir Akhtar

如何通过命令行从CVS获取新添加文件的特定版本?

  •  9
  • Tahir Akhtar  · 技术社区  · 17 年前

    我们内部编写的一个工具收到了cvs提交跟踪的表单:

    Checking in src/com/package/AFile.java;
        /home/cvs/src/com/package/AFile.java,v <-- Afile.java
        new revision: 1.1.2.56; previous revision: 1.1.2.55
        done
    

    然后,该工具通过发出 cvs update -r 1.1.2.56 已签出特定代码分支的工作目录中的命令。

    如果存在现有版本的 AFile.java 在工作目录中。但是,当我们在工作目录中得到一个没有版本的文件的跟踪时,该命令无法获取该文件。

    有办法吗?

    6 回复  |  直到 11 年前
        1
  •  25
  •   ADEpt    17 年前

    目前尚不清楚您的最终目标是什么:将整个存储库带入所需状态(选择所选分支的修订版),还是从存储库中获取单个文件以进行进一步处理。我想是后者。

    然后,您需要以下命令:

    cvs checkout -r <revision> -p filename.ext > ~/tmp/filename.ext
    

    这将把指定文件(或多个文件)的指定版本转储到stdout,这些版本可以被重定向到临时位置并进行处理。

    或者,您可以使用:

    cvs export -r <revision> -d ~/tmp module/filename.ext
    

    ,这将把存储库(的一部分)导出到指定的目标目录。

        2
  •  3
  •   Jess    13 年前

    cvs --help

    告诉你可以使用 -H arg用于查看特定CVS命令的帮助,如下所示:

    $ cvs -H checkout
    Usage:
      cvs checkout [-ANPRcflnps] [-r rev] [-D date] [-d dir]
        [-j rev1] [-j rev2] [-k kopt] modules...
            -A      Reset any sticky tags/date/kopts.
            -N      Don't shorten module paths if -d specified.
            -P      Prune empty directories.
            -R      Process directories recursively.
            -c      "cat" the module database.
            -f      Force a head revision match if tag/date not found.
            -l      Local directory only, not recursive
            -n      Do not run module program (if any).
            -p      Check out files to standard output (avoids stickiness).
            -s      Like -c, but include module status.
            -r rev  Check out revision or tag. (implies -P) (is sticky)
            -D date Check out revisions as of date. (implies -P) (is sticky)
            -d dir  Check out into dir instead of module name.
            -k kopt Use RCS kopt -k option on checkout. (is sticky)
            -j rev  Merge in changes made between current revision and rev.
    (Specify the --help global option for a list of other help options)
    

    …教一个人如何钓鱼。.. :)

        3
  •  2
  •   Jeegar Patel    10 年前

    我尝试了以下方法

    cvs checkout -r <revision> -p filename.ext > ~/tmp/filename.ext
    

    它给出了错误,比如

    cvs checkout: cannot find module `filename.ext` -ignored.
    

    所以我按照以下方式做了

    cvs checkout -r <revision> -p Module_name/path_to_file/filename.ext > ~/tmp/filename.ext
    

    现在它工作得很好。

        4
  •  1
  •   Jason Etheridge    17 年前

    一种解决方案是更改工具,为文件发出“cvs-co”,指定更新中的版本。checkout命令必须从树的顶部执行,而不是在包含文件的目录中执行。我遇到过类似的情况,更新找不到新文件,需要像我所描述的那样签出文件。

        5
  •  1
  •   CpnCrunch    9 年前

    这是唯一对我有效的方法,因为checkout命令总是给出“找不到模块”错误:

    cvs diff -r <revision> <file> > /tmp/patch
    cp <file> /tmp
    cd /tmp
    patch -R < patch
    

    看来cvs在这件事上丢了球。

        6
  •  0
  •   Charlie    4 年前

    我这样做了:

    cd <to_your_file_directory>
    mv user.cpp user.cpp.bak
    cvs update -r 1.55 user.cpp