Как получить конкретную ревизию недавно добавленного файла из CVS через командную строку? - PullRequest
7 голосов
/ 10 октября 2008

Один из наших внутренне написанных инструментов получает трассировку коммита 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, введя команду cvs update -r 1.1.2.56 в рабочем каталоге, в котором уже есть определенная ветка кода.

Эти команды работают правильно, если в рабочем каталоге есть существующая версия AFile.java . Но когда мы получаем след файла, который не имеет версии в рабочем каталоге, команда не может получить файл.

Есть ли способ сделать это?

Ответы [ 5 ]

22 голосов
/ 10 октября 2008

Непонятно, какова ваша конечная цель: привести весь репозиторий в требуемое состояние (выбранная ревизия выбранной ветви) или получить отдельный файл из репозитория для дальнейшей обработки. Я предполагаю, что это последнее.

Затем вам нужна эта команда:

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

Это приведет к выводу в stdout указанной ревизии указанного файла (или файлов), которая может быть перенаправлена ​​во временное местоположение и обработана.

Или вы можете использовать:

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

, который будет экспортировать (часть) хранилище в указанный целевой каталог.

2 голосов
/ 03 декабря 2015

Я пробовал, как показано ниже

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

Теперь все работало нормально.

2 голосов
/ 22 апреля 2013

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)

... научить человека ловить рыбу ...:)

1 голос
/ 15 марта 2017

Это единственный способ, который работает для меня, поскольку команда checkout всегда выдает ошибку «модуль не найден»:

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

Похоже, что cvs упал мяч на этом.

1 голос
/ 10 октября 2008

Одним из решений было бы изменить инструмент для выдачи «cvs co» для файла, указав ревизию, как в настоящее время с обновлением. Команда checkout должна выполняться из верхней части дерева, а не из каталога, содержащего файл. Я сталкивался с подобными случаями, когда обновление не может найти новый файл, требуя проверки файла, как я описал.

...