mirror of
https://git.FreeBSD.org/src.git
synced 2024-11-30 08:19:09 +00:00
18576028af
and non-unix code has been left out.
7739 lines
250 KiB
Plaintext
7739 lines
250 KiB
Plaintext
\input texinfo @c -*-texinfo-*-
|
||
@comment cvs.texinfo,v 1.6 1995/10/12 23:39:26 kfogel Exp
|
||
@comment Documentation for CVS.
|
||
@comment Copyright (C) 1992, 1993 Signum Support AB
|
||
@comment Copyright (C) 1993 Free Software Foundation, Inc.
|
||
|
||
@comment This file is part of the CVS distribution.
|
||
|
||
@comment CVS is free software; you can redistribute it and/or modify
|
||
@comment it under the terms of the GNU General Public License as published by
|
||
@comment the Free Software Foundation; either version 1, or (at your option)
|
||
@comment any later version.
|
||
|
||
@comment CVS is distributed in the hope that it will be useful,
|
||
@comment but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
@comment MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
@comment GNU General Public License for more details.
|
||
|
||
@comment You should have received a copy of the GNU General Public License
|
||
@comment along with CVS; see the file COPYING. If not, write to
|
||
@comment the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
||
|
||
@afourpaper
|
||
@setfilename cvs.info
|
||
@include CVSvn.texi
|
||
@settitle CVS---Concurrent Versions System
|
||
@setchapternewpage odd
|
||
|
||
@c -- TODO list:
|
||
@c -- Fix all lines that match "^@c -- "
|
||
@c -- Document how CVS finds the binaries it executes.
|
||
@c Things to include in the index:
|
||
@c Finding RCS binaries
|
||
@c Path to RCS binaries
|
||
@c RCS, how CVS finds them
|
||
@c s/RCS/diff/
|
||
@c -- More on binary files
|
||
|
||
@ifinfo
|
||
Copyright @copyright{} 1992, 1993 Signum Support AB
|
||
Copyright @copyright{} 1993, 1994 Free Software Foundation, Inc.
|
||
|
||
Permission is granted to make and distribute verbatim copies of
|
||
this manual provided the copyright notice and this permission notice
|
||
are preserved on all copies.
|
||
|
||
@ignore
|
||
Permission is granted to process this file through Tex and print the
|
||
results, provided the printed document carries copying permission
|
||
notice identical to this one except for the removal of this paragraph
|
||
(this paragraph not being relevant to the printed manual).
|
||
|
||
@end ignore
|
||
Permission is granted to copy and distribute modified versions of this
|
||
manual under the conditions for verbatim copying, provided also that the
|
||
section entitled ``GNU General Public License'' is included exactly as
|
||
in the original, and provided that the entire resulting derived work is
|
||
distributed under the terms of a permission notice identical to this one.
|
||
|
||
Permission is granted to copy and distribute translations of this manual
|
||
into another language, under the above conditions for modified versions,
|
||
except that the section entitled ``GNU General Public License'' and
|
||
this permission notice may be included in translations approved by the
|
||
Free Software Foundation instead of in the original English.
|
||
@end ifinfo
|
||
|
||
@comment The titlepage section does not appear in the Info file.
|
||
@titlepage
|
||
@sp 4
|
||
@comment The title is printed in a large font.
|
||
@center @titlefont{Version Management}
|
||
@sp
|
||
@center @titlefont{with}
|
||
@sp
|
||
@center @titlefont{CVS}
|
||
@sp 2
|
||
@center for @sc{cvs} @value{CVSVN}
|
||
@comment -release-
|
||
@sp 3
|
||
@center Per Cederqvist et al
|
||
|
||
@comment The following two commands start the copyright page
|
||
@comment for the printed manual. This will not appear in the Info file.
|
||
@page
|
||
@vskip 0pt plus 1filll
|
||
Copyright @copyright{} 1992, 1993 Signum Support AB
|
||
|
||
Permission is granted to make and distribute verbatim copies of
|
||
this manual provided the copyright notice and this permission notice
|
||
are preserved on all copies.
|
||
|
||
Permission is granted to copy and distribute modified versions of this
|
||
manual under the conditions for verbatim copying, provided also that the
|
||
section entitled ``GNU General Public License'' is included exactly as
|
||
in the original, and provided that the entire resulting derived work is
|
||
distributed under the terms of a permission notice identical to this one.
|
||
|
||
Permission is granted to copy and distribute translations of this manual
|
||
into another language, under the above conditions for modified versions,
|
||
except that the section entitled ``GNU General Public License'' and
|
||
this permission notice may be included in translations approved by the
|
||
Free Software Foundation instead of in the original English.
|
||
@end titlepage
|
||
|
||
@comment ================================================================
|
||
@comment The real text starts here
|
||
@comment ================================================================
|
||
|
||
@ifinfo
|
||
@c ---------------------------------------------------------------------
|
||
@node Top
|
||
@top
|
||
@c Note: there is a space after that @top command.
|
||
@c The texinfo-format-buffer Emacs function and
|
||
@c the makeinfo shell command disagree on what arguments
|
||
@c @top takes; @top followed by a single space is
|
||
@c something they can both cope with.
|
||
|
||
This info manual describes how to use and administer
|
||
@sc{cvs} version @value{CVSVN}.
|
||
@end ifinfo
|
||
|
||
@menu
|
||
* Preface:: About this manual
|
||
* What is CVS?:: What is CVS?
|
||
* Basic concepts:: Basic concepts of revision management
|
||
* A sample session:: A tour of basic CVS usage
|
||
* Repository:: Where all your sources are stored
|
||
* Starting a new project:: Starting a project with CVS
|
||
* Multiple developers:: How CVS helps a group of developers
|
||
* Branches:: Parallel development explained
|
||
* Merging:: How to move changes between branches
|
||
* Recursive behavior:: CVS descends directories
|
||
* Adding files:: Adding files to a module
|
||
* Removing files:: Removing files from a module
|
||
* Tracking sources:: Tracking third-party sources
|
||
* Moving files:: Moving and renaming files
|
||
* Moving directories:: Moving and renaming directories
|
||
* History browsing:: Viewing the history of files in various ways
|
||
* Keyword substitution:: CVS can include the revision inside the file
|
||
* Binary files:: CVS can handle binary files
|
||
* Revision management:: Policy questions for revision management
|
||
* Invoking CVS:: Reference manual for CVS commands
|
||
* Administrative files:: Reference manual for the Administrative files
|
||
* Environment variables:: All environment variables which affect CVS
|
||
* Troubleshooting:: Some tips when nothing works
|
||
* Copying:: GNU GENERAL PUBLIC LICENSE
|
||
* Index:: Index
|
||
@end menu
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node Preface
|
||
@unnumbered About this manual
|
||
@cindex Preface
|
||
@cindex About this manual
|
||
|
||
Up to this point, one of the weakest parts of @sc{cvs}
|
||
has been the documentation. @sc{cvs} is a complex
|
||
program. Previous versions of the manual were written
|
||
in the manual page format, which is not really well
|
||
suited for such a complex program.
|
||
|
||
When writing this manual, I had several goals in mind:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
No knowledge of @sc{rcs} should be necessary.
|
||
|
||
@item
|
||
No previous knowledge of revision control software
|
||
should be necessary. All terms, such as @dfn{revision
|
||
numbers}, @dfn{revision trees} and @dfn{merging} are
|
||
explained as they are introduced.
|
||
|
||
@item
|
||
The manual should concentrate on the things @sc{cvs} users
|
||
want to do, instead of what the @sc{cvs} commands can do.
|
||
The first part of this manual leads you through things
|
||
you might want to do while doing development, and
|
||
introduces the relevant @sc{cvs} commands as they are
|
||
needed.
|
||
|
||
@item
|
||
Information should be easy to find. In the reference
|
||
manual in the appendices almost all information about
|
||
every @sc{cvs} command is gathered together. There is also
|
||
an extensive index, and a lot of cross references.
|
||
@end itemize
|
||
|
||
@cindex Signum Support
|
||
@cindex Support, getting CVS support
|
||
This manual was contributed by Signum Support AB in
|
||
Sweden. Signum is yet another in the growing list of
|
||
companies that support free software. You are free to
|
||
copy both this manual and the @sc{cvs} program.
|
||
@xref{Copying}, for the details. Signum Support offers
|
||
@c -- Check this reference! It has been bogus in the past.
|
||
support contracts and binary distribution for many
|
||
programs, such as @sc{cvs}, @sc{gnu} Emacs, the
|
||
@sc{gnu} C compiler and others. Write to us for
|
||
more information.
|
||
|
||
@example
|
||
Signum Support AB
|
||
Box 2044
|
||
S-580 02 Linkoping
|
||
Sweden
|
||
|
||
Email: info@@signum.se
|
||
Phone: +46 (0)13 - 21 46 00
|
||
Fax: +46 (0)13 - 21 47 00
|
||
@end example
|
||
|
||
Another company selling support for @sc{cvs} is Cyclic
|
||
Software, web: @code{http://www.cyclic.com/}, email:
|
||
@code{info@@cyclic.com}.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@menu
|
||
* Checklist::
|
||
* Credits::
|
||
* BUGS::
|
||
@end menu
|
||
|
||
@node Checklist
|
||
@unnumberedsec Checklist for the impatient reader
|
||
|
||
@sc{cvs} is a complex system. You will need to read
|
||
the manual to be able to use all of its capabilities.
|
||
There are dangers that can easily be avoided if you
|
||
know about them, and this manual tries to warn you
|
||
about them. This checklist is intended to help you
|
||
avoid the dangers without reading the entire manual.
|
||
If you intend to read the entire manual you can skip
|
||
this table.
|
||
|
||
@table @asis
|
||
@item Binary files
|
||
@sc{cvs} can handle binary files, but
|
||
you must have @sc{rcs} release 5.5 or later and
|
||
a release of @sc{gnu} diff that supports the @samp{-a}
|
||
flag (release 1.15 and later are OK). You must also
|
||
configure both @sc{rcs} and @sc{cvs} to handle binary
|
||
files when you install them.
|
||
|
||
Keword substitution can be a source of trouble with
|
||
binary files. @xref{Keyword substitution}, for
|
||
solutions.
|
||
|
||
@item The @code{admin} command
|
||
Uncareful use of the @code{admin} command can cause
|
||
@sc{cvs} to cease working. @xref{admin}, before trying
|
||
to use it.
|
||
@end table
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Credits
|
||
@unnumberedsec Credits
|
||
|
||
@cindex Contributors (manual)
|
||
@cindex Credits (manual)
|
||
Roland Pesch, Cygnus Support <@t{pesch@@cygnus.com}>
|
||
wrote the manual pages which were distributed with
|
||
@sc{cvs} 1.3. Appendix A and B contain much text that
|
||
was extracted from them. He also read an early draft
|
||
of this manual and contributed many ideas and
|
||
corrections.
|
||
|
||
The mailing-list @code{info-cvs} is sometimes
|
||
informative. I have included information from postings
|
||
made by the following persons:
|
||
David G. Grubbs <@t{dgg@@think.com}>.
|
||
|
||
Some text has been extracted from the man pages for
|
||
@sc{rcs}.
|
||
|
||
The @sc{cvs} @sc{faq} (@pxref{What is CVS?}) by David
|
||
G. Grubbs has been used as a check-list to make sure
|
||
that this manual is as complete as possible. (This
|
||
manual does however not include all of the material in
|
||
the @sc{faq}). The @sc{faq} contains a lot of useful
|
||
information.
|
||
|
||
In addition, the following persons have helped by
|
||
telling me about mistakes I've made:
|
||
Roxanne Brunskill <@t{rbrunski@@datap.ca}>,
|
||
Kathy Dyer <@t{dyer@@phoenix.ocf.llnl.gov}>,
|
||
Karl Pingle <@t{pingle@@acuson.com}>,
|
||
Thomas A Peterson <@t{tap@@src.honeywell.com}>,
|
||
Inge Wallin <@t{ingwa@@signum.se}>,
|
||
Dirk Koschuetzki <@t{koschuet@@fmi.uni-passau.de}>
|
||
and Michael Brown <@t{brown@@wi.extrel.com}>.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node BUGS
|
||
@unnumberedsec BUGS
|
||
|
||
@cindex Bugs, known in this manual
|
||
@cindex Known bugs in this manual
|
||
This manual is known to have room for improvement.
|
||
Here is a list of known deficiencies:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
In the examples, the output from @sc{cvs} is sometimes
|
||
displayed, sometimes not.
|
||
|
||
@item
|
||
The input that you are supposed to type in the examples
|
||
should have a different font than the output from the
|
||
computer.
|
||
|
||
@item
|
||
This manual should be clearer about what file
|
||
permissions you should set up in the repository, and
|
||
about setuid/setgid.
|
||
|
||
@item
|
||
Some of the chapters are not yet complete. They are
|
||
noted by comments in the @file{cvs.texinfo} file.
|
||
|
||
@item
|
||
@cindex Reporting bugs (manual)
|
||
@cindex Bugs, reporting (manual)
|
||
@cindex Errors, reporting (manual)
|
||
This list is not complete. If you notice any error,
|
||
omission, or something that is unclear, please send
|
||
mail to @t{bug-cvs@@prep.ai.mit.edu}.
|
||
@end itemize
|
||
|
||
I hope that you will find this manual useful, despite
|
||
the above-mentioned shortcomings.
|
||
|
||
@flushright
|
||
|
||
Linkoping, October 1993
|
||
Per Cederqvist
|
||
@end flushright
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node What is CVS?
|
||
@chapter What is CVS?
|
||
@cindex What is CVS?
|
||
@cindex Introduction to CVS
|
||
@cindex CVS, introduction to
|
||
|
||
@sc{cvs} is a version control system. Using it, you can
|
||
record the history of your source files.
|
||
|
||
@c -- ///
|
||
@c -- ///Those who cannot remember the past are condemned to repeat it.
|
||
@c -- /// -- George Santayana
|
||
@c -- //////
|
||
|
||
@c -- Insert history quote here!
|
||
For example, bugs sometimes creep in when
|
||
software is modified, and you might not detect the bug
|
||
until a long time after you make the modification.
|
||
With @sc{cvs}, you can easily retrieve old versions to see
|
||
exactly which change caused the bug. This can
|
||
sometimes be a big help.
|
||
|
||
You could of course save every version of every file
|
||
you have ever created. This would
|
||
however waste an enormous amount of disk space. @sc{cvs}
|
||
stores all the versions of a file in a single file in a
|
||
clever way that only stores the differences between
|
||
versions.
|
||
|
||
@sc{cvs} also helps you if you are part of a group of people working
|
||
on the same project. It is all too easy to overwrite
|
||
each others' changes unless you are extremely careful.
|
||
Some editors, like @sc{gnu} Emacs, try to make sure that
|
||
the same file is never modified by two people at the
|
||
same time. Unfortunately, if someone is using another
|
||
editor, that safeguard will not work. @sc{cvs} solves this problem
|
||
by insulating the different developers from each other. Every
|
||
developer works in his own directory, and @sc{cvs} merges
|
||
the work when each developer is done.
|
||
|
||
@cindex History of CVS
|
||
@cindex CVS, history of
|
||
@cindex Credits (CVS program)
|
||
@cindex Contributors (CVS program)
|
||
@sc{cvs} started out as a bunch of shell scripts written by
|
||
Dick Grune, posted to @code{comp.sources.unix} in the volume 6
|
||
release of December, 1986. While no actual code from
|
||
these shell scripts is present in the current version
|
||
of @sc{cvs} much of the @sc{cvs} conflict resolution algorithms
|
||
come from them.
|
||
|
||
In April, 1989, Brian Berliner designed and coded @sc{cvs}.
|
||
Jeff Polk later helped Brian with the design of the @sc{cvs}
|
||
module and vendor branch support.
|
||
|
||
@cindex Source, getting CVS source
|
||
You can get @sc{cvs} via anonymous ftp from a number of
|
||
sites, for instance @t{prep.ai.mit.edu} in
|
||
@file{pub/gnu}.
|
||
|
||
@cindex Mailing list
|
||
@cindex List, mailing list
|
||
There is a mailing list for @sc{cvs} where bug reports
|
||
can be sent, questions can be asked, an FAQ is posted,
|
||
and discussion about future enhancements to @sc{cvs}
|
||
take place. To submit a message to the list, write to
|
||
<@t{info-cvs@@prep.ai.mit.edu}>. To subscribe or
|
||
unsubscribe, write to
|
||
<@t{info-cvs-request@@prep.ai.mit.edu}>. Please be
|
||
specific about your email address.
|
||
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@unnumberedsec CVS is not@dots{}
|
||
|
||
@sc{cvs} can do a lot of things for you, but it does
|
||
not try to be everything for everyone.
|
||
|
||
@table @asis
|
||
@item @sc{cvs} is not a build system.
|
||
|
||
Though the structure of your repository and modules
|
||
file interact with your build system
|
||
(e.g. @file{Makefile}s), they are essentially
|
||
independent.
|
||
|
||
@sc{cvs} does not dictate how you build anything. It
|
||
merely stores files for retrieval in a tree structure
|
||
you devise.
|
||
|
||
@sc{cvs} does not dictate how to use disk space in the
|
||
checked out working directories. If you write your
|
||
@file{Makefile}s or scripts in every directory so they
|
||
have to know the relative positions of everything else,
|
||
you wind up requiring the entire repository to be
|
||
checked out. That's simply bad planning.
|
||
|
||
If you modularize your work, and construct a build
|
||
system that will share files (via links, mounts,
|
||
@code{VPATH} in @file{Makefile}s, etc.), you can
|
||
arrange your disk usage however you like.
|
||
|
||
But you have to remember that @emph{any} such system is
|
||
a lot of work to construct and maintain. @sc{cvs} does
|
||
not address the issues involved. You must use your
|
||
brain and a collection of other tools to provide a
|
||
build scheme to match your plans.
|
||
|
||
Of course, you should place the tools created to
|
||
support such a build system (scripts, @file{Makefile}s,
|
||
etc) under @sc{cvs}.
|
||
|
||
@item @sc{cvs} is not a substitute for management.
|
||
|
||
Your managers and project leaders are expected to talk
|
||
to you frequently enough to make certain you are aware
|
||
of schedules, merge points, branch names and release
|
||
dates. If they don't, @sc{cvs} can't help.
|
||
|
||
@sc{cvs} is an instrument for making sources dance to
|
||
your tune. But you are the piper and the composer. No
|
||
instrument plays itself or writes its own music.
|
||
|
||
@item @sc{cvs} is not a substitute for developer communication.
|
||
|
||
When faced with conflicts within a single file, most
|
||
developers manage to resolve them without too much
|
||
effort. But a more general definition of ``conflict''
|
||
includes problems too difficult to solve without
|
||
communication between developers.
|
||
|
||
@sc{cvs} cannot determine when simultaneous changes
|
||
within a single file, or across a whole collection of
|
||
files, will logically conflict with one another. Its
|
||
concept of a @dfn{conflict} is purely textual, arising
|
||
when two changes to the same base file are near enough
|
||
to spook the merge (i.e. @code{diff3}) command.
|
||
|
||
@sc{cvs} does not claim to help at all in figuring out
|
||
non-textual or distributed conflicts in program logic.
|
||
|
||
For example: Say you change the arguments to function
|
||
@code{X} defined in file @file{A}. At the same time,
|
||
someone edits file @file{B}, adding new calls to
|
||
function @code{X} using the old arguments. You are
|
||
outside the realm of @sc{cvs}'s competence.
|
||
|
||
Acquire the habit of reading specs and talking to your
|
||
peers.
|
||
|
||
|
||
@item @sc{cvs} is not a configuration management system.
|
||
|
||
@sc{cvs} is a source control system. The phrase
|
||
``configuration management'' is a marketing term, not
|
||
an industry-recognized set of functions.
|
||
|
||
A true ``configuration management system'' would contain
|
||
elements of the following:
|
||
|
||
@itemize @bullet
|
||
@item Source control.
|
||
@item Dependency tracking.
|
||
@item Build systems (i.e. What to build and how to find
|
||
things during a build. What is shared? What is local?)
|
||
@item Bug tracking.
|
||
@item Automated Testing procedures.
|
||
@item Release Engineering documentation and procedures.
|
||
@item Tape Construction.
|
||
@item Customer Installation.
|
||
@item A way for users to run different versions of the same
|
||
software on the same host at the same time.
|
||
@end itemize
|
||
|
||
@sc{cvs} provides only the first.
|
||
@end table
|
||
|
||
This section is taken from release 2.3 of the @sc{cvs}
|
||
@sc{faq}.
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node Basic concepts
|
||
@chapter Basic concepts
|
||
@cindex Modules (intro)
|
||
@cindex Repository (intro)
|
||
|
||
@sc{cvs} stores all files in a centralized
|
||
@dfn{repository}: a directory (such as
|
||
@file{/usr/local/cvsroot} or
|
||
@file{user@@remotehost:/usr/local/cvsroot}) which is
|
||
populated with a hierarchy of files and directories.
|
||
(@pxref{Remote repositories} for information about
|
||
keeping the repository on a remote machine.)
|
||
|
||
Normally, you never access any of the files in the
|
||
repository directly. Instead, you use @sc{cvs}
|
||
commands to get your own copy of the files, and then
|
||
work on that copy. When you've finished a set of
|
||
changes, you check (or @dfn{commit}) them back into the
|
||
repository.
|
||
|
||
The files in the repository are organized in
|
||
@dfn{modules}. Each module is made up of one or more
|
||
files, and can include files from several directories.
|
||
A typical usage is to define one module per project.
|
||
|
||
@menu
|
||
* Revision numbers:: The meaning of a revision number
|
||
* Versions revisions releases:: Terminology used in this manual
|
||
@end menu
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Revision numbers
|
||
@section Revision numbers
|
||
@cindex Revision numbers
|
||
@cindex Revision tree
|
||
@cindex Linear development
|
||
@cindex Number, revision-
|
||
@cindex Decimal revision number
|
||
@cindex Main trunk (intro)
|
||
@cindex Branch number
|
||
@cindex Number, branch
|
||
|
||
Each version of a file has a unique @dfn{revision
|
||
number}. Revision numbers look like @samp{1.1},
|
||
@samp{1.2}, @samp{1.3.2.2} or even @samp{1.3.2.2.4.5}.
|
||
A revision number always has an even number of
|
||
period-separated decimal integers. By default revision
|
||
1.1 is the first revision of a file. Each successive
|
||
revision is given a new number by increasing the
|
||
rightmost number by one. The following figure displays
|
||
a few revisions, with newer revisions to the right.
|
||
|
||
@example
|
||
+-----+ +-----+ +-----+ +-----+ +-----+
|
||
! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 !
|
||
+-----+ +-----+ +-----+ +-----+ +-----+
|
||
@end example
|
||
|
||
@sc{cvs} is not limited to linear development. The
|
||
@dfn{revision tree} can be split into @dfn{branches},
|
||
where each branch is a self-maintained line of
|
||
development. Changes made on one branch can easily be
|
||
moved back to the main trunk.
|
||
|
||
Each branch has a @dfn{branch number}, consisting of an
|
||
odd number of period-separated decimal integers. The
|
||
branch number is created by appending an integer to the
|
||
revision number where the corresponding branch forked
|
||
off. Having branch numbers allows more than one branch
|
||
to be forked off from a certain revision.
|
||
|
||
@need 3500
|
||
All revisions on a branch have revision numbers formed
|
||
by appending an ordinal number to the branch number.
|
||
The following figure illustrates branching with an
|
||
example.
|
||
|
||
@example
|
||
@group
|
||
+-------------+
|
||
Branch 1.2.2.3.2 -> ! 1.2.2.3.2.1 !
|
||
/ +-------------+
|
||
/
|
||
/
|
||
+---------+ +---------+ +---------+ +---------+
|
||
Branch 1.2.2 -> _! 1.2.2.1 !----! 1.2.2.2 !----! 1.2.2.3 !----! 1.2.2.4 !
|
||
/ +---------+ +---------+ +---------+ +---------+
|
||
/
|
||
/
|
||
+-----+ +-----+ +-----+ +-----+ +-----+
|
||
! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 ! <- The main trunk
|
||
+-----+ +-----+ +-----+ +-----+ +-----+
|
||
!
|
||
!
|
||
! +---------+ +---------+ +---------+
|
||
Branch 1.2.4 -> +---! 1.2.4.1 !----! 1.2.4.2 !----! 1.2.4.3 !
|
||
+---------+ +---------+ +---------+
|
||
|
||
@end group
|
||
@end example
|
||
|
||
@c -- However, at least for me the figure is not enough. I suggest more
|
||
@c -- text to accompany it. "A picture is worth a thousand words", so you
|
||
@c -- have to make sure the reader notices the couple of hundred words
|
||
@c -- *you* had in mind more than the others!
|
||
|
||
@c -- Why an even number of segments? This section implies that this is
|
||
@c -- how the main trunk is distinguished from branch roots, but you never
|
||
@c -- explicitly say that this is the purpose of the [by itself rather
|
||
@c -- surprising] restriction to an even number of segments.
|
||
|
||
The exact details of how the branch number is
|
||
constructed is not something you normally need to be
|
||
concerned about, but here is how it works: When
|
||
@sc{cvs} creates a branch number it picks the first
|
||
unused even integer, starting with 2. So when you want
|
||
to create a branch from revision 6.4 it will be
|
||
numbered 6.4.2. All branch numbers ending in a zero
|
||
(such as 6.4.0) are used internally by @sc{cvs}
|
||
(@pxref{Magic branch numbers}). The branch 1.1.1 has a
|
||
special meaning. @xref{Tracking sources}.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Versions revisions releases
|
||
@section Versions, revisions and releases
|
||
@cindex Revisions, versions and releases
|
||
@cindex Versions, revisions and releases
|
||
@cindex Releases, revisions and versions
|
||
|
||
A file can have several versions, as described above.
|
||
Likewise, a software product can have several versions.
|
||
A software product is often given a version number such
|
||
as @samp{4.1.1}.
|
||
|
||
Versions in the first sense are called @dfn{revisions}
|
||
in this document, and versions in the second sense are
|
||
called @dfn{releases}. To avoid confusion, the word
|
||
@dfn{version} is almost never used in this document.
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node A sample session
|
||
@chapter A sample session
|
||
@cindex A sample session
|
||
@cindex Example of a work-session
|
||
@cindex Getting started
|
||
@cindex Work-session, example of
|
||
@cindex tc, Trivial Compiler (example)
|
||
@cindex Trivial Compiler (example)
|
||
|
||
This section describes a typical work-session using
|
||
@sc{cvs}. It assumes that a repository is set up
|
||
(@pxref{Repository}).
|
||
|
||
Suppose you are working on a simple compiler. The source
|
||
consists of a handful of C files and a @file{Makefile}.
|
||
The compiler is called @samp{tc} (Trivial Compiler),
|
||
and the repository is set up so that there is a module
|
||
called @samp{tc}.
|
||
|
||
@menu
|
||
* Getting the source:: Creating a workspace
|
||
* Committing your changes:: Making your work available to others
|
||
* Cleaning up:: Cleaning up
|
||
* Viewing differences:: Viewing differences
|
||
@end menu
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Getting the source
|
||
@section Getting the source
|
||
@cindex Getting the source
|
||
@cindex Checking out source
|
||
@cindex Fetching source
|
||
@cindex Source, getting from CVS
|
||
@cindex Checkout, example
|
||
|
||
The first thing you must do is to get your own working copy of the
|
||
source for @samp{tc}. For this, you use the @code{checkout} command:
|
||
|
||
@example
|
||
$ cvs checkout tc
|
||
@end example
|
||
|
||
@noindent
|
||
This will create a new directory called @file{tc} and populate it with
|
||
the source files.
|
||
|
||
@example
|
||
$ cd tc
|
||
$ ls tc
|
||
CVS Makefile backend.c driver.c frontend.c parser.c
|
||
@end example
|
||
|
||
The @file{CVS} directory is used internally by
|
||
@sc{cvs}. Normally, you should not modify or remove
|
||
any of the files in it.
|
||
|
||
You start your favorite editor, hack away at @file{backend.c}, and a couple
|
||
of hours later you have added an optimization pass to the compiler.
|
||
A note to @sc{rcs} and @sc{sccs} users: There is no need to lock the files that
|
||
you want to edit. @xref{Multiple developers} for an explanation.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Committing your changes
|
||
@section Committing your changes
|
||
@cindex Committing changes
|
||
@cindex Log message entry
|
||
@cindex CVSEDITOR, environment variable
|
||
@cindex EDITOR, environment variable
|
||
|
||
When you have checked that the compiler is still compilable you decide
|
||
to make a new version of @file{backend.c}.
|
||
|
||
@example
|
||
$ cvs commit backend.c
|
||
@end example
|
||
|
||
@noindent
|
||
@sc{cvs} starts an editor, to allow you to enter a log
|
||
message. You type in ``Added an optimization pass.'',
|
||
save the temporary file, and exit the editor.
|
||
|
||
The environment variable @code{$CVSEDITOR} determines
|
||
which editor is started. If @code{$CVSEDITOR} is not
|
||
set, then if the environment variable @code{$EDITOR} is
|
||
set, it will be used. If both @code{$CVSEDITOR} and
|
||
@code{$EDITOR} are not set then the editor defaults to
|
||
@code{vi}. If you want to avoid the overhead of
|
||
starting an editor you can specify the log message on
|
||
the command line using the @samp{-m} flag instead, like
|
||
this:
|
||
|
||
@example
|
||
$ cvs commit -m "Added an optimization pass" backend.c
|
||
@end example
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Cleaning up
|
||
@section Cleaning up
|
||
@cindex Cleaning up
|
||
@cindex Working copy, removing
|
||
@cindex Removing your working copy
|
||
@cindex Releasing your working copy
|
||
|
||
Before you turn to other tasks you decide to remove your working copy of
|
||
tc. One acceptable way to do that is of course
|
||
|
||
@example
|
||
$ cd ..
|
||
$ rm -r tc
|
||
@end example
|
||
|
||
@noindent
|
||
but a better way is to use the @code{release} command (@pxref{release}):
|
||
|
||
@example
|
||
$ cd ..
|
||
$ cvs release -d tc
|
||
M driver.c
|
||
? tc
|
||
You have [1] altered files in this repository.
|
||
Are you sure you want to release (and delete) module `tc': n
|
||
** `release' aborted by user choice.
|
||
@end example
|
||
|
||
The @code{release} command checks that all your modifications have been
|
||
committed. If history logging is enabled it also makes a note in the
|
||
history file. @xref{history file}.
|
||
|
||
When you use the @samp{-d} flag with @code{release}, it
|
||
also removes your working copy.
|
||
|
||
In the example above, the @code{release} command wrote a couple of lines
|
||
of output. @samp{? tc} means that the file @file{tc} is unknown to @sc{cvs}.
|
||
That is nothing to worry about: @file{tc} is the executable compiler,
|
||
and it should not be stored in the repository. @xref{cvsignore},
|
||
for information about how to make that warning go away.
|
||
@xref{release output}, for a complete explanation of
|
||
all possible output from @code{release}.
|
||
|
||
@samp{M driver.c} is more serious. It means that the
|
||
file @file{driver.c} has been modified since it was
|
||
checked out.
|
||
|
||
The @code{release} command always finishes by telling
|
||
you how many modified files you have in your working
|
||
copy of the sources, and then asks you for confirmation
|
||
before deleting any files or making any note in the
|
||
history file.
|
||
|
||
You decide to play it safe and answer @kbd{n @key{RET}}
|
||
when @code{release} asks for confirmation.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Viewing differences
|
||
@section Viewing differences
|
||
@cindex Viewing differences
|
||
@cindex Diff
|
||
|
||
You do not remember modifying @file{driver.c}, so you want to see what
|
||
has happened to that file.
|
||
|
||
@example
|
||
$ cd tc
|
||
$ cvs diff driver.c
|
||
@end example
|
||
|
||
This command runs @code{diff} to compare the version of @file{driver.c}
|
||
that you checked out with your working copy. When you see the output
|
||
you remember that you added a command line option that enabled the
|
||
optimization pass. You check it in, and release the module.
|
||
|
||
@example
|
||
$ cvs commit -m "Added an optimization pass" driver.c
|
||
Checking in driver.c;
|
||
/usr/local/cvsroot/tc/driver.c,v <-- driver.c
|
||
new revision: 1.2; previous revision: 1.1
|
||
done
|
||
$ cd ..
|
||
$ cvs release -d tc
|
||
? tc
|
||
You have [0] altered files in this repository.
|
||
Are you sure you want to release (and delete) module `tc': y
|
||
@end example
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node Repository
|
||
@chapter The Repository
|
||
@cindex Repository, example
|
||
@cindex Layout of repository
|
||
@cindex Typical repository
|
||
@cindex CVSROOT, environment variable
|
||
@cindex .profile
|
||
@cindex .cshrc
|
||
@cindex .tcshrc
|
||
@cindex .bashrc
|
||
@cindex /usr/local/cvsroot
|
||
@cindex cvsroot
|
||
|
||
Figure 3 below shows a typical setup of a repository.
|
||
Only directories are shown below.
|
||
|
||
@example
|
||
@t{/usr}
|
||
|
|
||
+--@t{local}
|
||
| |
|
||
| +--@t{cvsroot}
|
||
| | |
|
||
| | +--@t{CVSROOT}
|
||
| (administrative files)
|
||
|
|
||
+--@t{gnu}
|
||
| |
|
||
| +--@t{diff}
|
||
| | (source code to @sc{gnu} diff)
|
||
| |
|
||
| +--@t{rcs}
|
||
| | (source code to @sc{rcs})
|
||
| |
|
||
| +--@t{cvs}
|
||
| (source code to @sc{cvs})
|
||
|
|
||
+--@t{yoyodyne}
|
||
|
|
||
+--@t{tc}
|
||
| |
|
||
| +--@t{man}
|
||
| |
|
||
| +--@t{testing}
|
||
|
|
||
+--(other Yoyodyne software)
|
||
@end example
|
||
|
||
|
||
There are a couple of different ways to tell @sc{cvs}
|
||
where to find the repository. You can name the
|
||
repository on the command line explicitly, with the
|
||
@code{-d} (for "directory") option:
|
||
|
||
@example
|
||
cvs -d /usr/local/cvsroot checkout yoyodyne/tc
|
||
@end example
|
||
|
||
Or you can set the @code{$CVSROOT} environment
|
||
variable to an absolute path to the root of the
|
||
repository, @file{/usr/local/cvsroot} in this example.
|
||
To set @code{$CVSROOT}, all @code{csh} and @code{tcsh}
|
||
users should have this line in their @file{.cshrc} or
|
||
@file{.tcshrc} files:
|
||
|
||
@example
|
||
setenv CVSROOT /usr/local/cvsroot
|
||
@end example
|
||
|
||
@noindent
|
||
@code{sh} and @code{bash} users should instead have these lines in their
|
||
@file{.profile} or @file{.bashrc}:
|
||
|
||
@example
|
||
CVSROOT=/usr/local/cvsroot
|
||
export CVSROOT
|
||
@end example
|
||
|
||
A repository specified with @code{-d} will
|
||
override the @code{$CVSROOT} environment variable.
|
||
Once you've checked a working copy out from the
|
||
repository, it will remember where its repository is
|
||
(the information is recorded in the
|
||
@file{CVS/Root} file in the working copy).
|
||
|
||
The @code{-d} option and the @file{CVS/Root} file
|
||
both override the @code{$CVSROOT} environment variable;
|
||
however, @sc{CVS} will complain if the @file{-d}
|
||
argument and the @file{CVS/Root} file disagree.
|
||
|
||
There is nothing magical about the name
|
||
@file{/usr/local/cvsroot}. You can choose to place the
|
||
repository anywhere you like.
|
||
@xref{Remote repositories} to learn how the repository can be on a
|
||
different machine than your working copy of the sources.
|
||
|
||
The repository is split in two parts. @file{$CVSROOT/CVSROOT} contains
|
||
administrative files for @sc{cvs}. The other directories contain the actual
|
||
user-defined modules.
|
||
|
||
@menu
|
||
* User modules:: The structure of the repository
|
||
* Intro administrative files:: Defining modules
|
||
* Multiple repositories:: Multiple repositories
|
||
* Creating a repository:: Creating a repository
|
||
* Remote repositories:: Accessing repositories on remote machines
|
||
@end menu
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node User modules
|
||
@section User modules
|
||
@cindex User modules
|
||
@cindex Repository, user parts
|
||
|
||
@example
|
||
@code{$CVSROOT}
|
||
|
|
||
+--@t{yoyodyne}
|
||
| |
|
||
| +--@t{tc}
|
||
| | |
|
||
+--@t{Makefile,v}
|
||
+--@t{backend.c,v}
|
||
+--@t{driver.c,v}
|
||
+--@t{frontend.c,v}
|
||
+--@t{parser.c,v}
|
||
+--@t{man}
|
||
| |
|
||
| +--@t{tc.1,v}
|
||
|
|
||
+--@t{testing}
|
||
|
|
||
+--@t{testpgm.t,v}
|
||
+--@t{test2.t,v}
|
||
@end example
|
||
|
||
@cindex History files
|
||
@cindex RCS history files
|
||
@cindex RCS, CVS uses RCS
|
||
The figure above shows the contents of the @samp{tc}
|
||
module inside the repository. As you can see all file
|
||
names end in @samp{,v}. The files are @dfn{history
|
||
files}. They contain, among other things, enough
|
||
information to recreate any revision of the file, a log
|
||
of all commit messages and the user-name of the person
|
||
who committed the revision. @sc{cvs} uses the
|
||
facilities of @sc{rcs}, a simpler version control
|
||
system, to maintain these files. For a full
|
||
description of the file format, see the @code{man} page
|
||
@cite{rcsfile(5)}.
|
||
@c -- Use this format for all references to man pages,
|
||
@c -- or use something better!
|
||
|
||
@menu
|
||
* File permissions:: File permissions
|
||
@end menu
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node File permissions
|
||
@subsection File permissions
|
||
@c -- Move this to @node Setting up
|
||
@cindex Security
|
||
@cindex File permissions
|
||
@cindex Group
|
||
All @samp{,v} files are created read-only, and you
|
||
should not change the permission of those files. The
|
||
directories inside the repository should be writable by
|
||
the persons that have permission to modify the files in
|
||
each directory. This normally means that you must
|
||
create a UNIX group (see group(5)) consisting of the
|
||
persons that are to edit the files in a project, and
|
||
set up the repository so that it is that group that
|
||
owns the directory.
|
||
|
||
This means that you can only control access to files on
|
||
a per-directory basis.
|
||
|
||
@sc{cvs} tries to set up reasonable file permissions
|
||
for new directories that are added inside the tree, but
|
||
you must fix the permissions manually when a new
|
||
directory should have different permissions than its
|
||
parent directory.
|
||
|
||
@cindex setuid
|
||
@cindex setgid
|
||
Since @sc{cvs} was not written to be run setuid, it is
|
||
unsafe to try to run it setuid. You cannot use the
|
||
setuid features of @sc{rcs} together with @sc{cvs}.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Intro administrative files
|
||
@section The administrative files
|
||
@cindex Administrative files (intro)
|
||
@cindex Modules file
|
||
@cindex CVSROOT, module name
|
||
@cindex Defining modules (intro)
|
||
|
||
The directory @file{$CVSROOT/CVSROOT} contains some @dfn{administrative
|
||
files}. @xref{Administrative files}, for a complete description.
|
||
You can use @sc{cvs} without any of these files, but
|
||
some commands work better when at least the
|
||
@file{modules} file is properly set up.
|
||
|
||
The most important of these files is the @file{modules}
|
||
file. It defines all modules in the repository. This
|
||
is a sample @file{modules} file.
|
||
|
||
@c FIXME: The CVSROOT line is a goofy example now that
|
||
@c mkmodules doesn't exist.
|
||
@example
|
||
CVSROOT CVSROOT
|
||
modules CVSROOT modules
|
||
cvs gnu/cvs
|
||
rcs gnu/rcs
|
||
diff gnu/diff
|
||
tc yoyodyne/tc
|
||
@end example
|
||
|
||
The @file{modules} file is line oriented. In its simplest form each
|
||
line contains the name of the module, whitespace, and the directory
|
||
where the module resides. The directory is a path relative to
|
||
@code{$CVSROOT}. The last for lines in the example
|
||
above are examples of such lines.
|
||
|
||
@c FIXME: might want to introduce the concept of options in modules file
|
||
@c (the old example which was here, -i mkmodules, is obsolete).
|
||
|
||
The line that defines the module called @samp{modules}
|
||
uses features that are not explained here.
|
||
@xref{modules}, for a full explanation of all the
|
||
available features.
|
||
|
||
@subsection Editing administrative files
|
||
@cindex Editing administrative files
|
||
@cindex Administrative files, editing them
|
||
|
||
You edit the administrative files in the same way that you would edit
|
||
any other module. Use @samp{cvs checkout CVSROOT} to get a working
|
||
copy, edit it, and commit your changes in the normal way.
|
||
|
||
It is possible to commit an erroneous administrative
|
||
file. You can often fix the error and check in a new
|
||
revision, but sometimes a particularly bad error in the
|
||
administrative file makes it impossible to commit new
|
||
revisions.
|
||
@c @xref{Bad administrative files} for a hint
|
||
@c about how to solve such situations.
|
||
@c -- administrative file checking--
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Multiple repositories
|
||
@section Multiple repositories
|
||
@cindex Multiple repositories
|
||
@cindex Repositories, multiple
|
||
@cindex Many repositories
|
||
@cindex Parallel repositories
|
||
@cindex Disjoint repositories
|
||
@cindex CVSROOT, multiple repositories
|
||
|
||
In some situations it is a good idea to have more than
|
||
one repository, for instance if you have two
|
||
development groups that work on separate projects
|
||
without sharing any code. All you have to do to have
|
||
several repositories is to specify the appropriate
|
||
repository, using the @code{CVSROOT} environment
|
||
variable, the @samp{-d} option to @sc{cvs}, or (once
|
||
you have checked out a working directories) by
|
||
simply allowing @sc{cvs} to use the repository that was
|
||
used to check out the working directory (@pxref{Repository}).
|
||
|
||
Notwithstanding, it can be confusing to have two or
|
||
more repositories.
|
||
|
||
None of the examples in this manual show multiple
|
||
repositories.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Creating a repository
|
||
@section Creating a repository
|
||
@c -- Well, how do you do?
|
||
|
||
See the instructions in the @file{INSTALL} file in the
|
||
@sc{cvs} distribution.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Remote repositories
|
||
@section Remote repositories
|
||
@cindex Repositories, remote
|
||
@cindex Remote repositories
|
||
@cindex Client/Server Operation
|
||
|
||
Your working copy of the sources can be on a
|
||
different machine than the repository. Generally,
|
||
using a remote repository is just like using a local
|
||
one, except that the format of the repository name is:
|
||
|
||
@example
|
||
user@@hostname:/path/to/repository
|
||
@end example
|
||
|
||
The details of exactly what needs to be set up depend
|
||
on how you are connecting to the server.
|
||
|
||
@menu
|
||
* Connecting via rsh:: Using the @code{rsh} program to connect
|
||
* Password authenticated:: Direct connections using passwords
|
||
* Kerberos authenticated:: Direct connections with kerberos
|
||
@end menu
|
||
|
||
@node Connecting via rsh
|
||
@subsection Connecting with rsh
|
||
|
||
@cindex rsh
|
||
CVS uses the @file{rsh} protocol to perform these
|
||
operations, so the remote user host needs to have a
|
||
@file{.rhosts} file which grants access to the local
|
||
user.
|
||
|
||
For example, suppose you are the user @file{mozart} on
|
||
the local machine @file{anklet.grunge.com}, and the
|
||
server machine is @file{chainsaw.brickyard.com}. On
|
||
chainsaw, put the following line into the file
|
||
@file{.rhosts} in @file{bach}'s home directory:
|
||
|
||
@example
|
||
anklet.grunge.com mozart
|
||
@end example
|
||
|
||
Then test that @code{rsh} is working with
|
||
|
||
@example
|
||
rsh -l bach chainsaw.brickyard.com echo $PATH
|
||
@end example
|
||
|
||
@cindex CVS_SERVER
|
||
Next you have to make sure that @code{rsh} will be able
|
||
to find the server. Make sure that the path which
|
||
@code{rsh} printed in the above example includes the
|
||
directory containing a program named @code{cvs} which
|
||
is the server. You need to set the path in
|
||
@file{.bashrc}, @file{.cshrc}, etc., not @file{.login}
|
||
or @file{.profile}. Alternately, you can set the
|
||
environment variable @code{CVS_SERVER} on the client
|
||
machine to the filename of the server you want to use,
|
||
for example @file{/usr/local/bin/cvs-1.6}.
|
||
|
||
There is no need to edit @code{inetd.conf} or start a
|
||
@sc{cvs} server daemon.
|
||
|
||
Continuing our example, supposing you want to access
|
||
the module @file{foo} in the repository
|
||
@file{/usr/local/cvsroot/}, on machine
|
||
@file{chainsaw.brickyard.com}, you are ready to go:
|
||
|
||
@example
|
||
cvs -d bach@@chainsaw.brickyard.com:/user/local/cvsroot checkout foo
|
||
@end example
|
||
|
||
(The @file{bach@@} can be omitted if the username is
|
||
the same on both the local and remote hosts.)
|
||
|
||
@node Password authenticated
|
||
@subsection Direct connection with password authentication
|
||
|
||
The @sc{cvs} client can also connect to the server
|
||
using a password protocol. This is particularly useful
|
||
if using @code{rsh} is not feasible (for example,
|
||
the server is behind a firewall), and Kerberos also is
|
||
not available.
|
||
|
||
To use this method, it is necessary to make
|
||
some adjustments on both the server and client sides.
|
||
|
||
@menu
|
||
* Password authentication server:: Setting up the server
|
||
* Password authentication client:: Using the client
|
||
* Password authentication security:: What this method does and does not do
|
||
@end menu
|
||
|
||
@node Password authentication server
|
||
@subsubsection Setting up the server for password authentication
|
||
|
||
@cindex Pserver (subcommand)
|
||
@cindex password server, setting up
|
||
@cindex authenticating server, setting up
|
||
On the server side, the file @file{/etc/inetd.conf}
|
||
needs to be edited so @code{inetd} knows to run the
|
||
command @code{cvs pserver} when it receives a
|
||
connection on the right port. By default, the port
|
||
number is 2401; it would be different if your client
|
||
were compiled with @code{CVS_AUTH_PORT} defined to
|
||
something else, though.
|
||
|
||
If your @code{inetd} allows raw port numbers in
|
||
@file{/etc/inetd.conf}, then the following (all on a
|
||
single line in @file{inetd.conf}) should be sufficient:
|
||
|
||
@example
|
||
2401 stream tcp nowait root /usr/local/bin/cvs
|
||
cvs -b /usr/local/bin pserver
|
||
@end example
|
||
|
||
The @samp{-b} option specifies the directory which contains
|
||
the @sc{rcs} binaries on the server.
|
||
|
||
If your @code{inetd} wants a symbolic service
|
||
name instead of a raw port number, then put this in
|
||
@file{/etc/services}:
|
||
|
||
@example
|
||
cvspserver 2401/tcp
|
||
@end example
|
||
|
||
and put @code{cvspserver} instead of
|
||
@code{2401} in @file{inetd.conf}.
|
||
|
||
Once the above is taken care of, restart your
|
||
@code{inetd}, or do whatever is necessary to force it
|
||
to reread its initialization files.
|
||
|
||
@cindex CVS passwd file
|
||
@cindex passwd file
|
||
Because the client stores and transmits passwords in
|
||
cleartext (almost---see @ref{Password authentication
|
||
security} for details), a separate @sc{cvs} password
|
||
file may be used, so people don't compromise their
|
||
regular passwords when they access the repository.
|
||
This file is @file{$CVSROOT/CVSROOT/passwd}
|
||
(@pxref{Intro administrative files}). Its format is
|
||
similar to @file{/etc/passwd}, except that it only has
|
||
two fields, username and password. For example:
|
||
|
||
@example
|
||
bach:ULtgRLXo7NRxs
|
||
cwang:1sOp854gDF3DY
|
||
@end example
|
||
|
||
The password is encrypted according to the standard
|
||
Unix @code{crypt()} function, so it is possible to
|
||
paste in passwords directly from regular Unix
|
||
@file{passwd} files.
|
||
|
||
When authenticating a password, the server first checks
|
||
for the user in the @sc{cvs} @file{passwd} file. If it
|
||
finds the user, it compares against that password. If
|
||
it does not find the user, or if the @sc{cvs}
|
||
@file{passwd} file does not exist, then the server
|
||
tries to match the password using the system's
|
||
user-lookup routine. When using the @sc{cvs}
|
||
@file{passwd} file, the server runs under as the
|
||
username specified in the the third argument in the
|
||
entry, or as the first argument if there is no third
|
||
argument (in this way @sc{cvs} allows imaginary
|
||
usernames provided the @sc{cvs} @file{passwd} file
|
||
indicates corresponding valid system usernames). In
|
||
any case, @sc{cvs} will have no privileges which the
|
||
(valid) user would not have.
|
||
|
||
Right now, the only way to put a password in the
|
||
@sc{cvs} @file{passwd} file is to paste it there from
|
||
somewhere else. Someday, there may be a @code{cvs
|
||
passwd} command.
|
||
|
||
@node Password authentication client
|
||
@subsubsection Using the client with password authentication
|
||
@cindex Login (subcommand)
|
||
@cindex password client, using
|
||
@cindex authenticated client, using
|
||
Before connecting to the server, the client must @dfn{log
|
||
in} with the command @code{cvs login}. Logging in
|
||
verifies a password with the server, and also records
|
||
the password for later transactions with the server.
|
||
The @code{cvs login} command needs to know the
|
||
username, server hostname, and full repository path,
|
||
and it gets this information from the repository
|
||
argument or the @code{CVSROOT} environment variable.
|
||
|
||
@code{cvs login} is interactive --- it prompts for a
|
||
password:
|
||
|
||
@example
|
||
cvs -d bach@@chainsaw.brickyard.com:/usr/local/cvsroot login
|
||
CVS password:
|
||
@end example
|
||
|
||
The password is checked with the server; if it is
|
||
correct, the @code{login} succeeds, else it fails,
|
||
complaining that the password was incorrect.
|
||
|
||
Once you have logged in, you can force @sc{cvs} to
|
||
connect directly to the server and authenticate with
|
||
the stored password by prefixing the repository with
|
||
@samp{:pserver:}:
|
||
|
||
@example
|
||
cvs -d :pserver:bach@@chainsaw.brickyard.com:/usr/local/cvsroot checkout foo
|
||
@end example
|
||
|
||
The @samp{:pserver:} is necessary because without it,
|
||
@sc{cvs} will assume it should use @code{rsh} to
|
||
connect with the server (@pxref{Connecting via rsh}).
|
||
(Once you have a working copy checked out and are
|
||
running @sc{cvs} commands from within it, there is no
|
||
longer any need to specify the repository explicitly,
|
||
because @sc{cvs} records it in the working copy's
|
||
@file{CVS} subdirectory.)
|
||
|
||
@cindex CVS_PASSFILE, environment variable
|
||
Passwords are stored by default in the file
|
||
@file{$HOME/.cvspass}. Its format is human-readable,
|
||
but don't edit it unless you know what you are doing.
|
||
The passwords are not stored in cleartext, but are
|
||
trivially encoded to protect them from "innocent"
|
||
compromise (i.e., inadvertently being seen by a system
|
||
administrator who happens to look at that file).
|
||
|
||
The @code{CVS_PASSFILE} environment variable overrides
|
||
this default. If you use this variable, make sure you
|
||
set it @emph{before} @code{cvs login} is run. If you
|
||
were to set it after running @code{cvs login}, then
|
||
later @sc{cvs} commands would be unable to look up the
|
||
password for transmission to the server.
|
||
|
||
@cindex CVS_PASSWORD, environment variable
|
||
The @code{CVS_PASSWORD} environment variable overrides
|
||
@emph{all} stored passwords. If it is set, @sc{cvs}
|
||
will use it for all password-authenticated
|
||
connections.
|
||
|
||
@node Password authentication security
|
||
@subsubsection Security considerations with password authentication
|
||
|
||
The passwords are stored on the client side in a
|
||
trivial encoding of the cleartext, and transmitted in
|
||
the same encoding. The encoding is done only to
|
||
prevent inadvertent password compromises (i.e., a
|
||
system administrator accidentally looking at the file),
|
||
and will not prevent even a naive attacker from gaining
|
||
the password.
|
||
|
||
The separate @sc{cvs} password file (@pxref{Password
|
||
authentication server}) allows people
|
||
to use a different password for repository access than
|
||
for login access. On the other hand, once a user has
|
||
access to the repository, she can execute programs on
|
||
the server system through a variety of means. Thus, repository
|
||
access implies fairly broad system access as well. It
|
||
might be possible to modify @sc{cvs} to prevent that,
|
||
but no one has done so as of this writing.
|
||
Furthermore, there may be other ways in which having
|
||
access to @sc{cvs} allows people to gain more general
|
||
access to the system; noone has done a careful audit.
|
||
|
||
In summary, anyone who gets the password gets
|
||
repository access, and some measure of general system
|
||
access as well. The password is available to anyone
|
||
who can sniff network packets or read a protected
|
||
(i.e., user read-only) file. If you want real
|
||
security, get Kerberos.
|
||
|
||
@node Kerberos authenticated
|
||
@subsection Direct connection with kerberos
|
||
|
||
@cindex kerberos
|
||
The main disadvantage of using rsh is that all the data
|
||
needs to pass through additional programs, so it may be
|
||
slower. So if you have kerberos installed you can
|
||
connect via a direct @sc{tcp} connection,
|
||
authenticating with kerberos (note that the data
|
||
transmitted is @emph{not} encrypted).
|
||
|
||
To do this, @sc{cvs} needs to be compiled with kerberos
|
||
support; when configuring @sc{cvs} it tries to detect
|
||
whether kerberos is present or you can use the
|
||
@file{--with-krb4} flag to configure.
|
||
|
||
@cindex CVS_CLIENT_PORT
|
||
You need to edit @code{inetd.conf} on the server
|
||
machine to run @code{cvs kserver}. The client uses
|
||
port 1999 by default; if you want to use another port
|
||
specify it in the @code{CVS_CLIENT_PORT} environment
|
||
variable on the client. Set @code{CVS_CLIENT_PORT} to
|
||
@samp{-1} to force an rsh connection.
|
||
|
||
@cindex kinit
|
||
When you want to use @sc{cvs}, get a ticket in the
|
||
usual way (generally @code{kinit}); it must be a ticket
|
||
which allows you to log into the server machine. Then
|
||
you are ready to go:
|
||
|
||
@example
|
||
cvs -d chainsaw.brickyard.com:/user/local/cvsroot checkout foo
|
||
@end example
|
||
|
||
If @sc{cvs} fails to connect, it will fall back to
|
||
trying rsh.
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node Starting a new project
|
||
@chapter Starting a project with CVS
|
||
@cindex Starting a project with CVS
|
||
@cindex Creating a project
|
||
|
||
@comment --moduledb--
|
||
Since @sc{cvs} 1.x is bad at renaming files and moving
|
||
them between directories, the first thing you do when
|
||
you start a new project should be to think through your
|
||
file organization. It is not impossible---just
|
||
awkward---to rename or move files.
|
||
@xref{Moving files}.
|
||
|
||
What to do next depends on the situation at hand.
|
||
|
||
@menu
|
||
* Setting up the files:: Getting the files into the repository
|
||
* Defining the module:: How to make a module of the files
|
||
@end menu
|
||
@c -- File permissions!
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Setting up the files
|
||
@section Setting up the files
|
||
|
||
The first step is to create the files inside the repository. This can
|
||
be done in a couple of different ways.
|
||
|
||
@c -- The contributed scripts
|
||
@menu
|
||
* From files:: This method is useful with old projects
|
||
where files already exists.
|
||
* From other version control systems:: Old projects where you want to
|
||
preserve history from another system.
|
||
* From scratch:: Creating a module from scratch.
|
||
@end menu
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node From files
|
||
@subsection Creating a module from a number of files
|
||
@cindex Importing files
|
||
|
||
When you begin using @sc{cvs}, you will probably already have several
|
||
projects that can be
|
||
put under @sc{cvs} control. In these cases the easiest way is to use the
|
||
@code{import} command. An example is probably the easiest way to
|
||
explain how to use it. If the files you want to install in
|
||
@sc{cvs} reside in @file{@var{dir}}, and you want them to appear in the
|
||
repository as @file{$CVSROOT/yoyodyne/@var{dir}}, you can do this:
|
||
|
||
@example
|
||
$ cd @var{dir}
|
||
$ cvs import -m "Imported sources" yoyodyne/@var{dir} yoyo start
|
||
@end example
|
||
|
||
Unless you supply a log message with the @samp{-m}
|
||
flag, @sc{cvs} starts an editor and prompts for a
|
||
message. The string @samp{yoyo} is a @dfn{vendor tag},
|
||
and @samp{start} is a @dfn{release tag}. They may fill
|
||
no purpose in this context, but since @sc{cvs} requires
|
||
them they must be present. @xref{Tracking sources}, for
|
||
more information about them.
|
||
|
||
You can now verify that it worked, and remove your
|
||
original source directory.
|
||
|
||
@example
|
||
$ cd ..
|
||
$ mv @var{dir} @var{dir}.orig
|
||
$ cvs checkout yoyodyne/@var{dir} # @r{Explanation below}
|
||
$ ls -R yoyodyne
|
||
$ rm -r @var{dir}.orig
|
||
@end example
|
||
|
||
@noindent
|
||
Erasing the original sources is a good idea, to make sure that you do
|
||
not accidentally edit them in @var{dir}, bypassing @sc{cvs}.
|
||
Of course, it would be wise to make sure that you have
|
||
a backup of the sources before you remove them.
|
||
|
||
The @code{checkout} command can either take a module
|
||
name as argument (as it has done in all previous
|
||
examples) or a path name relative to @code{$CVSROOT},
|
||
as it did in the example above.
|
||
|
||
It is a good idea to check that the permissions
|
||
@sc{cvs} sets on the directories inside @samp{$CVSROOT}
|
||
are reasonable, and that they belong to the proper
|
||
groups. @xref{File permissions}.
|
||
|
||
@c The node name is too long, but I am having trouble
|
||
@c thinking of something more concise.
|
||
@node From other version control systems
|
||
@subsection Creating Files From Other Version Control Systems
|
||
@cindex Importing files, from other version control systesm
|
||
|
||
If you have a project which you are maintaining with
|
||
another version control system, such as @sc{rcs}, you
|
||
may wish to put the files from that project into
|
||
@sc{cvs}, and preserve the revision history of the
|
||
files.
|
||
|
||
@table @asis
|
||
@cindex RCS, importing files from
|
||
@item From RCS
|
||
If you have been using @sc{rcs}, find the @sc{rcs}
|
||
files---usually a file named @file{foo.c} will have its
|
||
@sc{rcs} file in @file{RCS/foo.c,v} (but it could be
|
||
other places; consult the @sc{rcs} documentation for
|
||
details). Then create the appropriate directories in
|
||
@sc{cvs} if they do not already exist. Then copy the
|
||
files into the appropriate directories in the @sc{cvs}
|
||
repository (the name in the repository must be the name
|
||
of the source file with @samp{,v} added; the files go
|
||
directly in the appopriate directory of the repository,
|
||
not in an @file{RCS} subdirectory). This is one of the
|
||
few times when it is a good idea to access the @sc{cvs}
|
||
repository directly, rather than using @sc{cvs}
|
||
commands. Then you are ready to check out a new
|
||
working directory.
|
||
@c Someday there probably should be a "cvs import -t
|
||
@c rcs" or some such. It could even create magic
|
||
@c branches. It could also do something about the case
|
||
@c where the RCS file had a (non-magic) "0" branch.
|
||
|
||
@c How many is "many"? Or do they just import RCS files?
|
||
@item From another version control system
|
||
Many version control systems have the ability to export
|
||
@sc{rcs} files in the standard format. If yours does,
|
||
export the @sc{rcs} files and then follow the above
|
||
instructions.
|
||
|
||
@cindex SCCS, importing files from
|
||
@item From SCCS
|
||
There is a script in the @file{contrib} directory of
|
||
the @sc{cvs} source distribution called @file{sccs2rcs}
|
||
which converts @sc{sccs} files to @sc{rcs} files.
|
||
Note: you must run it on a machine which has both
|
||
@sc{sccs} and @sc{rcs} installed, and like everything
|
||
else in contrib it is unsupported (your mileage may
|
||
vary).
|
||
@end table
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node From scratch
|
||
@subsection Creating a module from scratch
|
||
|
||
For a new project, the easiest thing to do is probably
|
||
to create an empty directory structure, like this:
|
||
|
||
@example
|
||
$ mkdir tc
|
||
$ mkdir tc/man
|
||
$ mkdir tc/testing
|
||
@end example
|
||
|
||
After that, you use the @code{import} command to create
|
||
the corresponding (empty) directory structure inside
|
||
the repository:
|
||
|
||
@example
|
||
$ cd tc
|
||
$ cvs import -m "Created directory structure" yoyodyne/@var{dir} yoyo start
|
||
@end example
|
||
|
||
Then, use @code{add} to add files (and new directories)
|
||
as they appear.
|
||
|
||
Check that the permissions @sc{cvs} sets on the
|
||
directories inside @samp{$CVSROOT} are reasonable.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Defining the module
|
||
@section Defining the module
|
||
@cindex Defining a module
|
||
@cindex Editing the modules file
|
||
@cindex Module, defining
|
||
@cindex Modules file, changing
|
||
|
||
The next step is to define the module in the
|
||
@file{modules} file. This is not strictly necessary,
|
||
but modules can be convenient in grouping together
|
||
related files and directories.
|
||
|
||
In simple cases these steps are sufficient to define a module.
|
||
|
||
@enumerate
|
||
@item
|
||
Get a working copy of the modules file.
|
||
|
||
@example
|
||
$ cvs checkout modules
|
||
$ cd modules
|
||
@end example
|
||
|
||
@item
|
||
Edit the file and insert a line that defines the module. @xref{Intro
|
||
administrative files}, for an introduction. @xref{modules}, for a full
|
||
description of the modules file. You can use the
|
||
following line to define the module @samp{tc}:
|
||
|
||
@example
|
||
tc yoyodyne/tc
|
||
@end example
|
||
|
||
@item
|
||
Commit your changes to the modules file.
|
||
|
||
@example
|
||
$ cvs commit -m "Added the tc module." modules
|
||
@end example
|
||
|
||
@item
|
||
Release the modules module.
|
||
|
||
@example
|
||
$ cd ..
|
||
$ cvs release -d modules
|
||
@end example
|
||
@end enumerate
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node Multiple developers
|
||
@chapter Multiple developers
|
||
@cindex Multiple developers
|
||
@cindex Team of developers
|
||
@cindex File locking
|
||
@cindex Locking files
|
||
@cindex Working copy
|
||
|
||
When more than one person works on a software project
|
||
things often get complicated. Often, two people try to
|
||
edit the same file simultaneously. Some other version
|
||
control systems (including @sc{rcs} and @sc{sccs})
|
||
try to solve that particular problem by introducing
|
||
@dfn{file locking}, so that only one person can edit
|
||
each file at a time. Unfortunately, file locking can
|
||
be very counter-productive. If two persons want
|
||
to edit different parts of a file, there may be no
|
||
reason to prevent either of them from doing so.
|
||
|
||
@sc{cvs} does not use file locking. Instead, it allows many
|
||
people to edit their own @dfn{working copy} of a file
|
||
simultaneously. The first person that commits his
|
||
changes has no automatic way of knowing that another has started to
|
||
edit it. Others will get an error message when they
|
||
try to commit the file. They must then use @sc{cvs}
|
||
commands to bring their working copy up to date with
|
||
the repository revision. This process is almost
|
||
automatic, and explained in this chapter.
|
||
|
||
There are many ways to organize a team of developers.
|
||
@sc{cvs} does not try to enforce a certain
|
||
organization. It is a tool that can be used in several
|
||
ways. It is often useful to inform the group of
|
||
commits you have done. @sc{cvs} has several ways of
|
||
automating that process. @xref{Informing others}.
|
||
@xref{Revision management}, for more tips on how to use
|
||
@sc{cvs}.
|
||
|
||
@menu
|
||
* File status:: A file can be in several states
|
||
* Updating a file:: Bringing a file up-to-date
|
||
* Conflicts example:: An informative example
|
||
* Informing others:: To cooperate you must inform
|
||
* Concurrency:: Simultaneous repository access
|
||
* Watches:: Mechanisms to track who is editing files
|
||
@end menu
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node File status
|
||
@section File status
|
||
@cindex File status
|
||
@cindex Status of a file
|
||
@cindex Four states of a file
|
||
|
||
After you have checked out a file out from @sc{cvs}, it is in
|
||
one of these four states:
|
||
|
||
@table @asis
|
||
@cindex Up-to-date
|
||
@item Up-to-date
|
||
The file is identical with the latest revision in the
|
||
repository.
|
||
@c -- The above is not always true if branching is used.
|
||
|
||
@item Locally modified
|
||
@cindex Locally modified
|
||
You have edited the file, and not yet committed your changes.
|
||
|
||
@item Needing update
|
||
@cindex Needing update
|
||
Someone else has committed a newer revision to the repository.
|
||
|
||
@item Needing merge
|
||
@cindex Needing merge
|
||
Someone else have committed a newer revision to the repository, and you
|
||
have also made modifications to the file.
|
||
@c -- What about "added" "removed" and so on?
|
||
@end table
|
||
|
||
You can use the @code{status} command to find out the status of a given
|
||
file. @xref{status}.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Updating a file
|
||
@section Bringing a file up to date
|
||
@cindex Bringing a file up to date
|
||
@cindex Updating a file
|
||
@cindex Merging a file
|
||
@cindex update, introduction
|
||
|
||
When you want to update or merge a file, use the @code{update}
|
||
command. For files that are not up to date this is roughly equivalent
|
||
to a @code{checkout} command: the newest revision of the file is
|
||
extracted from the repository and put in your working copy of the
|
||
module.
|
||
|
||
Your modifications to a file are never lost when you
|
||
use @code{update}. If no newer revision exists,
|
||
running @code{update} has no effect. If you have
|
||
edited the file, and a newer revision is available,
|
||
@sc{cvs} will merge all changes into your working copy.
|
||
|
||
For instance, imagine that you checked out revision 1.4 and started
|
||
editing it. In the meantime someone else committed revision 1.5, and
|
||
shortly after that revision 1.6. If you run @code{update} on the file
|
||
now, @sc{cvs} will incorporate all changes between revision 1.4 and 1.6 into
|
||
your file.
|
||
|
||
@cindex Overlap
|
||
If any of the changes between 1.4 and 1.6 were made too
|
||
close to any of the changes you have made, an
|
||
@dfn{overlap} occurs. In such cases a warning is
|
||
printed, and the resulting file includes both
|
||
versions of the lines that overlap, delimited by
|
||
special markers.
|
||
@xref{update}, for a complete description of the
|
||
@code{update} command.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Conflicts example
|
||
@section Conflicts example
|
||
@cindex Merge, an example
|
||
@cindex Example of merge
|
||
@cindex driver.c (merge example)
|
||
|
||
Suppose revision 1.4 of @file{driver.c} contains this:
|
||
|
||
@example
|
||
#include <stdio.h>
|
||
|
||
void main()
|
||
@{
|
||
parse();
|
||
if (nerr == 0)
|
||
gencode();
|
||
else
|
||
fprintf(stderr, "No code generated.\n");
|
||
exit(nerr == 0 ? 0 : 1);
|
||
@}
|
||
@end example
|
||
|
||
@noindent
|
||
Revision 1.6 of @file{driver.c} contains this:
|
||
|
||
@example
|
||
#include <stdio.h>
|
||
|
||
int main(int argc,
|
||
char **argv)
|
||
@{
|
||
parse();
|
||
if (argc != 1)
|
||
@{
|
||
fprintf(stderr, "tc: No args expected.\n");
|
||
exit(1);
|
||
@}
|
||
if (nerr == 0)
|
||
gencode();
|
||
else
|
||
fprintf(stderr, "No code generated.\n");
|
||
exit(!!nerr);
|
||
@}
|
||
@end example
|
||
|
||
@noindent
|
||
Your working copy of @file{driver.c}, based on revision
|
||
1.4, contains this before you run @samp{cvs update}:
|
||
@c -- Really include "cvs"?
|
||
|
||
@example
|
||
#include <stdlib.h>
|
||
#include <stdio.h>
|
||
|
||
void main()
|
||
@{
|
||
init_scanner();
|
||
parse();
|
||
if (nerr == 0)
|
||
gencode();
|
||
else
|
||
fprintf(stderr, "No code generated.\n");
|
||
exit(nerr == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
|
||
@}
|
||
@end example
|
||
|
||
@noindent
|
||
You run @samp{cvs update}:
|
||
@c -- Really include "cvs"?
|
||
|
||
@example
|
||
$ cvs update driver.c
|
||
RCS file: /usr/local/cvsroot/yoyodyne/tc/driver.c,v
|
||
retrieving revision 1.4
|
||
retrieving revision 1.6
|
||
Merging differences between 1.4 and 1.6 into driver.c
|
||
rcsmerge warning: overlaps during merge
|
||
cvs update: conflicts found in driver.c
|
||
C driver.c
|
||
@end example
|
||
|
||
@noindent
|
||
@cindex Conflicts (merge example)
|
||
@sc{cvs} tells you that there were some conflicts.
|
||
Your original working file is saved unmodified in
|
||
@file{.#driver.c.1.4}. The new version of
|
||
@file{driver.c} contains this:
|
||
|
||
@example
|
||
#include <stdlib.h>
|
||
#include <stdio.h>
|
||
|
||
int main(int argc,
|
||
char **argv)
|
||
@{
|
||
init_scanner();
|
||
parse();
|
||
if (argc != 1)
|
||
@{
|
||
fprintf(stderr, "tc: No args expected.\n");
|
||
exit(1);
|
||
@}
|
||
if (nerr == 0)
|
||
gencode();
|
||
else
|
||
fprintf(stderr, "No code generated.\n");
|
||
<<<<<<< driver.c
|
||
exit(nerr == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
|
||
=======
|
||
exit(!!nerr);
|
||
>>>>>>> 1.6
|
||
@}
|
||
@end example
|
||
|
||
@noindent
|
||
@cindex Markers, conflict
|
||
@cindex Conflict markers
|
||
@cindex <<<<<<<
|
||
@cindex >>>>>>>
|
||
@cindex =======
|
||
|
||
Note how all non-overlapping modifications are incorporated in your working
|
||
copy, and that the overlapping section is clearly marked with
|
||
@samp{<<<<<<<}, @samp{=======} and @samp{>>>>>>>}.
|
||
|
||
@cindex Resolving a conflict
|
||
@cindex Conflict resolution
|
||
You resolve the conflict by editing the file, removing the markers and
|
||
the erroneous line. Suppose you end up with this file:
|
||
@c -- Add xref to the pcl-cvs manual when it talks
|
||
@c -- about this.
|
||
@example
|
||
#include <stdlib.h>
|
||
#include <stdio.h>
|
||
|
||
int main(int argc,
|
||
char **argv)
|
||
@{
|
||
init_scanner();
|
||
parse();
|
||
if (argc != 1)
|
||
@{
|
||
fprintf(stderr, "tc: No args expected.\n");
|
||
exit(1);
|
||
@}
|
||
if (nerr == 0)
|
||
gencode();
|
||
else
|
||
fprintf(stderr, "No code generated.\n");
|
||
exit(nerr == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
|
||
@}
|
||
@end example
|
||
|
||
@noindent
|
||
You can now go ahead and commit this as revision 1.7.
|
||
|
||
@example
|
||
$ cvs commit -m "Initialize scanner. Use symbolic exit values." driver.c
|
||
Checking in driver.c;
|
||
/usr/local/cvsroot/yoyodyne/tc/driver.c,v <-- driver.c
|
||
new revision: 1.7; previous revision: 1.6
|
||
done
|
||
@end example
|
||
|
||
@cindex emerge
|
||
If you use release 1.04 or later of pcl-cvs (a @sc{gnu}
|
||
Emacs front-end for @sc{cvs}) you can use an Emacs
|
||
package called emerge to help you resolve conflicts.
|
||
See the documentation for pcl-cvs.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Informing others
|
||
@section Informing others about commits
|
||
@cindex Informing others
|
||
@cindex Spreading information
|
||
@cindex Mail, automatic mail on commit
|
||
|
||
It is often useful to inform others when you commit a
|
||
new revision of a file. The @samp{-i} option of the
|
||
@file{modules} file, or the @file{loginfo} file, can be
|
||
used to automate this process. @xref{modules}.
|
||
@xref{loginfo}. You can use these features of @sc{cvs}
|
||
to, for instance, instruct @sc{cvs} to mail a
|
||
message to all developers, or post a message to a local
|
||
newsgroup.
|
||
@c -- More text would be nice here.
|
||
|
||
@node Concurrency
|
||
@section Several developers simultaneously attempting to run CVS
|
||
|
||
@cindex locks, cvs
|
||
If several developers try to run @sc{cvs} at the same
|
||
time, one may get the following message:
|
||
|
||
@example
|
||
[11:43:23] waiting for bach's lock in /usr/local/cvsroot/foo
|
||
@end example
|
||
|
||
@sc{cvs} will try again every 30 seconds, and either
|
||
continue with the operation or print the message again,
|
||
if it still needs to wait. If a lock seems to stick
|
||
around for an undue amount of time, find the person
|
||
holding the lock and ask them about the cvs command
|
||
they are running. If they aren't running a cvs
|
||
command, look for and remove files starting with
|
||
@file{#cvs.tfl}, @file{#cvs.rfl}, or @file{#cvs.wfl}
|
||
from the repository.
|
||
|
||
Note that these locks are to protect @sc{cvs}'s
|
||
internal data structures and have no relationship to
|
||
the word @dfn{lock} in the sense used by @sc{rcs}--a
|
||
way to prevent other developers from working on a
|
||
particular file.
|
||
|
||
Any number of people can be reading from a given
|
||
repository at a time; only when someone is writing do
|
||
the locks prevent other people from reading or writing.
|
||
|
||
@cindex Atomic transactions, lack of
|
||
@cindex Transactions, atomic, lack of
|
||
One might hope for the following property
|
||
|
||
@example
|
||
If someone commits some changes in one cvs command,
|
||
then an update by someone else will either get all the
|
||
changes, or none of them.
|
||
@end example
|
||
|
||
but @sc{cvs} does @emph{not} have this property. For
|
||
example, given the files
|
||
|
||
@example
|
||
a/one.c
|
||
a/two.c
|
||
b/three.c
|
||
b/four.c
|
||
@end example
|
||
|
||
if someone runs
|
||
|
||
@example
|
||
cvs ci a/two.c b/three.c
|
||
@end example
|
||
|
||
and someone else runs @code{cvs update} at the same
|
||
time, the person running @code{update} might get only
|
||
the change to @file{b/three.c} and not the change to
|
||
@file{a/two.c}.
|
||
|
||
@node Watches
|
||
@section Mechanisms to track who is editing files
|
||
@cindex Watches
|
||
|
||
For many groups, use of @sc{cvs} in its default mode is
|
||
perfectly satisfactory. Users may sometimes go to
|
||
check in a modification only to find that another
|
||
modification has intervened, but they deal with it and
|
||
proceed with their check in. Other groups prefer to be
|
||
able to know who is editing what files, so that if two
|
||
people try to edit the same file they can choose to
|
||
talk about who is doing what when rather than be
|
||
surprised at check in time. The features in this
|
||
section allow such coordination, while retaining the
|
||
ability of two developers to edit the same file at the
|
||
same time.
|
||
|
||
For maximum benefit developers should use @code{cvs
|
||
edit} (not @code{chmod}) to make files read-write to
|
||
edit them, and @code{cvs release} (not @code{rm}) to
|
||
discard a working directory which is no longer in use,
|
||
but @sc{cvs} is not able to enforce this behavior.
|
||
|
||
@c I'm a little dissatisfied with this presentation,
|
||
@c because "watch on"/"edit"/"editors" are one set of
|
||
@c functionality, and "watch add"/"watchers" is another
|
||
@c which is somewhat orthogonal even though they interact in
|
||
@c various ways. But I think it might be
|
||
@c confusing to describe them separately (e.g. "watch
|
||
@c add" with loginfo). I don't know.
|
||
|
||
@menu
|
||
* Setting a watch:: Telling CVS to watch certain files
|
||
* Getting Notified:: Telling CVS to notify you
|
||
* Editing files:: How to edit a file which is being watched
|
||
* Watch information:: Information about who is watching and editing
|
||
* Watches Compatibility:: Watches interact poorly with CVS 1.6 or earlier
|
||
@end menu
|
||
|
||
@node Setting a watch
|
||
@subsection Telling CVS to watch certain files
|
||
|
||
To enable the watch features, you first specify that
|
||
certain files are to be watched.
|
||
|
||
@cindex watch on (subcommand)
|
||
@deffn Command {cvs watch on} [@code{-l}] files @dots{}
|
||
|
||
Specify that developers should run @code{cvs edit}
|
||
before editing @var{files}. CVS will create working
|
||
copies of @var{files} read-only, to remind developers
|
||
to run the @code{cvs edit} command before working on
|
||
them.
|
||
|
||
If @var{files} includes the name of a directory, CVS
|
||
arranges to watch all files added to the corresponding
|
||
repository directory, and sets a default for files
|
||
added in the future; this allows the user to set
|
||
notification policies on a per-directory basis. The
|
||
contents of the directory are processed recursively,
|
||
unless the @code{-l} option is given.
|
||
|
||
If @var{files} is omitted, it defaults to the current directory.
|
||
|
||
@cindex watch off (subcommand)
|
||
@end deffn
|
||
|
||
@deffn Command {cvs watch off} [@code{-l}] files @dots{}
|
||
|
||
Do not provide notification about work on @var{files}. CVS will create
|
||
working copies of @var{files} read-write.
|
||
|
||
The @var{files} and @code{-l} arguments are processed as for @code{cvs
|
||
watch on}.
|
||
|
||
@end deffn
|
||
|
||
@node Getting Notified
|
||
@subsection Telling CVS to notify you
|
||
|
||
You can tell @sc{cvs} that you want to receive
|
||
notifications about various actions taken on a file.
|
||
You can do this without using @code{cvs watch on} for
|
||
the file, but generally you will want to use @code{cvs
|
||
watch on}, so that developers use the @code{cvs edit}
|
||
command.
|
||
|
||
@cindex watch add (subcommand)
|
||
@deffn Command {cvs watch add} [@code{-a} action] [@code{-l}] files @dots{}
|
||
|
||
Add the current user to the list of people to receive notification of
|
||
work done on @var{files}.
|
||
|
||
The @code{-a} option specifies what kinds of events CVS should notify
|
||
the user about. @var{action} is one of the following:
|
||
|
||
@table @code
|
||
|
||
@item edit
|
||
Another user has applied the @code{cvs edit} command (described
|
||
below) to a file.
|
||
|
||
@item unedit
|
||
Another user has applied the @code{cvs unedit} command (described
|
||
below) or the @code{cvs release} command to a file, or has deleted
|
||
the file and allowed @code{cvs update} to recreate it.
|
||
|
||
@item commit
|
||
Another user has committed changes to a file.
|
||
|
||
@item all
|
||
All of the above.
|
||
|
||
@item none
|
||
None of the above. (This is useful with @code{cvs edit},
|
||
described below.)
|
||
|
||
@end table
|
||
|
||
The @code{-a} option may appear more than once, or not at all. If
|
||
omitted, the action defaults to @code{all}.
|
||
|
||
The @var{files} and @code{-l} option are processed as for the
|
||
@code{cvs watch} commands.
|
||
|
||
@end deffn
|
||
|
||
|
||
@cindex watch remove (subcommand)
|
||
@deffn Command {cvs watch remove} [@code{-a} action] [@code{-l}] files @dots{}
|
||
|
||
Remove a notification request established using @code{cvs watch add};
|
||
the arguments are the same. If the @code{-a} option is present, only
|
||
watches for the specified actions are removed.
|
||
|
||
@end deffn
|
||
|
||
When the conditions exist for notification, @sc{cvs}
|
||
calls the @file{notify} administrative file, passing it
|
||
the user to receive the notification and the user who
|
||
is taking the action which results in notification.
|
||
Normally @file{notify} will just send an email message.
|
||
|
||
@cindex users (admin file)
|
||
Note that if you set this up in the straightforward
|
||
way, users receive notifications on the server machine.
|
||
One could of course write a @file{notify} script which
|
||
directed notifications elsewhere, but to make this
|
||
easy, @sc{cvs} allows you to associate a notification
|
||
address for each user. To do so create a file
|
||
@file{users} in @file{CVSROOT} with a line for each
|
||
user in the format @var{user}:@var{value}. Then
|
||
instead of passing the name of the user to be notified
|
||
to @file{notify}, @sc{cvs} will pass the @var{value}
|
||
(normally an email address on some other machine).
|
||
|
||
@node Editing files
|
||
@subsection How to edit a file which is being watched
|
||
|
||
Since a file which is being watched is checked out
|
||
read-only, you cannot simply edit it. To make it
|
||
read-write, and inform others that you are planning
|
||
to edit it, use the @code{cvs edit} command.
|
||
|
||
@cindex edit (subcommand)
|
||
@deffn Command {cvs edit} [options] files @dots{}
|
||
|
||
Prepare to edit the working files @var{files}. CVS makes the
|
||
@var{files} read-write, and notifies users who have requested
|
||
@code{edit} notification for any of @var{files}.
|
||
|
||
The @code{cvs edit} command accepts the same @var{options} as the
|
||
@code{cvs watch add} command, and establishes a temporary watch for the
|
||
user on @var{files}; CVS will remove the watch when @var{files} are
|
||
@code{unedit}ed or @code{commit}ted. If the user does not wish to
|
||
receive notifications, she should specify @code{-a none}.
|
||
|
||
The @var{files} and @code{-l} option are processed as for the @code{cvs
|
||
watch} commands.
|
||
|
||
@end deffn
|
||
|
||
Normally when you are done with a set of changes, you
|
||
use the @code{cvs commit} command, which checks in your
|
||
changes and returns the watched files to their usual
|
||
read-only state. But if you instead decide to abandon
|
||
your changes, or not to make any changes, you can use
|
||
the @code{cvs unedit} command.
|
||
|
||
@cindex unedit (subcommand)
|
||
@deffn Command {cvs unedit} [@code{-l}] files @dots{}
|
||
|
||
Abandon work on the working files @var{files}, and revert them to the
|
||
repository versions on which they are based. CVS makes those
|
||
@var{files} read-only for which users have requested notification using
|
||
@code{cvs watch on}. CVS notifies users who have requested @code{unedit}
|
||
notification for any of @var{files}.
|
||
|
||
The @var{files} and @code{-l} option are processed as for the
|
||
@code{cvs watch} commands.
|
||
|
||
@end deffn
|
||
|
||
When using client/server @sc{cvs}, you can use the
|
||
@code{cvs edit} and @code{cvs unedit} commands even if
|
||
@sc{cvs} is unable to succesfully communicate with the
|
||
server; the notifications will be sent upon the next
|
||
successful @sc{cvs} command.
|
||
|
||
@node Watch information
|
||
@subsection Information about who is watching and editing
|
||
|
||
@cindex watchers (subcommand)
|
||
@deffn Command {cvs watchers} [@code{-l}] files @dots{}
|
||
|
||
List the users currently watching changes to @var{files}. The report
|
||
includes the files being watched, and the mail address of each watcher.
|
||
|
||
The @var{files} and @code{-l} arguments are processed as for the
|
||
@code{cvs watch} commands.
|
||
|
||
@end deffn
|
||
|
||
|
||
@cindex editors (subcommand)
|
||
@deffn Command {cvs editors} [@code{-l}] files @dots{}
|
||
|
||
List the users currently working on @var{files}. The report
|
||
includes the mail address of each user, the time when the user began
|
||
working with the file, and the host and path of the working directory
|
||
containing the file.
|
||
|
||
The @var{files} and @code{-l} arguments are processed as for the
|
||
@code{cvs watch} commands.
|
||
|
||
@end deffn
|
||
|
||
@node Watches Compatibility
|
||
@subsection Using watches with old versions of CVS
|
||
|
||
@cindex CVS 1.6, and watches
|
||
If you use the watch features on a repository, it
|
||
creates @file{CVS} directories in the repository and
|
||
stores the information about watches in that directory.
|
||
If you attempt to use @sc{cvs} 1.6 or earlier with the
|
||
repository, you get an error message such as
|
||
|
||
@example
|
||
cvs update: cannot open CVS/Entries for reading: No such file or directory
|
||
@end example
|
||
|
||
and your operation will likely be aborted. To use the
|
||
watch features, you must upgrade all copies of @sc{cvs}
|
||
which use that repository in local or server mode. If
|
||
you cannot upgrade, use the @code{watch off} and
|
||
@code{watch remove} commands to remove all watches, and
|
||
that will restore the repository to a state which
|
||
@sc{cvs} 1.6 can cope with.
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node Branches
|
||
@chapter Branches
|
||
@cindex Branches
|
||
@cindex Main trunk and branches
|
||
@cindex Revision tree, making branches
|
||
|
||
So far, all revisions shown in this manual have been on
|
||
the @dfn{main trunk}
|
||
of the revision tree, i.e., all revision numbers
|
||
have been of the form @var{x}.@var{y}. One useful
|
||
feature, especially when maintaining several releases
|
||
of a software product at once, is the ability to make
|
||
branches on the revision tree. @dfn{Tags}, symbolic
|
||
names for revisions, will also be
|
||
introduced in this chapter.
|
||
|
||
@menu
|
||
* Tags:: Tags--Symbolic revisions
|
||
* Branches motivation:: What branches are good for
|
||
* Creating a branch:: Creating a branch
|
||
* Sticky tags:: Sticky tags
|
||
@end menu
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Tags
|
||
@section Tags--Symbolic revisions
|
||
@cindex Tags
|
||
|
||
The revision numbers live a life of their own. They
|
||
need not have anything at all to do with the release
|
||
numbers of your software product. Depending
|
||
on how you use @sc{cvs} the revision numbers might change several times
|
||
between two releases. As an example, some of the
|
||
source files that make up @sc{rcs} 5.6 have the following
|
||
revision numbers:
|
||
@cindex RCS revision numbers
|
||
|
||
@example
|
||
ci.c 5.21
|
||
co.c 5.9
|
||
ident.c 5.3
|
||
rcs.c 5.12
|
||
rcsbase.h 5.11
|
||
rcsdiff.c 5.10
|
||
rcsedit.c 5.11
|
||
rcsfcmp.c 5.9
|
||
rcsgen.c 5.10
|
||
rcslex.c 5.11
|
||
rcsmap.c 5.2
|
||
rcsutil.c 5.10
|
||
@end example
|
||
|
||
@cindex tag, command, introduction
|
||
@cindex Tag, symbolic name
|
||
@cindex Symbolic name (tag)
|
||
@cindex Name, symbolic (tag)
|
||
You can use the @code{tag} command to give a symbolic name to a
|
||
certain revision of a file. You can use the @samp{-v} flag to the
|
||
@code{status} command to see all tags that a file has, and
|
||
which revision numbers they represent. Tag names can
|
||
contain uppercase and lowercase letters, digits,
|
||
@samp{-}, and @samp{_}. The two tag names @code{BASE}
|
||
and @code{HEAD} are reserved for use by @sc{cvs}. It
|
||
is expected that future names which are special to
|
||
@sc{cvs} will contain characters such as @samp{%} or
|
||
@samp{=}, rather than being named analogously to
|
||
@code{BASE} and @code{HEAD}, to avoid conflicts with
|
||
actual tag names.
|
||
@c FIXME: is the above list of valid characters in tag
|
||
@c names complete?
|
||
|
||
@cindex Adding a tag
|
||
@cindex tag, example
|
||
The following example shows how you can add a tag to a
|
||
file. The commands must be issued inside your working
|
||
copy of the module. That is, you should issue the
|
||
command in the directory where @file{backend.c}
|
||
resides.
|
||
|
||
@example
|
||
$ cvs tag release-0-4 backend.c
|
||
T backend.c
|
||
$ cvs status -v backend.c
|
||
===================================================================
|
||
File: backend.c Status: Up-to-date
|
||
|
||
Version: 1.4 Tue Dec 1 14:39:01 1992
|
||
RCS Version: 1.4 /usr/local/cvsroot/yoyodyne/tc/backend.c,v
|
||
Sticky Tag: (none)
|
||
Sticky Date: (none)
|
||
Sticky Options: (none)
|
||
|
||
Existing Tags:
|
||
release-0-4 (revision: 1.4)
|
||
|
||
@end example
|
||
|
||
There is seldom reason to tag a file in isolation. A more common use is
|
||
to tag all the files that constitute a module with the same tag at
|
||
strategic points in the development life-cycle, such as when a release
|
||
is made.
|
||
|
||
@example
|
||
$ cvs tag release-1-0 .
|
||
cvs tag: Tagging .
|
||
T Makefile
|
||
T backend.c
|
||
T driver.c
|
||
T frontend.c
|
||
T parser.c
|
||
@end example
|
||
|
||
(When you give @sc{cvs} a directory as argument, it generally applies the
|
||
operation to all the files in that directory, and (recursively), to any
|
||
subdirectories that it may contain. @xref{Recursive behavior}.)
|
||
|
||
@cindex Retrieving an old revision using tags
|
||
@cindex Tag, retrieving old revisions
|
||
The @code{checkout} command has a flag, @samp{-r}, that lets you check out
|
||
a certain revision of a module. This flag makes it easy to
|
||
retrieve the sources that make up release 1.0 of the module @samp{tc} at
|
||
any time in the future:
|
||
|
||
@example
|
||
$ cvs checkout -r release-1-0 tc
|
||
@end example
|
||
|
||
@noindent
|
||
This is useful, for instance, if someone claims that there is a bug in
|
||
that release, but you cannot find the bug in the current working copy.
|
||
|
||
You can also check out a module as it was at any given date.
|
||
@xref{checkout options}.
|
||
|
||
When you tag more than one file with the same tag you
|
||
can think about the tag as "a curve drawn through a
|
||
matrix of filename vs. revision number." Say we have 5
|
||
files with the following revisions:
|
||
|
||
@example
|
||
@group
|
||
file1 file2 file3 file4 file5
|
||
|
||
1.1 1.1 1.1 1.1 /--1.1* <-*- TAG
|
||
1.2*- 1.2 1.2 -1.2*-
|
||
1.3 \- 1.3*- 1.3 / 1.3
|
||
1.4 \ 1.4 / 1.4
|
||
\-1.5*- 1.5
|
||
1.6
|
||
@end group
|
||
@end example
|
||
|
||
At some time in the past, the @code{*} versions were tagged.
|
||
You can think of the tag as a handle attached to the curve
|
||
drawn through the tagged revisions. When you pull on
|
||
the handle, you get all the tagged revisions. Another
|
||
way to look at it is that you "sight" through a set of
|
||
revisions that is "flat" along the tagged revisions,
|
||
like this:
|
||
|
||
@example
|
||
@group
|
||
file1 file2 file3 file4 file5
|
||
|
||
1.1
|
||
1.2
|
||
1.1 1.3 _
|
||
1.1 1.2 1.4 1.1 /
|
||
1.2*----1.3*----1.5*----1.2*----1.1 (--- <--- Look here
|
||
1.3 1.6 1.3 \_
|
||
1.4 1.4
|
||
1.5
|
||
@end group
|
||
@end example
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Branches motivation
|
||
@section What branches are good for
|
||
@cindex Branches motivation
|
||
@cindex What branches are good for
|
||
@cindex Motivation for branches
|
||
|
||
Suppose that release 1.0 of tc has been made. You are continuing to
|
||
develop tc, planning to create release 1.1 in a couple of months. After a
|
||
while your customers start to complain about a fatal bug. You check
|
||
out release 1.0 (@pxref{Tags}) and find the bug
|
||
(which turns out to have a trivial fix). However, the current revision
|
||
of the sources are in a state of flux and are not expected to be stable
|
||
for at least another month. There is no way to make a
|
||
bugfix release based on the newest sources.
|
||
|
||
The thing to do in a situation like this is to create a @dfn{branch} on
|
||
the revision trees for all the files that make up
|
||
release 1.0 of tc. You can then make
|
||
modifications to the branch without disturbing the main trunk. When the
|
||
modifications are finished you can select to either incorporate them on
|
||
the main trunk, or leave them on the branch.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Creating a branch
|
||
@section Creating a branch
|
||
@cindex Creating a branch
|
||
@cindex Branch, creating a
|
||
@cindex rtag, creating a branch using
|
||
|
||
@c FIXME: should be more explicit about the value of
|
||
@c having a tag on the branchpoint. Also should talk
|
||
@c about creating a branch with tag not rtag.
|
||
The @code{rtag} command can be used to create a branch.
|
||
The @code{rtag} command is much like @code{tag}, but it
|
||
does not require that you have a working copy of the
|
||
module. @xref{rtag}. (You can also use the @code{tag}
|
||
command; @pxref{tag}).
|
||
|
||
@example
|
||
$ cvs rtag -b -r release-1-0 release-1-0-patches tc
|
||
@end example
|
||
|
||
The @samp{-b} flag makes @code{rtag} create a branch
|
||
(rather than just a symbolic revision name). @samp{-r
|
||
release-1-0} says that this branch should be rooted at the node (in
|
||
the revision tree) that corresponds to the tag
|
||
@samp{release-1-0}. Note that the numeric revision number that matches
|
||
@samp{release-1-0} will probably be different from file to file. The
|
||
name of the new branch is @samp{release-1-0-patches}, and the
|
||
module affected is @samp{tc}.
|
||
|
||
To fix the problem in release 1.0, you need a working
|
||
copy of the branch you just created.
|
||
|
||
@example
|
||
$ cvs checkout -r release-1-0-patches tc
|
||
$ cvs status -v driver.c backend.c
|
||
===================================================================
|
||
File: driver.c Status: Up-to-date
|
||
|
||
Version: 1.7 Sat Dec 5 18:25:54 1992
|
||
RCS Version: 1.7 /usr/local/cvsroot/yoyodyne/tc/driver.c,v
|
||
Sticky Tag: release-1-0-patches (branch: 1.7.2)
|
||
Sticky Date: (none)
|
||
Sticky Options: (none)
|
||
|
||
Existing Tags:
|
||
release-1-0-patches (branch: 1.7.2)
|
||
release-1-0 (revision: 1.7)
|
||
|
||
===================================================================
|
||
File: backend.c Status: Up-to-date
|
||
|
||
Version: 1.4 Tue Dec 1 14:39:01 1992
|
||
RCS Version: 1.4 /usr/local/cvsroot/yoyodyne/tc/backend.c,v
|
||
Sticky Tag: release-1-0-patches (branch: 1.4.2)
|
||
Sticky Date: (none)
|
||
Sticky Options: (none)
|
||
|
||
Existing Tags:
|
||
release-1-0-patches (branch: 1.4.2)
|
||
release-1-0 (revision: 1.4)
|
||
release-0-4 (revision: 1.4)
|
||
|
||
@end example
|
||
|
||
@cindex Branch numbers
|
||
As the output from the @code{status} command shows the branch
|
||
number is created by adding a digit at the tail of the revision number
|
||
it is based on. (If @samp{release-1-0} corresponds to revision 1.4, the
|
||
branch's revision number will be 1.4.2. For obscure reasons @sc{cvs} always
|
||
gives branches even numbers, starting at 2.
|
||
@xref{Revision numbers}).
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Sticky tags
|
||
@section Sticky tags
|
||
@cindex Sticky tags
|
||
@cindex Tags, sticky
|
||
@cindex Branches, sticky
|
||
|
||
@c FIXME: make this stand alone better; many places
|
||
@c @xref to this node.
|
||
The @samp{-r release-1-0-patches} flag that was given
|
||
to @code{checkout} in the previous example
|
||
is @dfn{sticky}, that is, it will apply to subsequent commands
|
||
in this directory. If you commit any modifications, they are
|
||
committed on the branch. You can later merge the modifications into
|
||
the main trunk. @xref{Merging}.
|
||
|
||
You can use the @code{status} command to see what
|
||
sticky tags or dates are set:
|
||
|
||
@c FIXME: This example needs to stand alone better and it
|
||
@c would also better if it didn't use -v which only
|
||
@c clutters the output in this context.
|
||
@example
|
||
$ vi driver.c # @r{Fix the bugs}
|
||
$ cvs commit -m "Fixed initialization bug" driver.c
|
||
Checking in driver.c;
|
||
/usr/local/cvsroot/yoyodyne/tc/driver.c,v <-- driver.c
|
||
new revision: 1.7.2.1; previous revision: 1.7
|
||
done
|
||
$ cvs status -v driver.c
|
||
===================================================================
|
||
File: driver.c Status: Up-to-date
|
||
|
||
Version: 1.7.2.1 Sat Dec 5 19:35:03 1992
|
||
RCS Version: 1.7.2.1 /usr/local/cvsroot/yoyodyne/tc/driver.c,v
|
||
Sticky Tag: release-1-0-patches (branch: 1.7.2)
|
||
Sticky Date: (none)
|
||
Sticky Options: (none)
|
||
|
||
Existing Tags:
|
||
release-1-0-patches (branch: 1.7.2)
|
||
release-1-0 (revision: 1.7)
|
||
|
||
@end example
|
||
|
||
@cindex Resetting sticky tags
|
||
@cindex Sticky tags, resetting
|
||
@cindex Deleting sticky tags
|
||
The sticky tags will remain on your working files until
|
||
you delete them with @samp{cvs update -A}. The
|
||
@samp{-A} option retrieves the version of the file from
|
||
the head of the trunk, and forgets any sticky tags,
|
||
dates, or options.
|
||
|
||
@c Is the fact that CVS works this way a bug or a
|
||
@c feature? If a feature, describe how you would use
|
||
@c it to do something useful.
|
||
Sticky tags are not just for branches. If you check
|
||
out a certain revision (such as 1.4) it will also
|
||
become sticky. Subsequent @samp{cvs update} will not
|
||
retrieve the latest revision until you reset the tag
|
||
with @samp{cvs update -A}. Likewise, use of the
|
||
@samp{-D} option to @code{update} or @code{checkout}
|
||
sets a @dfn{sticky date}, which, similarly, causes that
|
||
date to be used for future retrievals.
|
||
|
||
@cindex Restoring old version of removed file
|
||
@cindex Resurrecting old version of dead file
|
||
Many times you will want to retrieve an old version of
|
||
a file without setting a sticky tag. The way to do
|
||
that is with the @samp{-p} option to @code{checkout} or
|
||
@code{update}, which sends the contents of the file to
|
||
standard output. For example, suppose you have a file
|
||
named @file{file1} which existed as revision 1.1, and
|
||
you then removed it (thus adding a dead revision 1.2).
|
||
Now suppose you want to add it again, with the same
|
||
contents it had previously. Here is how to do it:
|
||
|
||
@example
|
||
$ cvs update -p -r 1.1 file1 >file1
|
||
===================================================================
|
||
Checking out file1
|
||
RCS: /tmp/cvs-sanity/cvsroot/first-dir/Attic/file1,v
|
||
VERS: 1.1
|
||
***************
|
||
$ cvs add file1
|
||
cvs add: version 1.2 of `file1' will be resurrected
|
||
cvs add: use 'cvs commit' to add this file permanently
|
||
$ cvs commit -m test
|
||
Checking in file1;
|
||
/tmp/cvs-sanity/cvsroot/first-dir/file1,v <-- file1
|
||
new revision: 1.3; previous revision: 1.2
|
||
done
|
||
$
|
||
@end example
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node Merging
|
||
@chapter Merging
|
||
@cindex Merging
|
||
@cindex Copying changes
|
||
@cindex Branches, copying changes between
|
||
@cindex Changes, copying between branches
|
||
@cindex Modifications, copying between branches
|
||
|
||
You can include the changes made between any two
|
||
revisions into your working copy, by @dfn{merging}.
|
||
You can then commit that revision, and thus effectively
|
||
copy the changes onto another branch.
|
||
|
||
@menu
|
||
* Merging a branch:: Merging an entire branch
|
||
* Merging more than once:: Merging from a branch several times
|
||
* Merging two revisions:: Merging differences between two revisions
|
||
@end menu
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Merging a branch
|
||
@section Merging an entire branch
|
||
@cindex Merging a branch
|
||
@cindex -j (merging branches)
|
||
|
||
You can merge changes made on a branch into your working copy by giving
|
||
the @samp{-j @var{branch}} flag to the @code{update} command. With one
|
||
@samp{-j @var{branch}} option it merges the changes made between the
|
||
point where the branch forked and newest revision on that branch (into
|
||
your working copy).
|
||
|
||
@cindex Join
|
||
The @samp{-j} stands for ``join''.
|
||
|
||
@cindex Branch merge example
|
||
@cindex Example, branch merge
|
||
@cindex Merge, branch example
|
||
Consider this revision tree:
|
||
|
||
@example
|
||
+-----+ +-----+ +-----+ +-----+
|
||
! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 ! <- The main trunk
|
||
+-----+ +-----+ +-----+ +-----+
|
||
!
|
||
!
|
||
! +---------+ +---------+
|
||
Branch R1fix -> +---! 1.2.2.1 !----! 1.2.2.2 !
|
||
+---------+ +---------+
|
||
@end example
|
||
|
||
@noindent
|
||
The branch 1.2.2 has been given the tag (symbolic name) @samp{R1fix}. The
|
||
following example assumes that the module @samp{mod} contains only one
|
||
file, @file{m.c}.
|
||
|
||
@example
|
||
$ cvs checkout mod # @r{Retrieve the latest revision, 1.4}
|
||
|
||
$ cvs update -j R1fix m.c # @r{Merge all changes made on the branch,}
|
||
# @r{i.e. the changes between revision 1.2}
|
||
# @r{and 1.2.2.2, into your working copy}
|
||
# @r{of the file.}
|
||
|
||
$ cvs commit -m "Included R1fix" # @r{Create revision 1.5.}
|
||
@end example
|
||
|
||
A conflict can result from a merge operation. If that
|
||
happens, you should resolve it before committing the
|
||
new revision. @xref{Conflicts example}.
|
||
|
||
The @code{checkout} command also supports the @samp{-j @var{branch}} flag. The
|
||
same effect as above could be achieved with this:
|
||
|
||
@example
|
||
$ cvs checkout -j R1fix mod
|
||
$ cvs commit -m "Included R1fix"
|
||
@end example
|
||
|
||
@node Merging more than once
|
||
@section Merging from a branch several times
|
||
|
||
Continuing our example, the revision tree now looks
|
||
like this:
|
||
|
||
@example
|
||
+-----+ +-----+ +-----+ +-----+ +-----+
|
||
! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 ! <- The main trunk
|
||
+-----+ +-----+ +-----+ +-----+ +-----+
|
||
! *
|
||
! *
|
||
! +---------+ +---------+
|
||
Branch R1fix -> +---! 1.2.2.1 !----! 1.2.2.2 !
|
||
+---------+ +---------+
|
||
@end example
|
||
|
||
where the starred line represents the merge from the
|
||
@samp{R1fix} branch to the main trunk, as just
|
||
discussed.
|
||
|
||
Now suppose that development continues on the
|
||
@samp{R1fix} branch:
|
||
|
||
@example
|
||
+-----+ +-----+ +-----+ +-----+ +-----+
|
||
! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 ! <- The main trunk
|
||
+-----+ +-----+ +-----+ +-----+ +-----+
|
||
! *
|
||
! *
|
||
! +---------+ +---------+ +---------+
|
||
Branch R1fix -> +---! 1.2.2.1 !----! 1.2.2.2 !----! 1.2.2.3 !
|
||
+---------+ +---------+ +---------+
|
||
@end example
|
||
|
||
and then you want to merge those new changes onto the
|
||
main trunk. If you just use the @code{cvs update -j
|
||
R1fix m.c} command again, @sc{cvs} will attempt to
|
||
merge again the changes which you have already merged,
|
||
which can have undesirable side effects.
|
||
|
||
So instead you need to specify that you only want to
|
||
merge the changes on the branch which have not yet been
|
||
merged into the trunk. To do that you specify two
|
||
@samp{-j} options, and @sc{cvs} merges the changes from
|
||
the first revision to the second revision. For
|
||
example, in this case the simplest way would be
|
||
|
||
@example
|
||
cvs update -j 1.2.2.2 -j R1fix m.c # @r{Merge changes from 1.2.2.2 to the}
|
||
# @r{head of the R1fix branch}
|
||
@end example
|
||
|
||
The problem with this is that you need to specify the
|
||
1.2.2.2 revision manually. A slightly better approach
|
||
might be to use the date the last merge was done:
|
||
|
||
@example
|
||
cvs update -j R1fix:yesterday -j R1fix m.c
|
||
@end example
|
||
|
||
Better yet, tag the R1fix branch after every merge into
|
||
the trunk, and then use that tag for subsequent merges:
|
||
|
||
@example
|
||
cvs update -j merged_from_R1fix_to_trunk -j R1fix m.c
|
||
@end example
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Merging two revisions
|
||
@section Merging differences between any two revisions
|
||
@cindex Merging two revisions
|
||
@cindex Revisions, merging differences between
|
||
@cindex Differences, merging
|
||
|
||
With two @samp{-j @var{revision}} flags, the @code{update}
|
||
(and @code{checkout}) command can merge the differences
|
||
between any two revisions into your working file.
|
||
|
||
@cindex Undoing a change
|
||
@cindex Removing a change
|
||
@example
|
||
$ cvs update -j 1.5 -j 1.3 backend.c
|
||
@end example
|
||
|
||
@noindent
|
||
will @emph{remove} all changes made between revision
|
||
1.3 and 1.5. Note the order of the revisions!
|
||
|
||
If you try to use this option when operating on
|
||
multiple files, remember that the numeric revisions will
|
||
probably be very different between the various files
|
||
that make up a module. You almost always use symbolic
|
||
tags rather than revision numbers when operating on
|
||
multiple files.
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node Recursive behavior
|
||
@chapter Recursive behavior
|
||
@cindex Recursive (directory descending)
|
||
@cindex Directory, descending
|
||
@cindex Descending directories
|
||
@cindex Subdirectories
|
||
|
||
Almost all of the subcommands of @sc{cvs} work
|
||
recursively when you specify a directory as an
|
||
argument. For instance, consider this directory
|
||
structure:
|
||
|
||
@example
|
||
@code{$HOME}
|
||
|
|
||
+--@t{tc}
|
||
| |
|
||
+--@t{CVS}
|
||
| (internal @sc{cvs} files)
|
||
+--@t{Makefile}
|
||
+--@t{backend.c}
|
||
+--@t{driver.c}
|
||
+--@t{frontend.c}
|
||
+--@t{parser.c}
|
||
+--@t{man}
|
||
| |
|
||
| +--@t{CVS}
|
||
| | (internal @sc{cvs} files)
|
||
| +--@t{tc.1}
|
||
|
|
||
+--@t{testing}
|
||
|
|
||
+--@t{CVS}
|
||
| (internal @sc{cvs} files)
|
||
+--@t{testpgm.t}
|
||
+--@t{test2.t}
|
||
@end example
|
||
|
||
@noindent
|
||
If @file{tc} is the current working directory, the
|
||
following is true:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
@samp{cvs update testing} is equivalent to @samp{cvs
|
||
update testing/testpgm.t testing/test2.t}
|
||
|
||
@item
|
||
@samp{cvs update testing man} updates all files in the
|
||
subdirectories
|
||
|
||
@item
|
||
@samp{cvs update .} or just @samp{cvs update} updates
|
||
all files in the @code{tc} module
|
||
@end itemize
|
||
|
||
If no arguments are given to @code{update} it will
|
||
update all files in the current working directory and
|
||
all its subdirectories. In other words, @file{.} is a
|
||
default argument to @code{update}. This is also true
|
||
for most of the @sc{cvs} subcommands, not only the
|
||
@code{update} command.
|
||
|
||
The recursive behavior of the @sc{cvs} subcommands can be
|
||
turned off with the @samp{-l} option.
|
||
|
||
@example
|
||
$ cvs update -l # @r{Don't update files in subdirectories}
|
||
@end example
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node Adding files
|
||
@chapter Adding files to a module
|
||
@cindex Adding files
|
||
|
||
To add a new file to a module, follow these steps.
|
||
|
||
@itemize @bullet
|
||
@item
|
||
You must have a working copy of the module.
|
||
@xref{Getting the source}.
|
||
|
||
@item
|
||
Create the new file inside your working copy of the module.
|
||
|
||
@item
|
||
Use @samp{cvs add @var{filename}} to tell @sc{cvs} that you
|
||
want to version control the file.
|
||
|
||
@item
|
||
Use @samp{cvs commit @var{filename}} to actually check
|
||
in the file into the repository. Other developers
|
||
cannot see the file until you perform this step.
|
||
|
||
@item
|
||
If the file contains binary data it might be necessary
|
||
to change the default keyword substitution.
|
||
@xref{Keyword substitution}. @xref{admin examples}.
|
||
@end itemize
|
||
|
||
You can also use the @code{add} command to add a new
|
||
directory inside a module.
|
||
|
||
Unlike most other commands, the @code{add} command is
|
||
not recursive. You cannot even type @samp{cvs add
|
||
foo/bar}! Instead, you have to
|
||
|
||
@example
|
||
$ cd foo
|
||
$ cvs add bar
|
||
@end example
|
||
|
||
@xref{add}, for a more complete description of the @code{add}
|
||
command.
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node Removing files
|
||
@chapter Removing files from a module
|
||
@cindex Removing files
|
||
@cindex Deleting files
|
||
|
||
Modules change. New files are added, and old files
|
||
disappear. Still, you want to be able to retrieve an
|
||
exact copy of old releases of the module.
|
||
|
||
Here is what you can do to remove a file from a module,
|
||
but remain able to retrieve old revisions:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
Make sure that you have not made any uncommitted
|
||
modifications to the file. @xref{Viewing differences},
|
||
for one way to do that. You can also use the
|
||
@code{status} or @code{update} command. If you remove
|
||
the file without committing your changes, you will of
|
||
course not be able to retrieve the file as it was
|
||
immediately before you deleted it.
|
||
|
||
@item
|
||
Remove the file from your working copy of the module.
|
||
You can for instance use @code{rm}.
|
||
|
||
@item
|
||
Use @samp{cvs remove @var{filename}} to tell @sc{cvs} that
|
||
you really want to delete the file.
|
||
|
||
@item
|
||
Use @samp{cvs commit @var{filename}} to actually
|
||
perform the removal of the file from the repository.
|
||
@end itemize
|
||
|
||
When you commit the removal of the file, @sc{cvs}
|
||
records the fact that the file no longer exists. It is
|
||
possible for a file to exist on only some branches and
|
||
not on others, or to re-add another file with the same
|
||
name later. CVS will correctly create or not create
|
||
the file, based on the @samp{-r} and @samp{-D} options
|
||
specified to @code{checkout} or @code{update}.
|
||
|
||
@cindex Remove (subcommand)
|
||
@deffn Command {cvs remove} [@code{-lR}] files @dots{}
|
||
|
||
Schedule file(s) to be removed from the repository
|
||
(files which have not already been removed from the
|
||
working directory are not processed). This command
|
||
does not actually remove the file from the repository
|
||
until you commit the removal. The @samp{-R} option
|
||
(the default) specifies that it will recurse into
|
||
subdirectories; @samp{-l} specifies that it will not.
|
||
@end deffn
|
||
|
||
Here is an example of removing several files:
|
||
|
||
@example
|
||
$ cd test
|
||
$ rm ?.c
|
||
$ cvs remove
|
||
cvs remove: Removing .
|
||
cvs remove: scheduling a.c for removal
|
||
cvs remove: scheduling b.c for removal
|
||
cvs remove: use 'cvs commit' to remove these files permanently
|
||
$ cvs ci -m "Removed unneeded files"
|
||
cvs commit: Examining .
|
||
cvs commit: Committing .
|
||
@end example
|
||
|
||
If you change your mind you can easily resurrect the
|
||
file before you commit it, using the @code{add}
|
||
command.
|
||
|
||
@example
|
||
$ ls
|
||
CVS ja.h oj.c
|
||
$ rm oj.c
|
||
$ cvs remove oj.c
|
||
cvs remove: scheduling oj.c for removal
|
||
cvs remove: use 'cvs commit' to remove this file permanently
|
||
$ cvs add oj.c
|
||
U oj.c
|
||
cvs add: oj.c, version 1.1.1.1, resurrected
|
||
@end example
|
||
|
||
If you realize your mistake before you run the
|
||
@code{remove} command you can use @code{update} to
|
||
resurrect the file:
|
||
|
||
@example
|
||
$ rm oj.c
|
||
$ cvs update oj.c
|
||
cvs update: warning: oj.c was lost
|
||
U oj.c
|
||
@end example
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node Tracking sources
|
||
@chapter Tracking third-party sources
|
||
@cindex Third-party sources
|
||
@cindex Tracking sources
|
||
|
||
If you modify a program to better fit your site, you
|
||
probably want to include your modifications when the next
|
||
release of the program arrives. @sc{cvs} can help you with
|
||
this task.
|
||
|
||
@cindex Vendor
|
||
@cindex Vendor branch
|
||
@cindex Branch, vendor-
|
||
In the terminology used in @sc{cvs}, the supplier of the
|
||
program is called a @dfn{vendor}. The unmodified
|
||
distribution from the vendor is checked in on its own
|
||
branch, the @dfn{vendor branch}. @sc{cvs} reserves branch
|
||
1.1.1 for this use.
|
||
|
||
When you modify the source and commit it, your revision
|
||
will end up on the main trunk. When a new release is
|
||
made by the vendor, you commit it on the vendor branch
|
||
and copy the modifications onto the main trunk.
|
||
|
||
Use the @code{import} command to create and update
|
||
the vendor branch. After a successful @code{import}
|
||
the vendor branch is made the `head' revision, so
|
||
anyone that checks out a copy of the file gets that
|
||
revision. When a local modification is committed it is
|
||
placed on the main trunk, and made the `head'
|
||
revision.
|
||
|
||
@menu
|
||
* First import:: Importing a module for the first time
|
||
* Update imports:: Updating a module with the import command
|
||
@end menu
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node First import
|
||
@section Importing a module for the first time
|
||
@cindex Importing modules
|
||
|
||
Use the @code{import} command to check in the sources
|
||
for the first time. When you use the @code{import}
|
||
command to track third-party sources, the @dfn{vendor
|
||
tag} and @dfn{release tags} are useful. The
|
||
@dfn{vendor tag} is a symbolic name for the branch
|
||
(which is always 1.1.1, unless you use the @samp{-b
|
||
@var{branch}} flag---@xref{import options}). The
|
||
@dfn{release tags} are symbolic names for a particular
|
||
release, such as @samp{FSF_0_04}.
|
||
|
||
@cindex Wdiff (import example)
|
||
Suppose you use @code{wdiff} (a variant of @code{diff}
|
||
that ignores changes that only involve whitespace), and
|
||
are going to make private modifications that you want
|
||
to be able to use even when new releases are made in
|
||
the future. You start by importing the source to your
|
||
repository:
|
||
|
||
@example
|
||
$ tar xfz wdiff-0.04.tar.gz
|
||
$ cd wdiff-0.04
|
||
$ cvs import -m "Import of FSF v. 0.04" fsf/wdiff FSF_DIST WDIFF_0_04
|
||
@end example
|
||
|
||
The vendor tag is named @samp{FSF_DIST} in the above
|
||
example, and the only release tag assigned is
|
||
@samp{WDIFF_0_04}.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Update imports
|
||
@section Updating a module with the import command
|
||
|
||
When a new release of the source arrives, you import it into the
|
||
repository with the same @code{import} command that you used to set up
|
||
the repository in the first place. The only difference is that you
|
||
specify a different release tag this time.
|
||
|
||
@example
|
||
$ tar xfz wdiff-0.05.tar.gz
|
||
$ cd wdiff-0.05
|
||
$ cvs import -m "Import of FSF v. 0.05" fsf/wdiff FSF_DIST WDIFF_0_05
|
||
@end example
|
||
|
||
For files that have not been modified locally, the newly created
|
||
revision becomes the head revision. If you have made local
|
||
changes, @code{import} will warn you that you must merge the changes
|
||
into the main trunk, and tell you to use @samp{checkout -j} to do so.
|
||
|
||
@example
|
||
$ cvs checkout -jFSF_DIST:yesterday -jFSF_DIST wdiff
|
||
@end example
|
||
|
||
@noindent
|
||
The above command will check out the latest revision of
|
||
@samp{wdiff}, merging the changes made on the vendor branch @samp{FSF_DIST}
|
||
since yesterday into the working copy. If any conflicts arise during
|
||
the merge they should be resolved in the normal way (@pxref{Conflicts
|
||
example}). Then, the modified files may be committed.
|
||
|
||
Using a date, as suggested above, assumes that you do
|
||
not import more than one release of a product per
|
||
day. If you do, you can always use something like this
|
||
instead:
|
||
|
||
@example
|
||
$ cvs checkout -jWDIFF_0_04 -jWDIFF_0_05 wdiff
|
||
@end example
|
||
|
||
@noindent
|
||
In this case, the two above commands are equivalent.
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node Moving files
|
||
@chapter Moving and renaming files
|
||
@cindex Moving files
|
||
@cindex Renaming files
|
||
@cindex Files, moving
|
||
|
||
Moving files to a different directory or renaming them
|
||
is not difficult, but some of the ways in which this
|
||
works may be non-obvious. (Moving or renaming a
|
||
directory is even harder. @xref{Moving directories}).
|
||
|
||
The examples below assume that the file @var{old} is renamed to
|
||
@var{new}.
|
||
|
||
@menu
|
||
* Outside:: The normal way to Rename
|
||
* Inside:: A tricky, alternative way
|
||
* Rename by copying:: Another tricky, alternative way
|
||
@end menu
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Outside
|
||
@section The Normal way to Rename
|
||
|
||
The normal way to move a file is to copy @var{old} to
|
||
@var{new}, and then issue the normal @sc{cvs} commands
|
||
to remove @var{old} from the repository, and add
|
||
@var{new} to it. (Both @var{old} and @var{new} could
|
||
contain relative paths, for example @file{foo/bar.c}).
|
||
|
||
@example
|
||
$ mv @var{old} @var{new}
|
||
$ cvs remove @var{old}
|
||
$ cvs add @var{new}
|
||
$ cvs commit -m "Renamed @var{old} to @var{new}" @var{old} @var{new}
|
||
@end example
|
||
|
||
This is the simplest way to move a file, it is not
|
||
error-prone, and it preserves the history of what was
|
||
done. Note that to access the history of the file you
|
||
must specify the old or the new name, depending on what
|
||
portion of the history you are accessing. For example,
|
||
@code{cvs log @var{old}} will give the log up until the
|
||
time of the rename.
|
||
|
||
When @var{new} is committed its revision numbers will
|
||
start at 1.0 again, so if that bothers you, use the
|
||
@samp{-r rev} option to commit (@pxref{commit options})
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Inside
|
||
@section Moving the history file
|
||
|
||
This method is more dangerous, since it involves moving
|
||
files inside the repository. Read this entire section
|
||
before trying it out!
|
||
|
||
@example
|
||
$ cd $CVSROOT/@var{module}
|
||
$ mv @var{old},v @var{new},v
|
||
@end example
|
||
|
||
@noindent
|
||
Advantages:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
The log of changes is maintained intact.
|
||
|
||
@item
|
||
The revision numbers are not affected.
|
||
@end itemize
|
||
|
||
@noindent
|
||
Disadvantages:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
Old releases of the module cannot easily be fetched from the
|
||
repository. (The file will show up as @var{new} even
|
||
in revisions from the time before it was renamed).
|
||
|
||
@item
|
||
There is no log information of when the file was renamed.
|
||
|
||
@item
|
||
Nasty things might happen if someone accesses the history file
|
||
while you are moving it. Make sure no one else runs any of the @sc{cvs}
|
||
commands while you move it.
|
||
@end itemize
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Rename by copying
|
||
@section Copying the history file
|
||
|
||
This way also involves direct modifications to the
|
||
repository. It is safe, but not without drawbacks.
|
||
|
||
@example
|
||
# @r{Copy the @sc{rcs} file inside the repository}
|
||
$ cd $CVSROOT/@var{module}
|
||
$ cp @var{old},v @var{new},v
|
||
# @r{Remove the old file}
|
||
$ cd ~/@var{module}
|
||
$ rm @var{old}
|
||
$ cvs remove @var{old}
|
||
$ cvs commit @var{old}
|
||
# @r{Remove all tags from @var{new}}
|
||
$ cvs update @var{new}
|
||
$ cvs log @var{new} # @r{Remember the tag names}
|
||
$ cvs tag -d @var{tag1}
|
||
$ cvs tag -d @var{tag2}
|
||
@dots{}
|
||
@end example
|
||
|
||
By removing the tags you will be able to check out old
|
||
revisions of the module.
|
||
|
||
@noindent
|
||
Advantages:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
@c FIXME: Is this true about -D now that we have death
|
||
@c support? See 5B.3 in the FAQ.
|
||
Checking out old revisions works correctly, as long as
|
||
you use @samp{-r@var{tag}} and not @samp{-D@var{date}}
|
||
to retrieve the revisions.
|
||
|
||
@item
|
||
The log of changes is maintained intact.
|
||
|
||
@item
|
||
The revision numbers are not affected.
|
||
@end itemize
|
||
|
||
@noindent
|
||
Disadvantages:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
You cannot easily see the history of the file across the rename.
|
||
|
||
@item
|
||
Unless you use the @samp{-r rev} (@pxref{commit
|
||
options}) flag when @var{new} is committed its revision
|
||
numbers will start at 1.0 again.
|
||
@end itemize
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node Moving directories
|
||
@chapter Moving and renaming directories
|
||
@cindex Moving directories
|
||
@cindex Renaming directories
|
||
@cindex Directories, moving
|
||
|
||
If you want to be able to retrieve old versions of the
|
||
module, you must move each file in the directory
|
||
with the @sc{cvs} commands. @xref{Outside}. The old, empty
|
||
directory will remain inside the repository, but it
|
||
will not appear in your workspace when you check out
|
||
the module in the future.
|
||
@c -- rephrase
|
||
|
||
If you really want to rename or delete a directory, you
|
||
can do it like this:
|
||
|
||
@enumerate
|
||
@item
|
||
Inform everyone who has a copy of the module that the
|
||
directory will be renamed. They should commit all
|
||
their changes, and remove their working copies of the
|
||
module, before you take the steps below.
|
||
|
||
@item
|
||
Rename the directory inside the repository.
|
||
|
||
@example
|
||
$ cd $CVSROOT/@var{module}
|
||
$ mv @var{old-dir} @var{new-dir}
|
||
@end example
|
||
|
||
@item
|
||
Fix the @sc{cvs} administrative files, if necessary (for
|
||
instance if you renamed an entire module).
|
||
|
||
@item
|
||
Tell everyone that they can check out the module and continue
|
||
working.
|
||
|
||
@end enumerate
|
||
|
||
If someone had a working copy of the module the @sc{cvs} commands will
|
||
cease to work for him, until he removes the directory
|
||
that disappeared inside the repository.
|
||
|
||
It is almost always better to move the files in the
|
||
directory instead of moving the directory. If you move the
|
||
directory you are unlikely to be able to retrieve old
|
||
releases correctly, since they probably depend on the
|
||
name of the directories.
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node History browsing
|
||
@chapter History browsing
|
||
@cindex History browsing
|
||
@cindex Traceability
|
||
@cindex Isolation
|
||
|
||
@ignore
|
||
@c This is too long for an introduction (goal is
|
||
@c one 20x80 character screen), and also mixes up a
|
||
@c variety of issues (parallel development, history,
|
||
@c maybe even touches on process control).
|
||
|
||
@c -- @quote{To lose ones history is to lose ones soul.}
|
||
@c -- ///
|
||
@c -- ///Those who cannot remember the past are condemned to repeat it.
|
||
@c -- /// -- George Santayana
|
||
@c -- ///
|
||
|
||
@sc{cvs} tries to make it easy for a group of people to work
|
||
together. This is done in two ways:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
Isolation---You have your own working copy of the
|
||
source. You are not affected by modifications made by
|
||
others until you decide to incorporate those changes
|
||
(via the @code{update} command---@pxref{update}).
|
||
|
||
@item
|
||
Traceability---When something has changed, you can
|
||
always see @emph{exactly} what changed.
|
||
@end itemize
|
||
|
||
There are several features of @sc{cvs} that together lead
|
||
to traceability:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
Each revision of a file has an accompanying log
|
||
message.
|
||
|
||
@item
|
||
All commits are optionally logged to a central history
|
||
database.
|
||
|
||
@item
|
||
Logging information can be sent to a user-defined
|
||
program (@pxref{loginfo}).
|
||
@end itemize
|
||
|
||
@c -- More text here.
|
||
|
||
This chapter should talk about the history file, the
|
||
@code{log} command, the usefulness of ChangeLogs
|
||
even when you run @sc{cvs}, and things like that.
|
||
|
||
@end ignore
|
||
|
||
@c kind of lame, in a lot of ways the above text inside
|
||
@c the @ignore motivates this chapter better
|
||
Once you have used @sc{cvs} to store a version control
|
||
history---what files have changed when, how, and by
|
||
whom, there are a variety of mechanisms for looking
|
||
through the history.
|
||
|
||
@menu
|
||
* log messages:: Log messages
|
||
* history database:: The history database
|
||
* user-defined logging:: User-defined logging
|
||
* annotate:: What revision modified each line of a file?
|
||
@end menu
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node log messages
|
||
@section Log messages
|
||
|
||
@c FIXME: @xref to place where we talk about how to
|
||
@c specify message to commit.
|
||
Whenever you commit a file you specify a log message.
|
||
|
||
@c FIXME: bring the information here, and get rid of or
|
||
@c greatly shrink the "log" node.
|
||
To look through the log messages which have been
|
||
specified for every revision which has been committed,
|
||
use the @code{cvs log} command (@pxref{log}).
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node history database
|
||
@section The history database
|
||
|
||
@c FIXME: bring the information from the history file
|
||
@c and history nodes here. Rewrite it to be motivated
|
||
@c better (start out by clearly explaining what gets
|
||
@c logged in history, for example).
|
||
You can use the history file (@pxref{history file}) to
|
||
log various @sc{cvs} actions. To retrieve the
|
||
information from the history file, use the @code{cvs
|
||
history} command (@pxref{history}).
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node user-defined logging
|
||
@section User-defined logging
|
||
|
||
@c FIXME: should probably also mention the fact the -l
|
||
@c global option can disable most of the mechanisms
|
||
@c discussed here (why? What is the -l global option for?).
|
||
@c
|
||
@c FIXME: probably should centralize this information
|
||
@c here, at least to some extent. Maybe by moving the
|
||
@c loginfo, etc., nodes here and replacing
|
||
@c the "user-defined logging" node with one node for
|
||
@c each method.
|
||
You can customize @sc{cvs} to log various kinds of
|
||
actions, in whatever manner you choose. These
|
||
mechanisms operate by executing a script at various
|
||
times. The script might append a message to a file
|
||
listing the information and the programmer who created
|
||
it, or send mail to a group of developers, or, perhaps,
|
||
post a message to a particular newsgroup. To log
|
||
commits, use the @file{loginfo} file (@pxref{loginfo}).
|
||
@c FIXME: What is difference between doing it in the
|
||
@c modules file and using loginfo/taginfo? Why should
|
||
@c user use one or the other?
|
||
To log commits, checkouts, exports, and tags,
|
||
respectively, you can also use the @samp{-i},
|
||
@samp{-o}, @samp{-e}, and @samp{-t} options in the
|
||
modules file. For a more flexible way of giving
|
||
notifications to various users, which requires less in
|
||
the way of keeping centralized scripts up to date, use
|
||
the @code{cvs watch add} command (@pxref{Getting
|
||
Notified}); this command is useful even if you are not
|
||
using @code{cvs watch on}.
|
||
|
||
@cindex taginfo
|
||
The @file{taginfo} file defines programs to execute
|
||
when someone executes a @code{tag} or @code{rtag}
|
||
command. The @file{taginfo} file has the standard form
|
||
for administrative files (@pxref{Administrative
|
||
files}), where each line is a regular expression
|
||
followed by a command to execute. The arguments passed
|
||
to the command are, in order, the @var{tagname},
|
||
@var{operation} (@code{add} for @code{tag},
|
||
@code{mov} for @code{tag -F}, and @code{del} for
|
||
@code{tag -d}), @var{repository}, and any remaining are
|
||
pairs of @var{filename} @var{revision}. A non-zero
|
||
exit of the filter program will cause the tag to be
|
||
aborted.
|
||
|
||
@node annotate
|
||
@section Annotate command
|
||
@cindex annotate (subcommand)
|
||
|
||
@deffn Command {cvs annotate} [@code{-l}] files @dots{}
|
||
|
||
For each file in @var{files}, print the head revision
|
||
of the trunk, together with information on the last
|
||
modification for each line. The @code{-l} option means
|
||
to process the local directory only, not to recurse
|
||
(@pxref{Common options}). For example:
|
||
|
||
@example
|
||
$ cvs annotate ssfile
|
||
Annotations for ssfile
|
||
***************
|
||
1.1 (mary 27-Mar-96): ssfile line 1
|
||
1.2 (joe 28-Mar-96): ssfile line 2
|
||
@end example
|
||
|
||
The file @file{ssfile} currently contains two lines.
|
||
The @code{ssfile line 1} line was checked in by
|
||
@code{mary} on March 27. Then, on March 28, @code{joe}
|
||
added a line @code{ssfile line 2}, without modifying
|
||
the @code{ssfile line 1} line. This report doesn't
|
||
tell you anything about lines which have been deleted
|
||
or replaced; you need to use @code{cvs diff} for that
|
||
(@pxref{diff}).
|
||
|
||
@end deffn
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node Keyword substitution
|
||
@chapter Keyword substitution
|
||
@cindex Keyword substitution
|
||
@cindex Keyword expansion
|
||
@cindex Identifying files
|
||
|
||
@comment Be careful when editing this chapter.
|
||
@comment Remember that this file is kept under
|
||
@comment version control, so we must not accidentally
|
||
@comment include a valid keyword in the running text.
|
||
|
||
As long as you edit source files inside your working
|
||
copy of a module you can always find out the state of
|
||
your files via @samp{cvs status} and @samp{cvs log}.
|
||
But as soon as you export the files from your
|
||
development environment it becomes harder to identify
|
||
which revisions they are.
|
||
|
||
@sc{Rcs} uses a mechanism known as @dfn{keyword
|
||
substitution} (or @dfn{keyword expansion}) to help
|
||
identifying the files. Embedded strings of the form
|
||
@code{$@var{keyword}$} and
|
||
@code{$@var{keyword}:@dots{}$} in a file are replaced
|
||
with strings of the form
|
||
@code{$@var{keyword}:@var{value}$} whenever you obtain
|
||
a new revision of the file.
|
||
|
||
@menu
|
||
* Keyword list:: RCS Keywords
|
||
* Using keywords:: Using keywords
|
||
* Avoiding substitution:: Avoiding substitution
|
||
* Substitution modes:: Substitution modes
|
||
* Log keyword:: Problems with the $@asis{}Log$ keyword.
|
||
@end menu
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Keyword list
|
||
@section RCS Keywords
|
||
@cindex RCS keywords
|
||
|
||
This is a list of the keywords that @sc{rcs} currently
|
||
(in release 5.6.0.1) supports:
|
||
|
||
@table @code
|
||
@cindex Author keyword
|
||
@item $@asis{Author}$
|
||
The login name of the user who checked in the revision.
|
||
|
||
@cindex Date keyword
|
||
@item $@asis{Date}$
|
||
The date and time (UTC) the revision was checked in.
|
||
|
||
@cindex Header keyword
|
||
@item $@asis{Header}$
|
||
A standard header containing the full pathname of the
|
||
@sc{rcs} file, the revision number, the date (UTC), the
|
||
author, the state, and the locker (if locked). Files
|
||
will normally never be locked when you use @sc{cvs}.
|
||
|
||
@cindex Id keyword
|
||
@item $@asis{Id}$
|
||
Same as @code{$@asis{Header}$}, except that the @sc{rcs}
|
||
filename is without a path.
|
||
|
||
@cindex Locker keyword
|
||
@item $@asis{Locker}$
|
||
The login name of the user who locked the revision
|
||
(empty if not locked, and thus almost always useless
|
||
when you are using @sc{cvs}).
|
||
|
||
@cindex Log keyword
|
||
@item $@asis{Log}$
|
||
The log message supplied during commit, preceded by a
|
||
header containing the @sc{rcs} filename, the revision
|
||
number, the author, and the date (UTC). Existing log
|
||
messages are @emph{not} replaced. Instead, the new log
|
||
message is inserted after @code{$@asis{Log:@dots{}}$}.
|
||
Each new line is prefixed with a @dfn{comment leader}
|
||
which @sc{rcs} guesses from the file name extension.
|
||
It can be changed with @code{cvs admin -c}.
|
||
@xref{admin options}. This keyword is useful for
|
||
accumulating a complete change log in a source file,
|
||
but for several reasons it can be problematic.
|
||
@xref{Log keyword}.
|
||
|
||
@cindex RCSfile keyword
|
||
@item $@asis{RCSfile}$
|
||
The name of the RCS file without a path.
|
||
|
||
@cindex Revision keyword
|
||
@item $@asis{Revision}$
|
||
The revision number assigned to the revision.
|
||
|
||
@cindex Source keyword
|
||
@item $@asis{Source}$
|
||
The full pathname of the RCS file.
|
||
|
||
@cindex State keyword
|
||
@item $@asis{State}$
|
||
The state assigned to the revision. States can be
|
||
assigned with @code{cvs admin -s}---@xref{admin options}.
|
||
|
||
@end table
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Using keywords
|
||
@section Using keywords
|
||
|
||
To include a keyword string you simply include the
|
||
relevant text string, such as @code{$@asis{Id}$}, inside the
|
||
file, and commit the file. @sc{cvs} will automatically
|
||
expand the string as part of the commit operation.
|
||
|
||
@need 800
|
||
It is common to embed @code{$@asis{}Id$} string in the
|
||
C source code. This example shows the first few lines
|
||
of a typical file, after keyword substitution has been
|
||
performed:
|
||
|
||
@example
|
||
static char *rcsid="$@asis{}Id: samp.c,v 1.5 1993/10/19 14:57:32 ceder Exp $";
|
||
/* @r{The following lines will prevent @code{gcc} version 2.@var{x}}
|
||
@r{from issuing an "unused variable" warning}. */
|
||
#if __GNUC__ == 2
|
||
#define USE(var) static void * use_##var = (&use_##var, (void *) &var)
|
||
USE (rcsid);
|
||
#endif
|
||
@end example
|
||
|
||
Even though a clever optimizing compiler could remove
|
||
the unused variable @code{rcsid}, most compilers tend
|
||
to include the string in the binary. Some compilers
|
||
have a @code{#pragma} directive to include literal text
|
||
in the binary.
|
||
|
||
@cindex Ident (shell command)
|
||
The @code{ident} command (which is part of the @sc{rcs}
|
||
package) can be used to extract keywords and their
|
||
values from a file. This can be handy for text files,
|
||
but it is even more useful for extracting keywords from
|
||
binary files.
|
||
|
||
@example
|
||
$ ident samp.c
|
||
samp.c:
|
||
$@asis{}Id: samp.c,v 1.5 1993/10/19 14:57:32 ceder Exp $
|
||
$ gcc samp.c
|
||
$ ident a.out
|
||
a.out:
|
||
$@asis{}Id: samp.c,v 1.5 1993/10/19 14:57:32 ceder Exp $
|
||
@end example
|
||
|
||
@cindex What (shell command)
|
||
S@sc{ccs} is another popular revision control system.
|
||
It has a command, @code{what}, which is very similar to
|
||
@code{ident} and used for the same purpose. Many sites
|
||
without @sc{rcs} have @sc{sccs}. Since @code{what}
|
||
looks for the character sequence @code{@@(#)} it is
|
||
easy to include keywords that are detected by either
|
||
command. Simply prefix the @sc{rcs} keyword with the
|
||
magic @sc{sccs} phrase, like this:
|
||
|
||
@example
|
||
static char *id="@@(#) $@asis{}Id: ab.c,v 1.5 1993/10/19 14:57:32 ceder Exp $";
|
||
@end example
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Avoiding substitution
|
||
@section Avoiding substitution
|
||
|
||
Keyword substitution has its disadvantages. Sometimes
|
||
you might want the literal text string
|
||
@samp{$@asis{}Author$} to appear inside a file without
|
||
@sc{rcs} interpreting it as a keyword and expanding it
|
||
into something like @samp{$@asis{}Author: ceder $}.
|
||
|
||
There is unfortunately no way to selectively turn off
|
||
keyword substitution. You can use @samp{-ko}
|
||
(@pxref{Substitution modes}) to turn off keyword
|
||
substitution entirely.
|
||
|
||
In many cases you can avoid using @sc{rcs} keywords in
|
||
the source, even though they appear in the final
|
||
product. For example, the source for this manual
|
||
contains @samp{$@@asis@{@}Author$} whenever the text
|
||
@samp{$@asis{}Author$} should appear. In @code{nroff}
|
||
and @code{troff} you can embed the null-character
|
||
@code{\&} inside the keyword for a similar effect.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Substitution modes
|
||
@section Substitution modes
|
||
@cindex -k (RCS kflags)
|
||
@cindex Kflag
|
||
|
||
@c FIXME: This could be made more coherent, by expanding it
|
||
@c with more examples or something.
|
||
Each file has a stored default substitution mode, and
|
||
each working directory copy of a file also has a
|
||
substitution mode. The former is set by the @samp{-k}
|
||
option to @code{cvs add} and @code{cvs admin}; the
|
||
latter is set by the -k or -A options to @code{cvs
|
||
checkout} or @code{cvs update}. @code{cvs diff} also
|
||
has a @samp{-k} option. For some examples,
|
||
@xref{Binary files}.
|
||
|
||
The modes available are:
|
||
|
||
@table @samp
|
||
@item -kkv
|
||
Generate keyword strings using the default form, e.g.
|
||
@code{$@asis{}Revision: 5.7 $} for the @code{Revision}
|
||
keyword.
|
||
|
||
@item -kkvl
|
||
Like @samp{-kkv}, except that a locker's name is always
|
||
inserted if the given revision is currently locked.
|
||
This option is normally not useful when @sc{cvs} is used.
|
||
|
||
@item -kk
|
||
Generate only keyword names in keyword strings; omit
|
||
their values. For example, for the @code{Revision}
|
||
keyword, generate the string @code{$@asis{}Revision$}
|
||
instead of @code{$@asis{}Revision: 5.7 $}. This option
|
||
is useful to ignore differences due to keyword
|
||
substitution when comparing different revisions of a
|
||
file.
|
||
|
||
@item -ko
|
||
Generate the old keyword string, present in the working
|
||
file just before it was checked in. For example, for
|
||
the @code{Revision} keyword, generate the string
|
||
@code{$@asis{}Revision: 1.1 $} instead of
|
||
@code{$@asis{}Revision: 5.7 $} if that is how the
|
||
string appeared when the file was checked in.
|
||
|
||
@item -kb
|
||
Like @samp{-ko}, but also inhibit conversion of line
|
||
endings between the canonical form in which they are
|
||
stored in the repository (linefeed only), and the form
|
||
appropriate to the operating system in use on the
|
||
client. For systems, like unix, which use linefeed
|
||
only to terminate lines, this is the same as
|
||
@samp{-ko}. For more information on binary files, see
|
||
@ref{Binary files}.
|
||
|
||
@item -kv
|
||
Generate only keyword values for keyword strings. For
|
||
example, for the @code{Revision} keyword, generate the string
|
||
@code{5.7} instead of @code{$@asis{}Revision: 5.7 $}.
|
||
This can help generate files in programming languages
|
||
where it is hard to strip keyword delimiters like
|
||
@code{$@asis{}Revision: $} from a string. However,
|
||
further keyword substitution cannot be performed once
|
||
the keyword names are removed, so this option should be
|
||
used with care.
|
||
|
||
One often would like to use @samp{-kv} with @code{cvs
|
||
export}---@pxref{export}. But be aware that doesn't
|
||
handle an export containing binary files correctly.
|
||
|
||
@end table
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Log keyword
|
||
@section Problems with the $@asis{}Log$ keyword.
|
||
|
||
The @code{$@asis{}Log$} keyword is somewhat
|
||
controversial. As long as you are working on your
|
||
development system the information is easily accessible
|
||
even if you do not use the @code{$@asis{}Log$}
|
||
keyword---just do a @code{cvs log}. Once you export
|
||
the file the history information might be useless
|
||
anyhow.
|
||
|
||
A more serious concern is that @sc{rcs} is not good at
|
||
handling @code{$@asis{}Log$} entries when a branch is
|
||
merged onto the main trunk. Conflicts often result
|
||
from the merging operation.
|
||
|
||
People also tend to "fix" the log entries in the file
|
||
(correcting spelling mistakes and maybe even factual
|
||
errors). If that is done the information from
|
||
@code{cvs log} will not be consistent with the
|
||
information inside the file. This may or may not be a
|
||
problem in real life.
|
||
|
||
It has been suggested that the @code{$@asis{}Log$}
|
||
keyword should be inserted @emph{last} in the file, and
|
||
not in the files header, if it is to be used at all.
|
||
That way the long list of change messages will not
|
||
interfere with everyday source file browsing.
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node Binary files
|
||
@chapter Handling binary files
|
||
@cindex Binary files
|
||
|
||
There are two issues with using @sc{cvs} to store
|
||
binary files. The first is that @sc{cvs} by default
|
||
convert line endings between the canonical form in
|
||
which they are stored in the repository (linefeed
|
||
only), and the form appropriate to the operating system
|
||
in use on the client (for example, carriage return
|
||
followed by line feed for Windows NT).
|
||
|
||
The second is that a binary file might happen to
|
||
contain data which looks like a keyword (@pxref{Keyword
|
||
substitution}), so keyword expansion must be turned
|
||
off.
|
||
|
||
The @samp{-kb} option available with some @sc{cvs}
|
||
commands insures that neither line ending conversion
|
||
nor keyword expansion will be done. If you are using
|
||
an old version of @sc{rcs} without this option, and you
|
||
are using an operating system, such as unix, which
|
||
terminates lines with linefeeds only, you can use
|
||
@samp{-ko} instead; if you are on another operating
|
||
system, upgrade to a version of @sc{rcs}, such as 5.7
|
||
or later, which supports @samp{-kb}.
|
||
|
||
Here is an example of how you can create a new file
|
||
using the @samp{-kb} flag:
|
||
|
||
@example
|
||
$ echo '$@asis{}Id$' > kotest
|
||
$ cvs add -kb -m"A test file" kotest
|
||
$ cvs ci -m"First checkin; contains a keyword" kotest
|
||
@end example
|
||
|
||
If a file accidentally gets added without @samp{-kb},
|
||
one can use the @code{cvs admin} command to recover.
|
||
For example:
|
||
|
||
@example
|
||
$ echo '$@asis{}Id$' > kotest
|
||
$ cvs add -m"A test file" kotest
|
||
$ cvs ci -m"First checkin; contains a keyword" kotest
|
||
$ cvs admin -kb kotest
|
||
$ cvs update -A kotest
|
||
@end example
|
||
|
||
When you check in the file @file{kotest} the keywords
|
||
are expanded. (Try the above example, and do a
|
||
@code{cat kotest} after every command). The @code{cvs
|
||
admin -kb} command sets the default keyword
|
||
substitution method for this file, but it does not
|
||
alter the working copy of the file that you have. The
|
||
easiest way to get the unexpanded version of
|
||
@file{kotest} is @code{cvs update -A}.
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node Revision management
|
||
@chapter Revision management
|
||
@cindex Revision management
|
||
|
||
@c -- This chapter could be expanded a lot.
|
||
@c -- Experiences are very welcome!
|
||
|
||
If you have read this far, you probably have a pretty
|
||
good grasp on what @sc{cvs} can do for you. This
|
||
chapter talks a little about things that you still have
|
||
to decide.
|
||
|
||
If you are doing development on your own using @sc{cvs}
|
||
you could probably skip this chapter. The questions
|
||
this chapter takes up become more important when more
|
||
than one person is working in a repository.
|
||
|
||
@menu
|
||
* When to commit:: Some discussion on the subject
|
||
@end menu
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node When to commit
|
||
@section When to commit?
|
||
@cindex When to commit
|
||
@cindex Commit, when to
|
||
@cindex Policy
|
||
|
||
Your group should decide which policy to use regarding
|
||
commits. Several policies are possible, and as your
|
||
experience with @sc{cvs} grows you will probably find
|
||
out what works for you.
|
||
|
||
If you commit files too quickly you might commit files
|
||
that do not even compile. If your partner updates his
|
||
working sources to include your buggy file, he will be
|
||
unable to compile the code. On the other hand, other
|
||
persons will not be able to benefit from the
|
||
improvements you make to the code if you commit very
|
||
seldom, and conflicts will probably be more common.
|
||
|
||
It is common to only commit files after making sure
|
||
that they can be compiled. Some sites require that the
|
||
files pass a test suite. Policies like this can be
|
||
enforced using the commitinfo file
|
||
(@pxref{commitinfo}), but you should think twice before
|
||
you enforce such a convention. By making the
|
||
development environment too controlled it might become
|
||
too regimented and thus counter-productive to the real
|
||
goal, which is to get software written.
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node Invoking CVS
|
||
@appendix Reference manual for CVS commands
|
||
@cindex Command reference
|
||
@cindex Reference, commands
|
||
@cindex Invoking CVS
|
||
|
||
This appendix describes how to invoke @sc{cvs}, and
|
||
describes in detail those subcommands of @sc{cvs} which
|
||
are not fully described elsewhere. To look up a
|
||
particular subcommand, see @ref{Index}.
|
||
|
||
@menu
|
||
* Structure:: Overall structure of CVS commands
|
||
* ~/.cvsrc:: Default options with the ~/.csvrc file
|
||
* Global options:: Options you give to the left of cvs_command
|
||
* Common options:: Options you give to the right of cvs_command
|
||
* add:: Add a new file/directory to the repository
|
||
* admin:: Administration front end for rcs
|
||
* checkout:: Checkout sources for editing
|
||
* commit:: Check files into the repository
|
||
* diff:: Run diffs between revisions
|
||
* export:: Export sources from CVS, similar to checkout
|
||
* history:: Show status of files and users
|
||
* import:: Import sources into CVS, using vendor branches
|
||
* log:: Print out 'rlog' information for files
|
||
* rdiff:: 'patch' format diffs between releases
|
||
* release:: Indicate that a Module is no longer in use
|
||
* rtag:: Add a tag to a module
|
||
* status:: Status info on the revisions
|
||
* tag:: Add a tag to checked out version
|
||
* update:: Bring work tree in sync with repository
|
||
@end menu
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Structure
|
||
@appendixsec Overall structure of CVS commands
|
||
@cindex Structure
|
||
@cindex CVS command structure
|
||
@cindex Command structure
|
||
@cindex Format of CVS commands
|
||
|
||
The first release of @sc{cvs} consisted of a number of shell-scripts.
|
||
Today @sc{cvs} is implemented as a single program that is a front-end
|
||
to @sc{rcs} and @code{diff}. The overall format of all
|
||
@sc{cvs} commands is:
|
||
|
||
@example
|
||
cvs [ cvs_options ] cvs_command [ command_options ] [ command_args ]
|
||
@end example
|
||
|
||
@table @code
|
||
@item cvs
|
||
The program that is a front-end to @sc{rcs}.
|
||
|
||
@item cvs_options
|
||
Some options that affect all sub-commands of @sc{cvs}. These are
|
||
described below.
|
||
|
||
@item cvs_command
|
||
One of several different sub-commands. Some of the commands have
|
||
aliases that can be used instead; those aliases are noted in the
|
||
reference manual for that command. There are only two situations
|
||
where you may omit @samp{cvs_command}: @samp{cvs -H} elicits a
|
||
list of available commands, and @samp{cvs -v} displays version
|
||
information on @sc{cvs} itself.
|
||
|
||
@item command_options
|
||
Options that are specific for the command.
|
||
|
||
@item command_args
|
||
Arguments to the commands.
|
||
@end table
|
||
|
||
There is unfortunately some confusion between
|
||
@code{cvs_options} and @code{command_options}.
|
||
@samp{-l}, when given as a @code{cvs_option}, only
|
||
affects some of the commands. When it is given as a
|
||
@code{command_option} is has a different meaning, and
|
||
is accepted by more commands. In other words, do not
|
||
take the above categorization too seriously. Look at
|
||
the documentation instead.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node ~/.cvsrc
|
||
@appendixsec Default options and the ~/.cvsrc file
|
||
@cindex .cvsrc file
|
||
@cindex option defaults
|
||
|
||
There are some @code{command_options} that are used so
|
||
often that you might have set up an alias or some other
|
||
means to make sure you always specify that option. One
|
||
example (the one that drove the implementation of the
|
||
.cvsrc support, actually) is that many people find the
|
||
default output of the @samp{diff} command to be very
|
||
hard to read, and that either context diffs or unidiffs
|
||
are much easier to understand.
|
||
|
||
The @file{~/.cvsrc} file is a way that you can add
|
||
default options to @code{cvs_commands} within cvs,
|
||
instead of relying on aliases or other shell scripts.
|
||
|
||
The format of the @file{~/.cvsrc} file is simple. The
|
||
file is searched for a line that begins with the same
|
||
name as the @code{cvs_command} being executed. If a
|
||
match is found, then the remainder of the line is split
|
||
up (at whitespace characters) into separate options and
|
||
added to the command arguments @emph{before} any
|
||
options from the command line.
|
||
|
||
If a command has two names (e.g., @code{checkout} and
|
||
@code{co}), the official name, not necessarily the one
|
||
used on the command line, will be used to match against
|
||
the file. So if this is the contents of the user's
|
||
@file{~/.cvsrc} file:
|
||
|
||
@example
|
||
log -N
|
||
diff -u
|
||
update -P
|
||
co -P
|
||
@end example
|
||
|
||
@noindent
|
||
the command @samp{cvs checkout foo} would have the
|
||
@samp{-P} option added to the arguments, as well as
|
||
@samp{cvs co foo}.
|
||
|
||
With the example file above, the output from @samp{cvs
|
||
diff foobar} will be in unidiff format. @samp{cvs diff
|
||
-c foobar} will provide context diffs, as usual.
|
||
Getting "old" format diffs would be slightly more
|
||
complicated, because @code{diff} doesn't have an option
|
||
to specify use of the "old" format, so you would need
|
||
@samp{cvs -f diff foobar}.
|
||
|
||
In place of the command name you can use @code{cvs} to
|
||
specify global options (@pxref{Global options}). For
|
||
example the following line in @file{.cvsrc}
|
||
|
||
@example
|
||
cvs -z6
|
||
@end example
|
||
|
||
causes @sc{cvs} to use compression level 6
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Global options
|
||
@appendixsec Global options
|
||
@cindex Options, global
|
||
@cindex Global options
|
||
@cindex Left-hand options
|
||
|
||
The available @samp{cvs_options} (that are given to the
|
||
left of @samp{cvs_command}) are:
|
||
|
||
@table @code
|
||
@cindex RCSBIN, overriding
|
||
@cindex Overriding RCSBIN
|
||
@item -b @var{bindir}
|
||
Use @var{bindir} as the directory where @sc{rcs} programs are
|
||
located. Overrides the setting of the @code{$RCSBIN} environment
|
||
variable and any precompiled directory. This parameter should be
|
||
specified as an absolute pathname.
|
||
|
||
@cindex CVSROOT, overriding
|
||
@cindex Overriding CVSROOT
|
||
@item -d @var{cvs_root_directory}
|
||
Use @var{cvs_root_directory} as the root directory
|
||
pathname of the repository. Overrides the setting of
|
||
the @code{$CVSROOT} environment variable. @xref{Repository}.
|
||
|
||
@cindex EDITOR, overriding
|
||
@cindex Overriding EDITOR
|
||
@item -e @var{editor}
|
||
Use @var{editor} to enter revision log information. Overrides the
|
||
setting of the @code{$CVSEDITOR} and @code{$EDITOR} environment variables.
|
||
|
||
@item -f
|
||
Do not read the @file{~/.cvsrc} file. This
|
||
option is most often used because of the
|
||
non-orthogonality of the @sc{cvs} option set. For
|
||
example, the @samp{cvs log} option @samp{-N} (turn off
|
||
display of tag names) does not have a corresponding
|
||
option to turn the display on. So if you have
|
||
@samp{-N} in the @file{~/.cvsrc} entry for @samp{diff},
|
||
you may need to use @samp{-f} to show the tag names.
|
||
@footnote{Yes, this really should be fixed, and it's
|
||
being worked on}
|
||
|
||
@item -H
|
||
Display usage information about the specified @samp{cvs_command}
|
||
(but do not actually execute the command). If you don't specify
|
||
a command name, @samp{cvs -H} displays a summary of all the
|
||
commands available.
|
||
|
||
@item -l
|
||
Do not log the cvs_command in the command history (but execute it
|
||
anyway). @xref{history}, for information on command history.
|
||
|
||
@cindex Read-only mode
|
||
@item -n
|
||
Do not change any files. Attempt to execute the
|
||
@samp{cvs_command}, but only to issue reports; do not remove,
|
||
update, or merge any existing files, or create any new files.
|
||
|
||
@item -Q
|
||
Cause the command to be really quiet; the command will only
|
||
generate output for serious problems.
|
||
|
||
@item -q
|
||
Cause the command to be somewhat quiet; informational messages,
|
||
such as reports of recursion through subdirectories, are
|
||
suppressed.
|
||
|
||
@cindex Read-only files
|
||
@item -r
|
||
Make new working files files read-only. Same effect
|
||
as if the @code{$CVSREAD} environment variable is set
|
||
(@pxref{Environment variables}). The default is to
|
||
make working files writable, unless watches are on
|
||
(@pxref{Watches}).
|
||
|
||
@item -s @var{variable}=@var{value}
|
||
Set a user variable (@pxref{Variables}).
|
||
|
||
@cindex Trace
|
||
@item -t
|
||
Trace program execution; display messages showing the steps of
|
||
@sc{cvs} activity. Particularly useful with @samp{-n} to explore the
|
||
potential impact of an unfamiliar command.
|
||
|
||
@item -v
|
||
Display version and copyright information for @sc{cvs}.
|
||
|
||
@cindex CVSREAD, overriding
|
||
@cindex Overriding CVSREAD
|
||
@item -w
|
||
Make new working files read-write. Overrides the
|
||
setting of the @code{$CVSREAD} environment variable.
|
||
Files are created read-write by default, unless @code{$CVSREAD} is
|
||
set or @samp{-r} is given.
|
||
|
||
@item -z @var{gzip-level}
|
||
Set the compression level. Only has an effect on the
|
||
@sc{cvs} client.
|
||
|
||
@end table
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Common options
|
||
@appendixsec Common command options
|
||
@cindex Common options
|
||
@cindex Right-hand options
|
||
|
||
This section describes the @samp{command_options} that
|
||
are available across several @sc{cvs} commands. These
|
||
options are always given to the right of
|
||
@samp{cvs_command}. Not all
|
||
commands support all of these options; each option is
|
||
only supported for commands where it makes sense.
|
||
However, when a command has one of these options you
|
||
can almost always count on the same behavior of the
|
||
option as in other commands. (Other command options,
|
||
which are listed with the individual commands, may have
|
||
different behavior from one @sc{cvs} command to the other).
|
||
|
||
@strong{Warning:} the @samp{history} command is an exception; it supports
|
||
many options that conflict even with these standard options.
|
||
|
||
@table @code
|
||
@cindex Dates
|
||
@cindex Time
|
||
@cindex Specifying dates
|
||
@item -D @var{date_spec}
|
||
Use the most recent revision no later than @var{date_spec}.
|
||
@var{date_spec} is a single argument, a date description
|
||
specifying a date in the past.
|
||
|
||
The specification is @dfn{sticky} when you use it to make a
|
||
private copy of a source file; that is, when you get a working
|
||
file using @samp{-D}, @sc{cvs} records the date you specified, so that
|
||
further updates in the same directory will use the same date
|
||
(for more information on sticky tags/dates, @pxref{Sticky tags}).
|
||
|
||
A wide variety of date formats are supported by the underlying
|
||
@sc{rcs} facilities, similar to those described in co(1), but not
|
||
exactly the same. The @var{date_spec} is interpreted as being
|
||
in the local timezone, unless a specific timezone is specified.
|
||
Examples of valid date specifications include:
|
||
|
||
@example
|
||
1 month ago
|
||
2 hours ago
|
||
400000 seconds ago
|
||
last year
|
||
last Monday
|
||
yesterday
|
||
a fortnight ago
|
||
3/31/92 10:00:07 PST
|
||
January 23, 1987 10:05pm
|
||
22:00 GMT
|
||
@end example
|
||
|
||
@samp{-D} is available with the @code{checkout},
|
||
@code{diff}, @code{export}, @code{history},
|
||
@code{rdiff}, @code{rtag}, and @code{update} commands.
|
||
(The @code{history} command uses this option in a
|
||
slightly different way; @pxref{history options}).
|
||
|
||
Remember to quote the argument to the @samp{-D}
|
||
flag so that your shell doesn't interpret spaces as
|
||
argument separators. A command using the @samp{-D}
|
||
flag can look like this:
|
||
|
||
@example
|
||
$ cvs diff -D "1 hour ago" cvs.texinfo
|
||
@end example
|
||
|
||
@cindex Forcing a tag match
|
||
@item -f
|
||
When you specify a particular date or tag to @sc{cvs} commands, they
|
||
normally ignore files that do not contain the tag (or did not
|
||
exist prior to the date) that you specified. Use the @samp{-f} option
|
||
if you want files retrieved even when there is no match for the
|
||
tag or date. (The most recent revision of the file
|
||
will be used).
|
||
|
||
@need 800
|
||
@samp{-f} is available with these commands: @code{checkout},
|
||
@code{export}, @code{rdiff}, @code{rtag}, and @code{update}.
|
||
|
||
@strong{Warning:} The @code{commit} command also has a
|
||
@samp{-f} option, but it has a different behavior for
|
||
that command. @xref{commit options}.
|
||
|
||
@item -H
|
||
Help; describe the options available for this command. This is
|
||
the only option supported for all @sc{cvs} commands.
|
||
|
||
@item -k @var{kflag}
|
||
Alter the default @sc{rcs} processing of keywords.
|
||
@xref{Keyword substitution}, for the meaning of
|
||
@var{kflag}. Your @var{kflag} specification is
|
||
@dfn{sticky} when you use it to create a private copy
|
||
of a source file; that is, when you use this option
|
||
with the @code{checkout} or @code{update} commands,
|
||
@sc{cvs} associates your selected @var{kflag} with the
|
||
file, and continues to use it with future update
|
||
commands on the same file until you specify otherwise.
|
||
|
||
The @samp{-k} option is available with the @code{add},
|
||
@code{checkout}, @code{diff} and
|
||
@code{update} commands.
|
||
|
||
@item -l
|
||
Local; run only in current working directory, rather than
|
||
recursing through subdirectories.
|
||
|
||
@strong{Warning:} this is not the same
|
||
as the overall @samp{cvs -l} option, which you can specify to the
|
||
left of a cvs command!
|
||
|
||
Available with the following commands: @code{checkout},
|
||
@code{commit}, @code{diff}, @code{export}, @code{log},
|
||
@code{remove}, @code{rdiff}, @code{rtag},
|
||
@code{status}, @code{tag}, and @code{update}.
|
||
|
||
@cindex Editor, avoiding invocation of
|
||
@cindex Avoiding editor invocation
|
||
@item -m @var{message}
|
||
Use @var{message} as log information, instead of
|
||
invoking an editor.
|
||
|
||
Available with the following commands: @code{add},
|
||
@code{commit} and @code{import}.
|
||
|
||
@item -n
|
||
Do not run any checkout/commit/tag program. (A program can be
|
||
specified to run on each of these activities, in the modules
|
||
database (@pxref{modules}); this option bypasses it).
|
||
|
||
@strong{Warning:} this is not the same as the overall @samp{cvs -n}
|
||
option, which you can specify to the left of a cvs command!
|
||
|
||
Available with the @code{checkout}, @code{commit}, @code{export},
|
||
and @code{rtag} commands.
|
||
|
||
@item -P
|
||
Prune (remove) directories that are empty after being updated, on
|
||
@code{checkout}, or @code{update}. Normally, an empty directory
|
||
(one that is void of revision-controlled files) is left alone.
|
||
Specifying @samp{-P} will cause these directories to be silently
|
||
removed from your checked-out sources. This does not remove the
|
||
directory from the repository, only from your checked out copy.
|
||
Note that this option is implied by the @samp{-r} or @samp{-D}
|
||
options of @code{checkout} and @code{export}.
|
||
@c -- implied--
|
||
|
||
@item -p
|
||
Pipe the files retrieved from the repository to standard output,
|
||
rather than writing them in the current directory. Available
|
||
with the @code{checkout} and @code{update} commands.
|
||
|
||
@item -W
|
||
Specify file names that should be filtered. You can
|
||
use this option repeatedly. The spec can be a file
|
||
name pattern of the same type that you can specify in
|
||
the @file{.cvswrappers} file.
|
||
Avaliable with the following commands: @code{import},
|
||
and @code{update}.
|
||
|
||
@item -r @var{tag}
|
||
Use the revision specified by the @var{tag} argument instead of the
|
||
default @dfn{head} revision. As well as arbitrary tags defined
|
||
with the @code{tag} or @code{rtag} command, two special tags are
|
||
always available: @samp{HEAD} refers to the most recent version
|
||
available in the repository, and @samp{BASE} refers to the
|
||
revision you last checked out into the current working directory.
|
||
|
||
The tag specification is sticky when you use this option
|
||
with @code{checkout} or @code{update} to make your own
|
||
copy of a file: @sc{cvs} remembers the tag and continues to use it on
|
||
future update commands, until you specify otherwise (for more information
|
||
on sticky tags/dates, @pxref{Sticky tags}). The
|
||
tag can be either a symbolic or numeric tag.
|
||
@xref{Tags}.
|
||
|
||
Specifying the @samp{-q} global option along with the
|
||
@samp{-r} command option is often useful, to suppress
|
||
the warning messages when the @sc{rcs} history file
|
||
does not contain the specified tag.
|
||
|
||
@strong{Warning:} this is not the same as the overall `cvs -r' option,
|
||
which you can specify to the left of a cvs command!
|
||
|
||
@samp{-r} is available with the @code{checkout}, @code{commit},
|
||
@code{diff}, @code{history}, @code{export}, @code{rdiff},
|
||
@code{rtag}, and @code{update} commands.
|
||
|
||
@end table
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node add
|
||
@appendixsec add---Add a new file/directory to the repository
|
||
@cindex Add (subcommand)
|
||
|
||
@itemize @bullet
|
||
@item
|
||
Synopsis: add [-k kflag] [-m 'message'] files@dots{}
|
||
@item
|
||
Requires: repository, working directory.
|
||
@item
|
||
Changes: working directory.
|
||
@item
|
||
Synonym: new
|
||
@end itemize
|
||
|
||
Use the @code{add} command to create a new file or directory in the
|
||
source repository. The files or directories specified with @code{add}
|
||
must already exist in the current directory (which must have been
|
||
created with the @code{checkout} command). To add a whole new directory
|
||
hierarchy to the source repository (for example, files received
|
||
from a third-party vendor), use the @code{import} command
|
||
instead. @xref{import}.
|
||
|
||
If the argument to @code{add} refers to an immediate
|
||
sub-directory, the directory is created at the correct place in
|
||
the source repository, and the necessary @sc{cvs} administration
|
||
files are created in your working directory. If the directory
|
||
already exists in the source repository, @code{add} still creates
|
||
the administration files in your version of the directory.
|
||
This allows you to use @code{add} to add a particular directory
|
||
to your private sources even if someone else created that
|
||
directory after your checkout of the sources. You can do the
|
||
following:
|
||
|
||
@example
|
||
$ mkdir new_directory
|
||
$ cvs add new_directory
|
||
$ cvs update new_directory
|
||
@end example
|
||
|
||
An alternate approach using @code{update} might be:
|
||
|
||
@example
|
||
$ cvs update -d new_directory
|
||
@end example
|
||
|
||
(To add any available new directories to your working directory,
|
||
it's probably simpler to use @code{checkout} (@pxref{checkout})
|
||
or @samp{update -d} (@pxref{update})).
|
||
|
||
The added files are not placed in the source repository until you
|
||
use @code{commit} to make the change permanent. Doing an
|
||
@code{add} on a file that was removed with the @code{remove}
|
||
command will resurrect the file, unless a @code{commit} command
|
||
intervened.
|
||
@xref{Removing files}, for an example.
|
||
|
||
|
||
Unlike most other commands @code{add} never recurses down
|
||
directories. It cannot yet handle relative paths. Instead of
|
||
|
||
@example
|
||
$ cvs add foo/bar.c
|
||
@end example
|
||
|
||
you have to do
|
||
|
||
@example
|
||
$ cd foo
|
||
$ cvs add bar.c
|
||
@end example
|
||
|
||
@menu
|
||
* add options:: add options
|
||
* add examples:: add examples
|
||
@end menu
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node add options
|
||
@appendixsubsec add options
|
||
@cindex Add options
|
||
|
||
There are only two options you can give to @samp{add}:
|
||
|
||
@table @code
|
||
@item -k @var{kflag}
|
||
This option specifies the default way that this file
|
||
will be checked out. The @var{kflag} argument
|
||
(@pxref{Substitution modes}) is stored in the @sc{rcs}
|
||
file and can be changed with @code{admin -k}
|
||
(@pxref{admin options}). See @ref{Binary files}, for
|
||
information on using this option for binary files.
|
||
|
||
@item -m @var{description}
|
||
Using this option, you can give a description for the file. This
|
||
description appears in the history log (if it is enabled,
|
||
@pxref{history file}). It will also be saved in the @sc{rcs} history
|
||
file inside the repository when the file is committed. The
|
||
@code{log} command displays this description.
|
||
|
||
The description can be changed using @samp{admin -t}.
|
||
@xref{admin}.
|
||
|
||
If you omit the @samp{-m @var{description}} flag, an empty string will be
|
||
used. You will not be prompted for a description.
|
||
@end table
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node add examples
|
||
@appendixsubsec add examples
|
||
|
||
To add the file @file{backend.c} to the repository, with a
|
||
description, the following can be used.
|
||
|
||
@example
|
||
$ cvs add -m "Optimizer and code generation passes." backend.c
|
||
$ cvs commit -m "Early version. Not yet compilable." backend.c
|
||
@end example
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node admin
|
||
@appendixsec admin---Administration front end for rcs
|
||
@cindex Admin (subcommand)
|
||
|
||
@itemize @bullet
|
||
@item
|
||
Requires: repository, working directory.
|
||
@item
|
||
Changes: repository.
|
||
@item
|
||
Synonym: rcs
|
||
@end itemize
|
||
|
||
This is the @sc{cvs} interface to assorted administrative @sc{rcs}
|
||
facilities, documented in rcs(1). @code{admin} simply passes
|
||
all its options and arguments to the @code{rcs} command; it does
|
||
no filtering or other processing. This command @emph{does} work
|
||
recursively, however, so extreme care should be used.
|
||
|
||
If there is a group whose name matches a compiled in
|
||
value which defaults to @code{cvsadmin}, only members
|
||
of that group can use @code{cvs admin}. To disallow
|
||
@code{cvs admin} for all users, create a group with no
|
||
users in it.
|
||
|
||
@menu
|
||
* admin options:: admin options
|
||
* admin examples:: admin examples
|
||
@end menu
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node admin options
|
||
@appendixsubsec admin options
|
||
|
||
Not all valid @code{rcs} options are useful together
|
||
with @sc{cvs}. Some even makes it impossible to use
|
||
@sc{cvs} until you undo the effect!
|
||
|
||
This description of the available options is based on
|
||
the @samp{rcs(1)} man page, but modified to suit
|
||
readers that are more interrested in @sc{cvs} than
|
||
@sc{rcs}.
|
||
|
||
@table @code
|
||
@item -A@var{oldfile}
|
||
Might not work together with @sc{cvs}. Append the
|
||
access list of @var{oldfile} to the access list of the
|
||
@sc{rcs} file.
|
||
|
||
@item -a@var{logins}
|
||
Might not work together with @sc{cvs}. Append the
|
||
login names appearing in the comma-separated list
|
||
@var{logins} to the access list of the @sc{rcs} file.
|
||
|
||
@item -b[@var{rev}]
|
||
When used with bare @sc{rcs}, this
|
||
option sets the default branch to @var{rev}; in
|
||
@sc{cvs} sticky tags (@pxref{Sticky tags}) are a better
|
||
way to decide which branch you want to work on. With
|
||
@sc{cvs}, this option can be used to control behavior
|
||
with respect to the vendor branch.
|
||
@c FIXME: document how you use it with the vendor
|
||
@c branch (or fix cvs so that there is a more graceful
|
||
@c way to handle the case).
|
||
|
||
@item -c@var{string}
|
||
Useful with @sc{cvs}. Sets the comment leader to
|
||
@var{string}. The comment leader is printed before
|
||
every log message line generated by the keyword
|
||
@code{$@asis{}Log$} (@pxref{Keyword substitution}).
|
||
This is useful for programming languages without
|
||
multi-line comments. @sc{Rcs} initially guesses the
|
||
value of the comment leader from the file name
|
||
extension when the file is first committed.
|
||
|
||
@item -e[@var{logins}]
|
||
Might not work together with @sc{cvs}. Erase the login
|
||
names appearing in the comma-separated list
|
||
@var{logins} from the access list of the RCS file. If
|
||
@var{logins} is omitted, erase the entire access list.
|
||
|
||
@item -I
|
||
Run interactively, even if the standard input is not a
|
||
terminal.
|
||
|
||
@item -i
|
||
Useless with @sc{cvs}. When using bare @sc{rcs}, this
|
||
is used to create and initialize a new @sc{rcs} file,
|
||
without depositing a revision.
|
||
|
||
@item -k@var{subst}
|
||
Useful with @sc{cvs}. Set the default keyword
|
||
substitution to @var{subst}. @xref{Keyword
|
||
substitution}. Giving an explicit @samp{-k} option to
|
||
@code{cvs update}, @code{cvs export}, or @code{cvs
|
||
checkout} overrides this default.
|
||
|
||
@cindex Reserved checkouts
|
||
@cindex RCS-style locking
|
||
@item -l[@var{rev}]
|
||
Lock the revision with number @var{rev}. If a branch
|
||
is given, lock the latest revision on that branch. If
|
||
@var{rev} is omitted, lock the latest revision on the
|
||
default branch.
|
||
|
||
This can be used in conjunction with the
|
||
@file{rcslock.pl} script in the @file{contrib}
|
||
directory of the @sc{cvs} source distribution to
|
||
provide reserved checkouts (where only one user can be
|
||
editing a given file at a time). See the comments in
|
||
that file for details (and see the @file{README} file
|
||
in that directory for disclaimers about the unsupported
|
||
nature of contrib). According to comments in that
|
||
file, locking must set to strict (which is the default).
|
||
|
||
@item -L
|
||
Set locking to strict. Strict locking means that the
|
||
owner of an RCS file is not exempt from locking for
|
||
checkin. For use with @sc{cvs}, strict locking must be
|
||
set; see the discussion under the @samp{-l} option above.
|
||
|
||
@cindex Changing a log message
|
||
@cindex Replacing a log message
|
||
@cindex Correcting a log message
|
||
@cindex Fixing a log message
|
||
@cindex Log message, correcting
|
||
@item -m@var{rev}:@var{msg}
|
||
Replace the log message of revision @var{rev} with
|
||
@var{msg}.
|
||
|
||
@item -N@var{name}[:[@var{rev}]]
|
||
Act like @samp{-n}, except override any previous
|
||
assignment of @var{name}.
|
||
|
||
@item -n@var{name}[:[@var{rev}]]
|
||
Associate the symbolic name @var{name} with the branch
|
||
or revision @var{rev}. It is normally better to use
|
||
@samp{cvs tag} or @samp{cvs rtag} instead. Delete the
|
||
symbolic name if both @samp{:} and @var{rev} are
|
||
omitted; otherwise, print an error message if
|
||
@var{name} is already associated with another number.
|
||
If @var{rev} is symbolic, it is expanded before
|
||
association. A @var{rev} consisting of a branch number
|
||
followed by a @samp{.} stands for the current latest
|
||
revision in the branch. A @samp{:} with an empty
|
||
@var{rev} stands for the current latest revision on the
|
||
default branch, normally the trunk. For example,
|
||
@samp{rcs -n@var{name}: RCS/*} associates @var{name} with the
|
||
current latest revision of all the named RCS files;
|
||
this contrasts with @samp{rcs -n@var{name}:$ RCS/*} which
|
||
associates @var{name} with the revision numbers
|
||
extracted from keyword strings in the corresponding
|
||
working files.
|
||
|
||
@cindex Deleting revisions
|
||
@cindex Outdating revisions
|
||
@cindex Saving space
|
||
@item -o@var{range}
|
||
Potentially useful, but dangerous, with @sc{cvs} (see below).
|
||
Deletes (@dfn{outdates}) the revisions given by
|
||
@var{range}. A range consisting of a single revision
|
||
number means that revision. A range consisting of a
|
||
branch number means the latest revision on that branch.
|
||
A range of the form @samp{@var{rev1}:@var{rev2}} means
|
||
revisions @var{rev1} to @var{rev2} on the same branch,
|
||
@samp{:@var{rev}} means from the beginning of the
|
||
branch containing @var{rev} up to and including
|
||
@var{rev}, and @samp{@var{rev}:} means from revision
|
||
@var{rev} to the end of the branch containing
|
||
@var{rev}. None of the outdated revisions may have
|
||
branches or locks.
|
||
|
||
Due to the way @sc{cvs} handles branches @var{rev}
|
||
cannot be specified symbolically if it is a branch.
|
||
@xref{Magic branch numbers}, for an explanation.
|
||
|
||
Make sure that no-one has checked out a copy of the
|
||
revision you outdate. Strange things will happen if he
|
||
starts to edit it and tries to check it back in. For
|
||
this reason, this option is not a good way to take back
|
||
a bogus commit; commit a new revision undoing the bogus
|
||
change instead (@pxref{Merging two revisions}).
|
||
|
||
@item -q
|
||
Run quietly; do not print diagnostics.
|
||
|
||
@item -s@var{state}[:@var{rev}]
|
||
Useful with @sc{cvs}. Set the state attribute of the
|
||
revision @var{rev} to @var{state}. If @var{rev} is a
|
||
branch number, assume the latest revision on that
|
||
branch. If @var{rev} is omitted, assume the latest
|
||
revision on the default branch. Any identifier is
|
||
acceptable for @var{state}. A useful set of states is
|
||
@samp{Exp} (for experimental), @samp{Stab} (for
|
||
stable), and @samp{Rel} (for released). By default,
|
||
the state of a new revision is set to @samp{Exp} when
|
||
it is created. The state is visible in the output from
|
||
@var{cvs log} (@pxref{log}), and in the
|
||
@samp{$@asis{}Log$} and @samp{$@asis{}State$} keywords
|
||
(@pxref{Keyword substitution}). Note that @sc{cvs}
|
||
uses the @code{dead} state for its own purposes; to
|
||
take a file to or from the @code{dead} state use
|
||
commands like @code{cvs remove} and @code{cvs add}, not
|
||
@code{cvs admin -s}.
|
||
|
||
@item -t[@var{file}]
|
||
Useful with @sc{cvs}. Write descriptive text from the
|
||
contents of the named @var{file} into the RCS file,
|
||
deleting the existing text. The @var{file} pathname
|
||
may not begin with @samp{-}. If @var{file} is omitted,
|
||
obtain the text from standard input, terminated by
|
||
end-of-file or by a line containing @samp{.} by itself.
|
||
Prompt for the text if interaction is possible; see
|
||
@samp{-I}. The descriptive text can be seen in the
|
||
output from @samp{cvs log} (@pxref{log}).
|
||
|
||
@item -t-@var{string}
|
||
Similar to @samp{-t@var{file}}. Write descriptive text
|
||
from the @var{string} into the @sc{rcs} file, deleting
|
||
the existing text.
|
||
|
||
@item -U
|
||
Set locking to non-strict. Non-strict locking means
|
||
that the owner of a file need not lock a revision for
|
||
checkin. For use with @sc{cvs}, strict locking must be
|
||
set; see the discussion under the @samp{-l} option
|
||
above.
|
||
|
||
@item -u[@var{rev}]
|
||
See the option @samp{-l} above, for a discussion of
|
||
using this option with @sc{cvs}. Unlock the revision
|
||
with number @var{rev}. If a branch is given, unlock
|
||
the latest revision on that branch. If @var{rev} is
|
||
omitted, remove the latest lock held by the caller.
|
||
Normally, only the locker of a revision may unlock it.
|
||
Somebody else unlocking a revision breaks the lock.
|
||
This causes a mail message to be sent to the original
|
||
locker. The message contains a commentary solicited
|
||
from the breaker. The commentary is terminated by
|
||
end-of-file or by a line containing @code{.} by itself.
|
||
|
||
@item -V@var{n}
|
||
Emulate @sc{rcs} version @var{n}. Use -V@var{n} to make
|
||
an @sc{rcs} file acceptable to @sc{rcs} version @var{n}
|
||
by discarding information that would confuse version
|
||
@var{n}.
|
||
|
||
@item -x@var{suffixes}
|
||
Useless with @sc{cvs}. Use @var{suffixes} to
|
||
characterize RCS files.
|
||
@end table
|
||
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node admin examples
|
||
@appendixsubsec admin examples
|
||
|
||
@appendixsubsubsec Outdating is dangerous
|
||
|
||
First, an example of how @emph{not} to use the
|
||
@code{admin} command. It is included to stress the
|
||
fact that this command can be quite dangerous unless
|
||
you know @emph{exactly} what you are doing.
|
||
|
||
The @samp{-o} option can be used to @dfn{outdate} old revisions
|
||
from the history file. If you are short on disc this option
|
||
might help you. But think twice before using it---there is no
|
||
way short of restoring the latest backup to undo this command!
|
||
|
||
The next line is an example of a command that you would
|
||
@emph{not} like to execute.
|
||
|
||
@example
|
||
$ cvs admin -o:R_1_02 .
|
||
@end example
|
||
|
||
The above command will delete all revisions up to, and
|
||
including, the revision that corresponds to the tag
|
||
R_1_02. But beware! If there are files that have not
|
||
changed between R_1_02 and R_1_03 the file will have
|
||
@emph{the same} numerical revision number assigned to
|
||
the tags R_1_02 and R_1_03. So not only will it be
|
||
impossible to retrieve R_1_02; R_1_03 will also have to
|
||
be restored from the tapes!
|
||
|
||
@appendixsubsubsec Comment leaders
|
||
@cindex Comment leader
|
||
@cindex Log keyword, selecting comment leader
|
||
@cindex Nroff (selecting comment leader)
|
||
|
||
If you use the @code{$@asis{}Log$} keyword and you do
|
||
not agree with the guess for comment leader that
|
||
@sc{cvs} has done, you can enforce your will with
|
||
@code{cvs admin -c}. This might be suitable for
|
||
@code{nroff} source:
|
||
|
||
@example
|
||
$ cvs admin -c'.\" ' *.man
|
||
$ rm *.man
|
||
$ cvs update
|
||
@end example
|
||
|
||
The two last steps are to make sure that you get the
|
||
versions with correct comment leaders in your working
|
||
files.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node checkout
|
||
@appendixsec checkout---Check out sources for editing
|
||
@cindex Checkout (subcommand)
|
||
@cindex Co (subcommand)
|
||
|
||
@itemize @bullet
|
||
@item
|
||
Synopsis: checkout [options] modules@dots{}
|
||
@item
|
||
Requires: repository.
|
||
@item
|
||
Changes: working directory.
|
||
@item
|
||
Synonyms: co, get
|
||
@end itemize
|
||
|
||
Make a working directory containing copies of the
|
||
source files specified by @var{modules}. You must execute
|
||
@code{checkout} before using most of the other @sc{cvs}
|
||
commands, since most of them operate on your working
|
||
directory.
|
||
|
||
The @var{modules} part of the command are either
|
||
symbolic names for some
|
||
collection of source directories and files, or paths to
|
||
directories or files in the repository. The symbolic
|
||
names are defined in the @samp{modules} file.
|
||
@xref{modules}.
|
||
|
||
Depending on the modules you specify, @code{checkout} may
|
||
recursively create directories and populate them with
|
||
the appropriate source files. You can then edit these
|
||
source files at any time (regardless of whether other
|
||
software developers are editing their own copies of the
|
||
sources); update them to include new changes applied by
|
||
others to the source repository; or commit your work as
|
||
a permanent change to the source repository.
|
||
|
||
Note that @code{checkout} is used to create
|
||
directories. The top-level directory created is always
|
||
added to the directory where @code{checkout} is
|
||
invoked, and usually has the same name as the specified
|
||
module. In the case of a module alias, the created
|
||
sub-directory may have a different name, but you can be
|
||
sure that it will be a sub-directory, and that
|
||
@code{checkout} will show the relative path leading to
|
||
each file as it is extracted into your private work
|
||
area (unless you specify the @samp{-Q} global option).
|
||
|
||
The files created by @code{checkout} are created
|
||
read-write, unless the @samp{-r} option to @sc{cvs}
|
||
(@pxref{Global options}) is specified, the
|
||
@code{CVSREAD} environment variable is specified
|
||
(@pxref{Environment variables}), or a watch is in
|
||
effect for that file (@pxref{Watches}).
|
||
|
||
@c FIXME: misleading--checkout takes a module as
|
||
@c argument, and update does not--so -d behavior is not the only
|
||
@c difference.
|
||
Running @code{checkout} on a directory that was already
|
||
built by a prior @code{checkout} is also permitted, and
|
||
has the same effect as specifying the @samp{-d} option
|
||
to the @code{update} command, that is, any new
|
||
directories that have been created in the repository
|
||
will appear in your work area. @xref{update}.
|
||
|
||
@menu
|
||
* checkout options:: checkout options
|
||
* checkout examples:: checkout examples
|
||
@end menu
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node checkout options
|
||
@appendixsubsec checkout options
|
||
|
||
These standard options are supported by @code{checkout}
|
||
(@pxref{Common options}, for a complete description of
|
||
them):
|
||
|
||
@table @code
|
||
@item -D @var{date}
|
||
Use the most recent revision no later than @var{date}.
|
||
This option is sticky, and implies @samp{-P}. See
|
||
@ref{Sticky tags}, for more information on sticky tags/dates.
|
||
|
||
@item -f
|
||
Only useful with the @samp{-D @var{date}} or @samp{-r
|
||
@var{tag}} flags. If no matching revision is found,
|
||
retrieve the most recent revision (instead of ignoring
|
||
the file).
|
||
|
||
@item -k @var{kflag}
|
||
Process @sc{rcs} keywords according to @var{kflag}. See
|
||
co(1). This option is sticky; future updates of
|
||
this file in this working directory will use the same
|
||
@var{kflag}. The @code{status} command can be viewed
|
||
to see the sticky options. @xref{status}.
|
||
|
||
@item -l
|
||
Local; run only in current working directory.
|
||
|
||
@item -n
|
||
Do not run any checkout program (as specified
|
||
with the @samp{-o} option in the modules file;
|
||
@pxref{modules}).
|
||
|
||
@item -P
|
||
Prune empty directories.
|
||
|
||
@item -p
|
||
Pipe files to the standard output.
|
||
|
||
@item -r @var{tag}
|
||
Use revision @var{tag}. This option is sticky, and implies @samp{-P}.
|
||
See @ref{Sticky tags}, for more information on sticky tags/dates.
|
||
@end table
|
||
|
||
In addition to those, you can use these special command
|
||
options with @code{checkout}:
|
||
|
||
@table @code
|
||
@item -A
|
||
Reset any sticky tags, dates, or @samp{-k} options.
|
||
See @ref{Sticky tags}, for more information on sticky tags/dates.
|
||
|
||
@item -c
|
||
Copy the module file, sorted, to the standard output,
|
||
instead of creating or modifying any files or
|
||
directories in your working directory.
|
||
|
||
@item -d @var{dir}
|
||
Create a directory called @var{dir} for the working
|
||
files, instead of using the module name. Unless you
|
||
also use @samp{-N}, the paths created under @var{dir}
|
||
will be as short as possible.
|
||
|
||
@item -j @var{tag}
|
||
With two @samp{-j} options, merge changes from the
|
||
revision specified with the first @samp{-j} option to
|
||
the revision specified with the second @samp{j} option,
|
||
into the working directory.
|
||
|
||
With one @samp{-j} option, merge changes from the
|
||
ancestor revision to the revision specified with the
|
||
@samp{-j} option, into the working directory. The
|
||
ancestor revision is the common ancestor of the
|
||
revision which the working directory is based on, and
|
||
the revision specified in the @samp{-j} option.
|
||
|
||
In addition, each -j option can contain an optional
|
||
date specification which, when used with branches, can
|
||
limit the chosen revision to one within a specific
|
||
date. An optional date is specified by adding a colon
|
||
(:) to the tag:
|
||
@samp{-j@var{Symbolic_Tag}:@var{Date_Specifier}}.
|
||
|
||
@xref{Merging}.
|
||
|
||
@item -N
|
||
Only useful together with @samp{-d @var{dir}}. With this
|
||
option, @sc{cvs} will not shorten module paths in your
|
||
working directory. (Normally, @sc{cvs} shortens paths as
|
||
much as possible when you specify an explicit target
|
||
directory).
|
||
|
||
@item -s
|
||
Like @samp{-c}, but include the status of all modules,
|
||
and sort it by the status string. @xref{modules}, for
|
||
info about the @samp{-s} option that is used inside the
|
||
modules file to set the module status.
|
||
@end table
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node checkout examples
|
||
@appendixsubsec checkout examples
|
||
|
||
Get a copy of the module @samp{tc}:
|
||
|
||
@example
|
||
$ cvs checkout tc
|
||
@end example
|
||
|
||
Get a copy of the module @samp{tc} as it looked one day
|
||
ago:
|
||
|
||
@example
|
||
$ cvs checkout -D yesterday tc
|
||
@end example
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node commit
|
||
@appendixsec commit---Check files into the repository
|
||
@cindex Commit (subcommand)
|
||
|
||
@itemize @bullet
|
||
@item
|
||
Version 1.3 Synopsis: commit [-lnR] [-m 'log_message' |
|
||
-f file] [-r revision] [files@dots{}]
|
||
@item
|
||
Version 1.3.1 Synopsis: commit [-lnRf] [-m 'log_message' |
|
||
-F file] [-r revision] [files@dots{}]
|
||
@c -- rename-f-F--
|
||
@item
|
||
Requires: working directory, repository.
|
||
@item
|
||
Changes: repository.
|
||
@item
|
||
Synonym: ci
|
||
@end itemize
|
||
|
||
@strong{Warning:} The @samp{-f @var{file}} option will
|
||
probably be renamed to @samp{-F @var{file}}, and @samp{-f}
|
||
will be given a new behavior in future releases of @sc{cvs}.
|
||
@c -- rename-f-F--
|
||
|
||
Use @code{commit} when you want to incorporate changes
|
||
from your working source files into the source
|
||
repository.
|
||
|
||
If you don't specify particular files to commit, all of
|
||
the files in your working current directory are
|
||
examined. @code{commit} is careful to change in the
|
||
repository only those files that you have really
|
||
changed. By default (or if you explicitly specify the
|
||
@samp{-R} option), files in subdirectories are also
|
||
examined and committed if they have changed; you can
|
||
use the @samp{-l} option to limit @code{commit} to the
|
||
current directory only.
|
||
|
||
@code{commit} verifies that the selected files are up
|
||
to date with the current revisions in the source
|
||
repository; it will notify you, and exit without
|
||
committing, if any of the specified files must be made
|
||
current first with @code{update} (@pxref{update}).
|
||
@code{commit} does not call the @code{update} command
|
||
for you, but rather leaves that for you to do when the
|
||
time is right.
|
||
|
||
When all is well, an editor is invoked to allow you to
|
||
enter a log message that will be written to one or more
|
||
logging programs (@pxref{modules}, and @pxref{loginfo})
|
||
and placed in the @sc{rcs} history file inside the
|
||
repository. This log message can be retrieved with the
|
||
@code{log} command; @xref{log}. You can specify the
|
||
log message on the command line with the @samp{-m
|
||
@var{message}} option, and thus avoid the editor invocation,
|
||
or use the @samp{-f @var{file}} option to specify
|
||
@c -- rename-f-F--
|
||
that the argument file contains the log message.
|
||
|
||
@menu
|
||
* commit options:: commit options
|
||
* commit examples:: commit examples
|
||
@end menu
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node commit options
|
||
@appendixsubsec commit options
|
||
|
||
These standard options are supported by @code{commit}
|
||
(@pxref{Common options}, for a complete description of
|
||
them):
|
||
|
||
@table @code
|
||
@item -l
|
||
Local; run only in current working directory.
|
||
|
||
@item -n
|
||
Do not run any module program.
|
||
|
||
@item -R
|
||
Commit directories recursively. This is on by default.
|
||
|
||
@item -r @var{revision}
|
||
Commit to @var{revision}. @var{revision} must be
|
||
either a branch, or a revision on the main trunk that
|
||
is higher than any existing revision number. You
|
||
cannot commit to a specific revision on a branch.
|
||
@end table
|
||
|
||
@code{commit} also supports these options:
|
||
|
||
@table @code
|
||
@item -F @var{file}
|
||
This option is present in @sc{cvs} releases 1.3-s3 and
|
||
later. Read the log message from @var{file}, instead
|
||
of invoking an editor.
|
||
|
||
@item -f
|
||
@c -- rename-f-F--
|
||
This option is present in @sc{cvs} 1.3-s3 and later releases
|
||
of @sc{cvs}. Note that this is not the standard behavior of
|
||
the @samp{-f} option as defined in @xref{Common options}.
|
||
|
||
Force @sc{cvs} to commit a new revision even if you haven't
|
||
made any changes to the file. If the current revision
|
||
of @var{file} is 1.7, then the following two commands
|
||
are equivalent:
|
||
|
||
@example
|
||
$ cvs commit -f @var{file}
|
||
$ cvs commit -r 1.8 @var{file}
|
||
@end example
|
||
|
||
@item -f @var{file}
|
||
@c -- rename-f-F--
|
||
This option is present in @sc{cvs} releases 1.3, 1.3-s1 and
|
||
1.3-s2. Note that this is not the standard behavior of
|
||
the @samp{-f} option as defined in @xref{Common options}.
|
||
|
||
Read the log message from @var{file}, instead
|
||
of invoking an editor.
|
||
|
||
@item -m @var{message}
|
||
Use @var{message} as the log message, instead of
|
||
invoking an editor.
|
||
@end table
|
||
|
||
@need 2000
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node commit examples
|
||
@appendixsubsec commit examples
|
||
|
||
@appendixsubsubsec New major release number
|
||
|
||
When you make a major release of your product, you
|
||
might want the revision numbers to track your major
|
||
release number. You should normally not care about
|
||
the revision numbers, but this is a thing that many
|
||
people want to do, and it can be done without doing any
|
||
harm.
|
||
|
||
To bring all your files up to the @sc{rcs} revision 3.0
|
||
(including those that haven't changed), you might do:
|
||
|
||
@example
|
||
$ cvs commit -r 3.0
|
||
@end example
|
||
|
||
Note that it is generally a bad idea to try to make the
|
||
@sc{rcs} revision number equal to the current release number
|
||
of your product. You should think of the revision
|
||
number as an internal number that the @sc{cvs} package
|
||
maintains, and that you generally never need to care
|
||
much about. Using the @code{tag} and @code{rtag}
|
||
commands you can give symbolic names to the releases
|
||
instead. @xref{tag} and @xref{rtag}.
|
||
|
||
Note that the number you specify with @samp{-r} must be
|
||
larger than any existing revision number. That is, if
|
||
revision 3.0 exists, you cannot @samp{cvs commit
|
||
-r 1.3}.
|
||
|
||
@appendixsubsubsec Committing to a branch
|
||
|
||
You can commit to a branch revision (one that has an
|
||
even number of dots) with the @samp{-r} option. To
|
||
create a branch revision, use the @samp{-b} option
|
||
of the @code{rtag} or @code{tag} commands (@pxref{tag}
|
||
or @pxref{rtag}). Then, either @code{checkout} or
|
||
@code{update} can be used to base your sources on the
|
||
newly created branch. From that point on, all
|
||
@code{commit} changes made within these working sources
|
||
will be automatically added to a branch revision,
|
||
thereby not disturbing main-line development in any
|
||
way. For example, if you had to create a patch to the
|
||
1.2 version of the product, even though the 2.0 version
|
||
is already under development, you might do:
|
||
|
||
@example
|
||
$ cvs rtag -b -r FCS1_2 FCS1_2_Patch product_module
|
||
$ cvs checkout -r FCS1_2_Patch product_module
|
||
$ cd product_module
|
||
[[ hack away ]]
|
||
$ cvs commit
|
||
@end example
|
||
|
||
@noindent
|
||
This works automatically since the @samp{-r} option is
|
||
sticky.
|
||
|
||
@appendixsubsubsec Creating the branch after editing
|
||
|
||
Say you have been working on some extremely
|
||
experimental software, based on whatever revision you
|
||
happened to checkout last week. If others in your
|
||
group would like to work on this software with you, but
|
||
without disturbing main-line development, you could
|
||
commit your change to a new branch. Others can then
|
||
checkout your experimental stuff and utilize the full
|
||
benefit of @sc{cvs} conflict resolution. The scenario might
|
||
look like:
|
||
|
||
@c FIXME: Should we be recommending tagging the branchpoint?
|
||
@example
|
||
[[ hacked sources are present ]]
|
||
$ cvs tag -b EXPR1
|
||
$ cvs update -r EXPR1
|
||
$ cvs commit
|
||
@end example
|
||
|
||
The @code{update} command will make the @samp{-r
|
||
EXPR1} option sticky on all files. Note that your
|
||
changes to the files will never be removed by the
|
||
@code{update} command. The @code{commit} will
|
||
automatically commit to the correct branch, because the
|
||
@samp{-r} is sticky. You could also do like this:
|
||
|
||
@c FIXME: Should we be recommending tagging the branchpoint?
|
||
@example
|
||
[[ hacked sources are present ]]
|
||
$ cvs tag -b EXPR1
|
||
$ cvs commit -r EXPR1
|
||
@end example
|
||
|
||
@noindent
|
||
but then, only those files that were changed by you
|
||
will have the @samp{-r EXPR1} sticky flag. If you hack
|
||
away, and commit without specifying the @samp{-r EXPR1}
|
||
flag, some files may accidentally end up on the main
|
||
trunk.
|
||
|
||
To work with you on the experimental change, others
|
||
would simply do
|
||
|
||
@example
|
||
$ cvs checkout -r EXPR1 whatever_module
|
||
@end example
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node diff
|
||
@appendixsec diff---Run diffs between revisions
|
||
@cindex Diff (subcommand)
|
||
|
||
@itemize @bullet
|
||
@item
|
||
Synopsis: diff [-l] [rcsdiff_options] [[-r rev1 | -D date1] [-r rev2 | -D date2]] [files@dots{}]
|
||
@item
|
||
Requires: working directory, repository.
|
||
@item
|
||
Changes: nothing.
|
||
@end itemize
|
||
|
||
The @code{diff} command is used to compare different
|
||
revisions of files. The default action is to compare
|
||
your working files with the revisions they were based
|
||
on, and report any differences that are found.
|
||
|
||
If any file names are given, only those files are
|
||
compared. If any directories are given, all files
|
||
under them will be compared.
|
||
|
||
The exit status will be 0 if no differences were found,
|
||
1 if some differences were found, and 2 if any error
|
||
occurred.
|
||
|
||
@menu
|
||
* diff options:: diff options
|
||
* diff examples:: diff examples
|
||
@end menu
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node diff options
|
||
@appendixsubsec diff options
|
||
|
||
These standard options are supported by @code{diff}
|
||
(@pxref{Common options}, for a complete description of
|
||
them):
|
||
|
||
@table @code
|
||
@item -D @var{date}
|
||
Use the most recent revision no later than @var{date}.
|
||
See @samp{-r} for how this affects the comparison.
|
||
|
||
@sc{cvs} can be configured to pass the @samp{-D} option
|
||
through to @code{rcsdiff} (which in turn passes it on
|
||
to @code{diff}. @sc{Gnu} diff uses @samp{-D} as a way to
|
||
put @code{cpp}-style @samp{#define} statements around the output
|
||
differences. There is no way short of testing to
|
||
figure out how @sc{cvs} was configured. In the default
|
||
configuration @sc{cvs} will use the @samp{-D @var{date}} option.
|
||
|
||
@item -k @var{kflag}
|
||
Process @sc{rcs} keywords according to @var{kflag}. See
|
||
co(1).
|
||
|
||
@item -l
|
||
Local; run only in current working directory.
|
||
|
||
@item -R
|
||
Examine directories recursively. This option is on by
|
||
default.
|
||
|
||
@item -r @var{tag}
|
||
Compare with revision @var{tag}. Zero, one or two
|
||
@samp{-r} options can be present. With no @samp{-r}
|
||
option, the working file will be compared with the
|
||
revision it was based on. With one @samp{-r}, that
|
||
revision will be compared to your current working file.
|
||
With two @samp{-r} options those two revisions will be
|
||
compared (and your working file will not affect the
|
||
outcome in any way).
|
||
|
||
One or both @samp{-r} options can be replaced by a
|
||
@samp{-D @var{date}} option, described above.
|
||
@end table
|
||
|
||
Any other options that are found are passed through to
|
||
@code{rcsdiff}, which in turn passes them to
|
||
@code{diff}. The exact meaning of the options depends
|
||
on which @code{diff} you are using. The long options
|
||
introduced in @sc{gnu} diff 2.0 are not yet supported in
|
||
@sc{cvs}. See the documentation for your @code{diff} to see
|
||
which options are supported.
|
||
|
||
@c -- Document some common useful diff options, such as
|
||
@c -u and -c.
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node diff examples
|
||
@appendixsubsec diff examples
|
||
|
||
The following line produces a Unidiff (@samp{-u} flag)
|
||
between revision 1.14 and 1.19 of
|
||
@file{backend.c}. Due to the @samp{-kk} flag no
|
||
keywords are substituted, so differences that only depend
|
||
on keyword substitution are ignored.
|
||
|
||
@example
|
||
$ cvs diff -kk -u -r 1.14 -r 1.19 backend.c
|
||
@end example
|
||
|
||
Suppose the experimental branch EXPR1 was based on a
|
||
set of files tagged RELEASE_1_0. To see what has
|
||
happened on that branch, the following can be used:
|
||
|
||
@example
|
||
$ cvs diff -r RELEASE_1_0 -r EXPR1
|
||
@end example
|
||
|
||
A command like this can be used to produce a context
|
||
diff between two releases:
|
||
|
||
@example
|
||
$ cvs diff -c -r RELEASE_1_0 -r RELEASE_1_1 > diffs
|
||
@end example
|
||
|
||
If you are maintaining ChangeLogs, a command like the following
|
||
just before you commit your changes may help you write
|
||
the ChangeLog entry. All local modifications that have
|
||
not yet been committed will be printed.
|
||
|
||
@example
|
||
$ cvs diff -u | less
|
||
@end example
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node export
|
||
@appendixsec export---Export sources from CVS, similar to checkout
|
||
@cindex Export (subcommand)
|
||
|
||
@itemize @bullet
|
||
@item
|
||
Synopsis: export [-flNn] [-r rev|-D date] [-k subst] [-d dir] module@dots{}
|
||
@item
|
||
Requires: repository.
|
||
@item
|
||
Changes: current directory.
|
||
@end itemize
|
||
|
||
This command is a variant of @code{checkout}; use it
|
||
when you want a copy of the source for module without
|
||
the @sc{cvs} administrative directories. For example, you
|
||
might use @code{export} to prepare source for shipment
|
||
off-site. This command requires that you specify a
|
||
date or tag (with @samp{-D} or @samp{-r}), so that you
|
||
can count on reproducing the source you ship to others.
|
||
|
||
One often would like to use @samp{-kv} with @code{cvs
|
||
export}. This causes any @sc{rcs} keywords to be
|
||
expanded such that an import done at some other site
|
||
will not lose the keyword revision information. But be
|
||
aware that doesn't handle an export containing binary
|
||
files correctly. Also be aware that after having used
|
||
@samp{-kv}, one can no longer use the @code{ident}
|
||
command (which is part of the @sc{rcs} suite---see
|
||
ident(1)) which looks for @sc{rcs} keyword strings. If
|
||
you want to be able to use @code{ident} you must not
|
||
use @samp{-kv}.
|
||
|
||
@menu
|
||
* export options:: export options
|
||
@end menu
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node export options
|
||
@appendixsubsec export options
|
||
|
||
These standard options are supported by @code{export}
|
||
(@pxref{Common options}, for a complete description of
|
||
them):
|
||
|
||
@table @code
|
||
@item -D @var{date}
|
||
Use the most recent revision no later than @var{date}.
|
||
|
||
@item -f
|
||
If no matching revision is found, retrieve the most
|
||
recent revision (instead of ignoring the file).
|
||
|
||
@item -l
|
||
Local; run only in current working directory.
|
||
|
||
@item -n
|
||
Do not run any checkout program.
|
||
|
||
@item -R
|
||
Export directories recursively. This is on by default.
|
||
|
||
@item -r @var{tag}
|
||
Use revision @var{tag}.
|
||
@end table
|
||
|
||
In addition, these options (that are common to
|
||
@code{checkout} and @code{export}) are also supported:
|
||
|
||
@table @code
|
||
@item -d @var{dir}
|
||
Create a directory called @var{dir} for the working
|
||
files, instead of using the module name. Unless you
|
||
also use @samp{-N}, the paths created under @var{dir}
|
||
will be as short as possible.
|
||
|
||
@item -k @var{subst}
|
||
Set keyword expansion mode (@pxref{Substitution modes}).
|
||
|
||
@item -N
|
||
Only useful together with @samp{-d @var{dir}}. With this
|
||
option, @sc{cvs} will not shorten module paths in your
|
||
working directory. (Normally, @sc{cvs} shortens paths as
|
||
much as possible when you specify an explicit target
|
||
directory.)
|
||
@end table
|
||
|
||
@ignore
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@c @node export examples
|
||
@appendixsubsec export examples
|
||
|
||
Contributed examples are gratefully accepted.
|
||
@c -- Examples here!!
|
||
@end ignore
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node history
|
||
@appendixsec history---Show status of files and users
|
||
@cindex History (subcommand)
|
||
|
||
@itemize @bullet
|
||
@item
|
||
Synopsis: history [-report] [-flags] [-options args] [files@dots{}]
|
||
@item
|
||
Requires: the file @file{$CVSROOT/CVSROOT/history}
|
||
@item
|
||
Changes: nothing.
|
||
@end itemize
|
||
|
||
@sc{cvs} can keep a history file that tracks each use of the
|
||
@code{checkout}, @code{commit}, @code{rtag},
|
||
@code{update}, and @code{release} commands. You can
|
||
use @code{history} to display this information in
|
||
various formats.
|
||
|
||
Logging must be enabled by creating the file
|
||
@file{$CVSROOT/CVSROOT/history}.
|
||
|
||
@strong{Warning:} @code{history} uses @samp{-f}, @samp{-l},
|
||
@samp{-n}, and @samp{-p} in ways that conflict with the
|
||
normal use inside @sc{cvs} (@pxref{Common options}).
|
||
|
||
@menu
|
||
* history options:: history options
|
||
@end menu
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node history options
|
||
@appendixsubsec history options
|
||
|
||
Several options (shown above as @samp{-report}) control what
|
||
kind of report is generated:
|
||
|
||
@table @code
|
||
@item -c
|
||
Report on each time commit was used (i.e., each time
|
||
the repository was modified).
|
||
|
||
@item -e
|
||
Everything (all record types); equivalent to specifying
|
||
@samp{-xMACFROGWUT}.
|
||
|
||
@item -m @var{module}
|
||
Report on a particular module. (You can meaningfully
|
||
use @samp{-m} more than once on the command line.)
|
||
|
||
@item -o
|
||
Report on checked-out modules.
|
||
|
||
@item -T
|
||
Report on all tags.
|
||
|
||
@item -x @var{type}
|
||
Extract a particular set of record types @var{type} from the @sc{cvs}
|
||
history. The types are indicated by single letters,
|
||
which you may specify in combination.
|
||
|
||
Certain commands have a single record type:
|
||
|
||
@table @code
|
||
@item F
|
||
release
|
||
@item O
|
||
checkout
|
||
@item T
|
||
rtag
|
||
@end table
|
||
|
||
@noindent
|
||
One of four record types may result from an update:
|
||
|
||
@table @code
|
||
@item C
|
||
A merge was necessary but collisions were
|
||
detected (requiring manual merging).
|
||
@item G
|
||
A merge was necessary and it succeeded.
|
||
@item U
|
||
A working file was copied from the repository.
|
||
@item W
|
||
The working copy of a file was deleted during
|
||
update (because it was gone from the repository).
|
||
@end table
|
||
|
||
@noindent
|
||
One of three record types results from commit:
|
||
|
||
@table @code
|
||
@item A
|
||
A file was added for the first time.
|
||
@item M
|
||
A file was modified.
|
||
@item R
|
||
A file was removed.
|
||
@end table
|
||
@end table
|
||
|
||
The options shown as @samp{-flags} constrain or expand
|
||
the report without requiring option arguments:
|
||
|
||
@table @code
|
||
@item -a
|
||
Show data for all users (the default is to show data
|
||
only for the user executing @code{history}).
|
||
|
||
@item -l
|
||
Show last modification only.
|
||
|
||
@item -w
|
||
Show only the records for modifications done from the
|
||
same working directory where @code{history} is
|
||
executing.
|
||
@end table
|
||
|
||
The options shown as @samp{-options @var{args}} constrain the report
|
||
based on an argument:
|
||
|
||
@table @code
|
||
@item -b @var{str}
|
||
Show data back to a record containing the string
|
||
@var{str} in either the module name, the file name, or
|
||
the repository path.
|
||
|
||
@item -D @var{date}
|
||
Show data since @var{date}. This is slightly different
|
||
from the normal use of @samp{-D @var{date}}, which
|
||
selects the newest revision older than @var{date}.
|
||
|
||
@item -p @var{repository}
|
||
Show data for a particular source repository (you
|
||
can specify several @samp{-p} options on the same command
|
||
line).
|
||
|
||
@item -r @var{rev}
|
||
Show records referring to revisions since the revision
|
||
or tag named @var{rev} appears in individual @sc{rcs}
|
||
files. Each @sc{rcs} file is searched for the revision or
|
||
tag.
|
||
|
||
@item -t @var{tag}
|
||
Show records since tag @var{tag} was last added to the the
|
||
history file. This differs from the @samp{-r} flag
|
||
above in that it reads only the history file, not the
|
||
@sc{rcs} files, and is much faster.
|
||
|
||
@item -u @var{name}
|
||
Show records for user @var{name}.
|
||
@end table
|
||
|
||
@ignore
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@c @node history examples
|
||
@appendixsubsec history examples
|
||
|
||
Contributed examples will gratefully be accepted.
|
||
@c -- Examples here!
|
||
@end ignore
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node import
|
||
@appendixsec import---Import sources into CVS, using vendor branches
|
||
@cindex Import (subcommand)
|
||
|
||
@itemize @bullet
|
||
@item
|
||
Synopsis: import [-options] repository vendortag releasetag@dots{}
|
||
@item
|
||
Requires: Repository, source distribution directory.
|
||
@item
|
||
Changes: repository.
|
||
@end itemize
|
||
|
||
Use @code{import} to incorporate an entire source
|
||
distribution from an outside source (e.g., a source
|
||
vendor) into your source repository directory. You can
|
||
use this command both for initial creation of a
|
||
repository, and for wholesale updates to the module
|
||
from the outside source. @xref{Tracking sources}, for
|
||
a discussion on this subject.
|
||
|
||
The @var{repository} argument gives a directory name
|
||
(or a path to a directory) under the @sc{cvs} root directory
|
||
for repositories; if the directory did not exist,
|
||
import creates it.
|
||
|
||
When you use import for updates to source that has been
|
||
modified in your source repository (since a prior
|
||
import), it will notify you of any files that conflict
|
||
in the two branches of development; use @samp{checkout
|
||
-j} to reconcile the differences, as import instructs
|
||
you to do.
|
||
|
||
If @sc{cvs} decides a file should be ignored
|
||
(@pxref{cvsignore}), it does not import it and prints
|
||
@samp{I } followed by the filename
|
||
|
||
If the file @file{$CVSROOT/CVSROOT/cvswrappers} exists,
|
||
any file whose names match the specifications in that
|
||
file will be treated as packages and the appropriate
|
||
filtering will be performed on the file/directory
|
||
before being imported, @xref{Wrappers}.
|
||
|
||
The outside source is saved in a first-level @sc{rcs}
|
||
branch, by default 1.1.1. Updates are leaves of this
|
||
branch; for example, files from the first imported
|
||
collection of source will be revision 1.1.1.1, then
|
||
files from the first imported update will be revision
|
||
1.1.1.2, and so on.
|
||
|
||
At least three arguments are required.
|
||
@var{repository} is needed to identify the collection
|
||
of source. @var{vendortag} is a tag for the entire
|
||
branch (e.g., for 1.1.1). You must also specify at
|
||
least one @var{releasetag} to identify the files at
|
||
the leaves created each time you execute @code{import}.
|
||
|
||
@menu
|
||
* import options:: import options
|
||
* import examples:: import examples
|
||
@end menu
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node import options
|
||
@appendixsubsec import options
|
||
|
||
This standard option is supported by @code{import}
|
||
(@pxref{Common options}, for a complete description):
|
||
|
||
@table @code
|
||
@item -m @var{message}
|
||
Use @var{message} as log information, instead of
|
||
invoking an editor.
|
||
@end table
|
||
|
||
There are three additional special options.
|
||
|
||
@table @code
|
||
@item -b @var{branch}
|
||
Specify a first-level branch other than 1.1.1. Unless
|
||
the @samp{-b @var{branch}} flag is given, revisions will
|
||
@emph{always} be made to the branch 1.1.1---even if a
|
||
@var{vendortag} that matches another branch is given!
|
||
What happens in that case, is that the tag will be
|
||
reset to 1.1.1. Warning: This behavior might change
|
||
in the future.
|
||
|
||
@item -k @var{subst}
|
||
Indicate the RCS keyword expansion mode desired. This
|
||
setting will apply to all files created during the
|
||
import, but not to any files that previously existed in
|
||
the repository. See @ref{Substitution modes} for a
|
||
list of valid @samp{-k} settings.
|
||
|
||
@item -I @var{name}
|
||
Specify file names that should be ignored during
|
||
import. You can use this option repeatedly. To avoid
|
||
ignoring any files at all (even those ignored by
|
||
default), specify `-I !'.
|
||
|
||
@var{name} can be a file name pattern of the same type
|
||
that you can specify in the @file{.cvsignore} file.
|
||
@xref{cvsignore}.
|
||
@c -- Is this really true?
|
||
|
||
@item -W @var{spec}
|
||
Specify file names that should be filtered during
|
||
import. You can use this option repeatedly.
|
||
|
||
@var{spec} can be a file name pattern of the same type
|
||
that you can specify in the @file{.cvswrappers}
|
||
file. @xref{Wrappers}.
|
||
@end table
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node import examples
|
||
@appendixsubsec import examples
|
||
|
||
@xref{Tracking sources}, and @xref{From files}.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node log
|
||
@appendixsec log---Print out 'rlog' information for files
|
||
@cindex Log (subcommand)
|
||
|
||
@itemize @bullet
|
||
@item
|
||
Synopsis: log [-l] rlog-options [files@dots{}]
|
||
@item
|
||
Requires: repository, working directory.
|
||
@item
|
||
Changes: nothing.
|
||
@item
|
||
Synonym: rlog
|
||
@end itemize
|
||
|
||
Display log information for files. @code{log} calls
|
||
the @sc{rcs} utility @code{rlog}, which prints all available
|
||
information about the @sc{rcs} history file. This includes
|
||
the location of the @sc{rcs} file, the @dfn{head} revision
|
||
(the latest revision on the trunk), all symbolic names (tags)
|
||
and some other things. For each revision, the revision
|
||
number, the author, the number of lines added/deleted and
|
||
the log message are printed. All times are displayed in
|
||
Coordinated Universal Time (UTC). (Other parts of @sc{cvs}
|
||
print times in the local timezone).
|
||
@c -- timezone--
|
||
|
||
@menu
|
||
* log options:: log options
|
||
* log examples:: log examples
|
||
@end menu
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node log options
|
||
@appendixsubsec log options
|
||
|
||
Only one option is interpreted by @sc{cvs} and not passed on to @code{rlog}:
|
||
|
||
@table @code
|
||
@item -l
|
||
Local; run only in current working directory. (Default
|
||
is to run recursively).
|
||
@end table
|
||
|
||
By default, @code{rlog} prints all information that is
|
||
available. All other options (including those that
|
||
normally behave differently) are passed through to
|
||
@code{rlog} and restrict the output. See rlog(1) for a
|
||
complete description of options. This incomplete list
|
||
(which is a slightly edited extract from rlog(1)) lists
|
||
all options that are useful in conjunction with @sc{cvs}.
|
||
|
||
@strong{Please note:} There can be no space between the option
|
||
and its argument, since @code{rlog} parses its options
|
||
in a different way than @sc{cvs}.
|
||
|
||
@table @code
|
||
@item -b
|
||
Print information about the revisions on the default
|
||
branch, normally the highest branch on the trunk.
|
||
|
||
@item -d@var{dates}
|
||
Print information about revisions with a checkin
|
||
date/time in the range given by the
|
||
semicolon-separated list of dates. The following table
|
||
explains the available range formats:
|
||
|
||
@table @code
|
||
@item @var{d1}<@var{d2}
|
||
@itemx @var{d2}>@var{d1}
|
||
Select the revisions that were deposited between
|
||
@var{d1} and @var{d2} inclusive.
|
||
|
||
@item <@var{d}
|
||
@itemx @var{d}>
|
||
Select all revisions dated @var{d} or earlier.
|
||
|
||
@item @var{d}<
|
||
@itemx >@var{d}
|
||
Select all revisions dated @var{d} or later.
|
||
|
||
@item @var{d}
|
||
Select the single, latest revision dated @var{d} or
|
||
earlier.
|
||
@end table
|
||
|
||
The date/time strings @var{d}, @var{d1}, and @var{d2}
|
||
are in the free format explained in co(1). Quoting is
|
||
normally necessary, especially for < and >. Note that
|
||
the separator is a semicolon (;).
|
||
|
||
@item -h
|
||
Print only the @sc{rcs} pathname, working pathname, head,
|
||
default branch, access list, locks, symbolic names, and
|
||
suffix.
|
||
|
||
@item -N
|
||
Do not print the list of tags for this file. This
|
||
option can be very useful when your site uses a lot of
|
||
tags, so rather than "more"'ing over 3 pages of tag
|
||
information, the log information is presented without
|
||
tags at all.
|
||
|
||
@item -R
|
||
Print only the name of the @sc{rcs} history file.
|
||
|
||
@item -r@var{revisions}
|
||
Print information about revisions given in the
|
||
comma-separated list @var{revisions} of revisions and
|
||
ranges. The following table explains the available
|
||
range formats:
|
||
|
||
@table @code
|
||
@item @var{rev1}:@var{rev2}
|
||
Revisions @var{rev1} to @var{rev2} (which must be on
|
||
the same branch).
|
||
|
||
@item :@var{rev}
|
||
Revisions from the beginning of the branch up to
|
||
and including @var{rev}.
|
||
|
||
@item @var{rev}:
|
||
Revisions starting with @var{rev} to the end of the
|
||
branch containing @var{rev}.
|
||
|
||
@item @var{branch}
|
||
An argument that is a branch means all revisions on
|
||
that branch. You can unfortunately not specify a
|
||
symbolic branch here. You must specify the numeric
|
||
branch number. @xref{Magic branch numbers}, for an
|
||
explanation.
|
||
|
||
@item @var{branch1}:@var{branch2}
|
||
A range of branches means all revisions
|
||
on the branches in that range.
|
||
|
||
@item @var{branch}.
|
||
The latest revision in @var{branch}.
|
||
@end table
|
||
|
||
A bare @samp{-r} with no revisions means the latest
|
||
revision on the default branch, normally the trunk.
|
||
|
||
@item -s@var{states}
|
||
Print information about revisions whose state
|
||
attributes match one of the states given in the
|
||
comma-separated list @var{states}.
|
||
|
||
@item -t
|
||
Print the same as @samp{-h}, plus the descriptive text.
|
||
|
||
@item -w@var{logins}
|
||
Print information about revisions checked in by users
|
||
with login names appearing in the comma-separated list
|
||
@var{logins}. If @var{logins} is omitted, the user's
|
||
login is assumed.
|
||
@end table
|
||
|
||
@code{rlog} prints the intersection of the revisions
|
||
selected with the options @samp{-d}, @samp{-l},
|
||
@samp{-s}, and @samp{-w}, intersected with the union of
|
||
the revisions selected by @samp{-b} and @samp{-r}.
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node log examples
|
||
@appendixsubsec log examples
|
||
|
||
Contributed examples are gratefully accepted.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node rdiff
|
||
@appendixsec rdiff---'patch' format diffs between releases
|
||
@cindex Rdiff (subcommand)
|
||
|
||
@itemize @bullet
|
||
@item
|
||
rdiff [-flags] [-V vn] [-r t|-D d [-r t2|-D d2]] modules@dots{}
|
||
@item
|
||
Requires: repository.
|
||
@item
|
||
Changes: nothing.
|
||
@item
|
||
Synonym: patch
|
||
@end itemize
|
||
|
||
Builds a Larry Wall format patch(1) file between two
|
||
releases, that can be fed directly into the patch
|
||
program to bring an old release up-to-date with the new
|
||
release. (This is one of the few @sc{cvs} commands that
|
||
operates directly from the repository, and doesn't
|
||
require a prior checkout.) The diff output is sent to
|
||
the standard output device.
|
||
|
||
You can specify (using the standard @samp{-r} and
|
||
@samp{-D} options) any combination of one or two
|
||
revisions or dates. If only one revision or date is
|
||
specified, the patch file reflects differences between
|
||
that revision or date and the current head revisions in
|
||
the @sc{rcs} file.
|
||
|
||
Note that if the software release affected is contained
|
||
in more than one directory, then it may be necessary to
|
||
specify the @samp{-p} option to the patch command when
|
||
patching the old sources, so that patch is able to find
|
||
the files that are located in other directories.
|
||
|
||
@menu
|
||
* rdiff options:: rdiff options
|
||
* rdiff examples:: rdiff examples
|
||
@end menu
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node rdiff options
|
||
@appendixsubsec rdiff options
|
||
|
||
These standard options are supported by @code{rdiff}
|
||
(@pxref{Common options}, for a complete description of
|
||
them):
|
||
|
||
@table @code
|
||
@item -D @var{date}
|
||
Use the most recent revision no later than @var{date}.
|
||
|
||
@item -f
|
||
If no matching revision is found, retrieve the most
|
||
recent revision (instead of ignoring the file).
|
||
|
||
@item -l
|
||
Local; don't descend subdirectories.
|
||
|
||
@item -r @var{tag}
|
||
Use revision @var{tag}.
|
||
@end table
|
||
|
||
In addition to the above, these options are available:
|
||
|
||
@table @code
|
||
@item -c
|
||
Use the context diff format. This is the default format.
|
||
|
||
@item -s
|
||
Create a summary change report instead of a patch. The
|
||
summary includes information about files that were
|
||
changed or added between the releases. It is sent to
|
||
the standard output device. This is useful for finding
|
||
out, for example, which files have changed between two
|
||
dates or revisions.
|
||
|
||
@item -t
|
||
A diff of the top two revisions is sent to the standard
|
||
output device. This is most useful for seeing what the
|
||
last change to a file was.
|
||
|
||
@item -u
|
||
Use the unidiff format for the context diffs.
|
||
This option is not available if your diff does not
|
||
support the unidiff format. Remember that old versions
|
||
of the @code{patch} program can't handle the unidiff
|
||
format, so if you plan to post this patch to the net
|
||
you should probably not use @samp{-u}.
|
||
|
||
@item -V @var{vn}
|
||
Expand @sc{rcs} keywords according to the rules current in
|
||
@sc{rcs} version @var{vn} (the expansion format changed with
|
||
@sc{rcs} version 5).
|
||
@end table
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node rdiff examples
|
||
@appendixsubsec rdiff examples
|
||
|
||
Suppose you receive mail from @t{foo@@bar.com} asking for an
|
||
update from release 1.2 to 1.4 of the tc compiler. You
|
||
have no such patches on hand, but with @sc{cvs} that can
|
||
easily be fixed with a command such as this:
|
||
|
||
@example
|
||
$ cvs rdiff -c -r FOO1_2 -r FOO1_4 tc | \
|
||
$$ Mail -s 'The patches you asked for' foo@@bar.com
|
||
@end example
|
||
|
||
Suppose you have made release 1.3, and forked a branch
|
||
called @samp{R_1_3fix} for bugfixes. @samp{R_1_3_1}
|
||
corresponds to release 1.3.1, which was made some time
|
||
ago. Now, you want to see how much development has been
|
||
done on the branch. This command can be used:
|
||
|
||
@example
|
||
$ cvs patch -s -r R_1_3_1 -r R_1_3fix module-name
|
||
cvs rdiff: Diffing module-name
|
||
File ChangeLog,v changed from revision 1.52.2.5 to 1.52.2.6
|
||
File foo.c,v changed from revision 1.52.2.3 to 1.52.2.4
|
||
File bar.h,v changed from revision 1.29.2.1 to 1.2
|
||
@end example
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node release
|
||
@appendixsec release---Indicate that a Module is no longer in use
|
||
@cindex Release (subcommand)
|
||
|
||
@itemize @bullet
|
||
@item
|
||
release [-d] directories@dots{}
|
||
@item
|
||
Requires: Working directory.
|
||
@item
|
||
Changes: Working directory, history log.
|
||
@end itemize
|
||
|
||
This command is meant to safely cancel the effect of
|
||
@samp{cvs checkout}. Since @sc{cvs} doesn't lock files, it
|
||
isn't strictly necessary to use this command. You can
|
||
always simply delete your working directory, if you
|
||
like; but you risk losing changes you may have
|
||
forgotten, and you leave no trace in the @sc{cvs} history
|
||
file (@pxref{history file}) that you've abandoned your
|
||
checkout.
|
||
|
||
Use @samp{cvs release} to avoid these problems. This
|
||
command checks that no uncommitted changes are
|
||
present; that you are executing it from immediately
|
||
above a @sc{cvs} working directory; and that the repository
|
||
recorded for your files is the same as the repository
|
||
defined in the module database.
|
||
|
||
If all these conditions are true, @samp{cvs release}
|
||
leaves a record of its execution (attesting to your
|
||
intentionally abandoning your checkout) in the @sc{cvs}
|
||
history log.
|
||
|
||
@menu
|
||
* release options:: release options
|
||
* release output:: release options
|
||
* release examples:: release examples
|
||
@end menu
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node release options
|
||
@appendixsubsec release options
|
||
|
||
The @code{release} command supports one command option:
|
||
|
||
@table @code
|
||
@item -d
|
||
Delete your working copy of the file if the release
|
||
succeeds. If this flag is not given your files will
|
||
remain in your working directory.
|
||
|
||
@strong{Warning:} The @code{release} command uses
|
||
@samp{rm -r @file{module}} to delete your file. This
|
||
has the very serious side-effect that any directory
|
||
that you have created inside your checked-out sources,
|
||
and not added to the repository (using the @code{add}
|
||
command; @pxref{add}) will be silently deleted---even
|
||
if it is non-empty!
|
||
@end table
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node release output
|
||
@appendixsubsec release output
|
||
|
||
Before @code{release} releases your sources it will
|
||
print a one-line message for any file that is not
|
||
up-to-date.
|
||
|
||
@strong{Warning:} Any new directories that you have
|
||
created, but not added to the @sc{cvs} directory hierarchy
|
||
with the @code{add} command (@pxref{add}) will be
|
||
silently ignored (and deleted, if @samp{-d} is
|
||
specified), even if they contain files.
|
||
|
||
@table @code
|
||
@item U @var{file}
|
||
There exists a newer revision of this file in the
|
||
repository, and you have not modified your local copy
|
||
of the file.
|
||
|
||
@item A @var{file}
|
||
The file has been added to your private copy of the
|
||
sources, but has not yet been committed to the
|
||
repository. If you delete your copy of the sources
|
||
this file will be lost.
|
||
|
||
@item R @var{file}
|
||
The file has been removed from your private copy of the
|
||
sources, but has not yet been removed from the
|
||
repository, since you have not yet committed the
|
||
removal. @xref{commit}.
|
||
|
||
@item M @var{file}
|
||
The file is modified in your working directory. There
|
||
might also be a newer revision inside the repository.
|
||
|
||
@item ? @var{file}
|
||
@var{file} is in your working directory, but does not
|
||
correspond to anything in the source repository, and is
|
||
not in the list of files for @sc{cvs} to ignore (see the
|
||
description of the @samp{-I} option, and
|
||
@pxref{cvsignore}). If you remove your working
|
||
sources, this file will be lost.
|
||
|
||
Note that no warning message like this is printed for
|
||
spurious directories that @sc{cvs} encounters. The
|
||
directory, and all its contents, are silently ignored.
|
||
|
||
@c FIXME -- CVS should be fixed to print "? foo" for
|
||
@c such spurious directories
|
||
@end table
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node release examples
|
||
@appendixsubsec release examples
|
||
|
||
Release the module, and delete your local working copy
|
||
of the files.
|
||
|
||
@example
|
||
$ cd .. # @r{You must stand immediately above the}
|
||
# @r{sources when you issue @samp{cvs release}.}
|
||
$ cvs release -d tc
|
||
You have [0] altered files in this repository.
|
||
Are you sure you want to release (and delete) module `tc': y
|
||
$
|
||
@end example
|
||
|
||
@node rtag
|
||
@appendixsec rtag---Add a tag to the RCS file
|
||
@cindex Rtag (subcommand)
|
||
|
||
@itemize @bullet
|
||
@item
|
||
rtag [-falnR] [-b] [-d] [-r tag | -Ddate] symbolic_tag modules@dots{}
|
||
@item
|
||
Requires: repository.
|
||
@item
|
||
Changes: repository.
|
||
@item
|
||
Synonym: rfreeze
|
||
@end itemize
|
||
|
||
You can use this command to assign symbolic tags to
|
||
particular, explicitly specified source revisions in
|
||
the repository. @code{rtag} works directly on the
|
||
repository contents (and requires no prior checkout).
|
||
Use @code{tag} instead (@pxref{tag}), to base the
|
||
selection of revisions on the contents of your
|
||
working directory.
|
||
|
||
If you attempt to use a tag name that already exists,
|
||
@sc{cvs} will complain and not overwrite that tag. Use
|
||
the @samp{-F} option to force the new tag value.
|
||
|
||
@menu
|
||
* rtag options:: rtag options
|
||
@end menu
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node rtag options
|
||
@appendixsubsec rtag options
|
||
|
||
These standard options are supported by @code{rtag}
|
||
(@pxref{Common options}, for a complete description of
|
||
them):
|
||
|
||
@table @code
|
||
@item -D @var{date}
|
||
Tag the most recent revision no later than @var{date}.
|
||
|
||
@item -f
|
||
Only useful with the @samp{-D @var{date}} or @samp{-r @var{tag}}
|
||
flags. If no matching revision is found, use the most
|
||
recent revision (instead of ignoring the file).
|
||
|
||
@item -F
|
||
Overwrite an existing tag of the same name on a
|
||
different revision. This option is new in @sc{cvs}
|
||
1.4. The old behavior is matched by @samp{cvs tag -F}.
|
||
|
||
@item -l
|
||
Local; run only in current working directory.
|
||
|
||
@item -n
|
||
Do not run any tag program that was specified with the
|
||
@samp{-t} flag inside the @file{modules} file.
|
||
(@pxref{modules}).
|
||
|
||
@item -R
|
||
Commit directories recursively. This is on by default.
|
||
|
||
@item -r @var{tag}
|
||
Only tag those files that contain @var{tag}. This can
|
||
be used to rename a tag: tag only the files identified
|
||
by the old tag, then delete the old tag, leaving the
|
||
new tag on exactly the same files as the old tag.
|
||
@end table
|
||
|
||
In addition to the above common options, these options
|
||
are available:
|
||
|
||
@table @code
|
||
@item -a
|
||
Use the @samp{-a} option to have @code{rtag} look in the
|
||
@file{Attic} (@pxref{Removing files}) for removed files
|
||
that contain the specified tag. The tag is removed from
|
||
these files, which makes it convenient to re-use a
|
||
symbolic tag as development continues (and files get
|
||
removed from the up-coming distribution).
|
||
|
||
@item -b
|
||
Make the tag a branch tag. @xref{Branches}.
|
||
|
||
@item -d
|
||
Delete the tag instead of creating it.
|
||
|
||
In general, tags (often the symbolic names of software
|
||
distributions) should not be removed, but the @samp{-d}
|
||
option is available as a means to remove completely
|
||
obsolete symbolic names if necessary (as might be the
|
||
case for an Alpha release, or if you mistagged a
|
||
module).
|
||
@end table
|
||
|
||
@ignore
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@c @node rtag examples
|
||
@appendixsubsec rtag examples
|
||
|
||
@c -- Examples here!
|
||
@end ignore
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node status
|
||
@appendixsec status---Status info on the revisions
|
||
@cindex Status (subcommand)
|
||
|
||
@itemize @bullet
|
||
@item
|
||
status [-lR] [-v] [files@dots{}]
|
||
@item
|
||
Requires: working directory, repository.
|
||
@item
|
||
Changes: nothing.
|
||
@end itemize
|
||
|
||
Display a brief report on the current status of files
|
||
with respect to the source repository, including any
|
||
sticky tags, dates, or @samp{-k} options.
|
||
|
||
You can also use this command to determine the
|
||
potential impact of a @samp{cvs update} on your working
|
||
source directory---but remember that things might
|
||
change in the repository before you run @code{update}.
|
||
|
||
@menu
|
||
* status options:: status options
|
||
@end menu
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node status options
|
||
@appendixsubsec status options
|
||
|
||
These standard options are supported by @code{status}
|
||
(@pxref{Common options}, for a complete description of
|
||
them):
|
||
|
||
@table @code
|
||
@item -l
|
||
Local; run only in current working directory.
|
||
|
||
@item -R
|
||
Commit directories recursively. This is on by default.
|
||
@end table
|
||
|
||
There is one additional option:
|
||
|
||
@table @code
|
||
@item -v
|
||
Verbose. In addition to the information normally
|
||
displayed, print all symbolic tags, together with the
|
||
numerical value of the revision or branch they refer
|
||
to.
|
||
@end table
|
||
|
||
@ignore
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@c @node status examples
|
||
@appendixsubsec status examples
|
||
|
||
@c -- FIXME
|
||
@end ignore
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node tag
|
||
@appendixsec tag---Add a symbolic tag to checked out version of RCS file
|
||
@c -- //////// - unnecessary. Also
|
||
@c -- in a lot of other
|
||
@c -- places.
|
||
@cindex Tag (subcommand)
|
||
|
||
@itemize @bullet
|
||
@item
|
||
tag [-lR] [-b] [-d] symbolic_tag [files@dots{}]
|
||
@item
|
||
Requires: working directory, repository.
|
||
@item
|
||
Changes: repository.
|
||
@item
|
||
Synonym: freeze
|
||
@end itemize
|
||
|
||
Use this command to assign symbolic tags to the nearest
|
||
repository versions to your working sources. The tags
|
||
are applied immediately to the repository, as with
|
||
@code{rtag}, but the versions are supplied implicitly by the
|
||
@sc{cvs} records of your working files' history rather than
|
||
applied explicitly.
|
||
|
||
One use for tags is to record a snapshot of the
|
||
current sources when the software freeze date of a
|
||
project arrives. As bugs are fixed after the freeze
|
||
date, only those changed sources that are to be part of
|
||
the release need be re-tagged.
|
||
|
||
The symbolic tags are meant to permanently record which
|
||
revisions of which files were used in creating a
|
||
software distribution. The @code{checkout} and
|
||
@code{update} commands allow you to extract an exact
|
||
copy of a tagged release at any time in the future,
|
||
regardless of whether files have been changed, added,
|
||
or removed since the release was tagged.
|
||
|
||
This command can also be used to delete a symbolic tag,
|
||
or to create a branch. See the options section below.
|
||
|
||
If you attempt to use a tag name that already exists,
|
||
@sc{cvs} will complain and not overwrite that tag. Use
|
||
the @samp{-F} option to force the new tag value.
|
||
|
||
|
||
@menu
|
||
* tag options:: tag options
|
||
@end menu
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node tag options
|
||
@appendixsubsec tag options
|
||
|
||
These standard options are supported by @code{tag}
|
||
(@pxref{Common options}, for a complete description of
|
||
them):
|
||
|
||
@table @code
|
||
@item -F
|
||
Overwrite an existing tag of the same name on a
|
||
different revision. This option is new in @sc{cvs}
|
||
1.4. The old behavior is matched by @samp{cvs tag -F}.
|
||
|
||
@item -l
|
||
Local; run only in current working directory.
|
||
|
||
@item -R
|
||
Commit directories recursively. This is on by default.
|
||
@end table
|
||
|
||
Two special options are available:
|
||
|
||
@table @code
|
||
@item -b
|
||
The -b option makes the tag a branch tag
|
||
(@pxref{Branches}), allowing concurrent, isolated
|
||
development. This is most useful for creating a patch
|
||
to a previously released software distribution.
|
||
|
||
@item -d
|
||
Delete a tag.
|
||
|
||
If you use @samp{cvs tag -d symbolic_tag}, the symbolic
|
||
tag you specify is deleted instead of being added.
|
||
Warning: Be very certain of your ground before you
|
||
delete a tag; doing this permanently discards some
|
||
historical information, which may later turn out to
|
||
be valuable.
|
||
@end table
|
||
|
||
@ignore
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@c @node tag examples
|
||
@appendixsubsec tag examples
|
||
|
||
@c -- FIXME
|
||
@end ignore
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node update
|
||
@appendixsec update---Bring work tree in sync with repository
|
||
@cindex Update (subcommand)
|
||
|
||
@itemize @bullet
|
||
@item
|
||
update [-AdflPpR] [-d] [-r tag|-D date] files@dots{}
|
||
@item
|
||
Requires: repository, working directory.
|
||
@item
|
||
Changes: working directory.
|
||
@end itemize
|
||
|
||
After you've run checkout to create your private copy
|
||
of source from the common repository, other developers
|
||
will continue changing the central source. From time
|
||
to time, when it is convenient in your development
|
||
process, you can use the @code{update} command from
|
||
within your working directory to reconcile your work
|
||
with any revisions applied to the source repository
|
||
since your last checkout or update.
|
||
|
||
@menu
|
||
* update options:: update options
|
||
* update output:: update output
|
||
* update examples:: update examples
|
||
@end menu
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node update options
|
||
@appendixsubsec update options
|
||
|
||
These standard options are available with @code{update}
|
||
(@pxref{Common options}, for a complete description of
|
||
them):
|
||
|
||
@table @code
|
||
@item -D date
|
||
Use the most recent revision no later than @var{date}.
|
||
This option is sticky, and implies @samp{-P}.
|
||
See @ref{Sticky tags}, for more information on sticky tags/dates.
|
||
|
||
@item -f
|
||
Only useful with the @samp{-D @var{date}} or @samp{-r
|
||
@var{tag}} flags. If no matching revision is found,
|
||
retrieve the most recent revision (instead of ignoring
|
||
the file).
|
||
|
||
@item -k @var{kflag}
|
||
Process @sc{rcs} keywords according to @var{kflag}. See
|
||
co(1). This option is sticky; future updates of
|
||
this file in this working directory will use the same
|
||
@var{kflag}. The @code{status} command can be viewed
|
||
to see the sticky options. @xref{status}.
|
||
|
||
@item -l
|
||
Local; run only in current working directory. @xref{Recursive behavior}.
|
||
|
||
@item -P
|
||
Prune empty directories.
|
||
|
||
@item -p
|
||
Pipe files to the standard output.
|
||
|
||
@item -R
|
||
Operate recursively. This is on by default.
|
||
@xref{Recursive behavior}.
|
||
|
||
@item -r tag
|
||
Retrieve revision @var{tag}. This option is sticky,
|
||
and implies @samp{-P}.
|
||
See @ref{Sticky tags}, for more information on sticky tags/dates.
|
||
@end table
|
||
|
||
@need 800
|
||
These special options are also available with
|
||
@code{update}.
|
||
|
||
@table @code
|
||
@item -A
|
||
Reset any sticky tags, dates, or @samp{-k} options.
|
||
See @ref{Sticky tags}, for more information on sticky tags/dates.
|
||
|
||
@item -d
|
||
Create any directories that exist in the repository if
|
||
they're missing from the working directory. Normally,
|
||
@code{update} acts only on directories and files that
|
||
were already enrolled in your working directory.
|
||
|
||
This is useful for updating directories that were
|
||
created in the repository since the initial checkout;
|
||
but it has an unfortunate side effect. If you
|
||
deliberately avoided certain directories in the
|
||
repository when you created your working directory
|
||
(either through use of a module name or by listing
|
||
explicitly the files and directories you wanted on the
|
||
command line), then updating with @samp{-d} will create
|
||
those directories, which may not be what you want.
|
||
|
||
@item -I @var{name}
|
||
Ignore files whose names match @var{name} (in your
|
||
working directory) during the update. You can specify
|
||
@samp{-I} more than once on the command line to specify
|
||
several files to ignore. Use @samp{-I !} to avoid
|
||
ignoring any files at all. @xref{cvsignore}, for other
|
||
ways to make @sc{cvs} ignore some files.
|
||
|
||
@item -W@var{spec}
|
||
Specify file names that should be filtered during
|
||
update. You can use this option repeatedly.
|
||
|
||
@var{spec} can be a file name pattern of the same type
|
||
that you can specify in the @file{.cvswrappers}
|
||
file. @xref{Wrappers}.
|
||
|
||
@item -j@var{revision}
|
||
With two @samp{-j} options, merge changes from the
|
||
revision specified with the first @samp{-j} option to
|
||
the revision specified with the second @samp{j} option,
|
||
into the working directory.
|
||
|
||
With one @samp{-j} option, merge changes from the
|
||
ancestor revision to the revision specified with the
|
||
@samp{-j} option, into the working directory. The
|
||
ancestor revision is the common ancestor of the
|
||
revision which the working directory is based on, and
|
||
the revision specified in the @samp{-j} option.
|
||
|
||
In addition, each -j option can contain an optional
|
||
date specification which, when used with branches, can
|
||
limit the chosen revision to one within a specific
|
||
date. An optional date is specified by adding a colon
|
||
(:) to the tag:
|
||
@samp{-j@var{Symbolic_Tag}:@var{Date_Specifier}}.
|
||
|
||
@xref{Merging}.
|
||
|
||
@end table
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node update output
|
||
@appendixsubsec update output
|
||
|
||
@code{update} keeps you informed of its progress by
|
||
printing a line for each file, preceded by one
|
||
character indicating the status of the file:
|
||
|
||
@table @code
|
||
@item U @var{file}
|
||
The file was brought up to date with respect to the
|
||
repository. This is done for any file that exists in
|
||
the repository but not in your source, and for files
|
||
that you haven't changed but are not the most recent
|
||
versions available in the repository.
|
||
|
||
@item A @var{file}
|
||
The file has been added to your private copy of the
|
||
sources, and will be added to the source repository
|
||
when you run @code{commit} on the file. This is a
|
||
reminder to you that the file needs to be committed.
|
||
|
||
@item R @var{file}
|
||
The file has been removed from your private copy of the
|
||
sources, and will be removed from the source repository
|
||
when you run @code{commit} on the file. This is a
|
||
reminder to you that the file needs to be committed.
|
||
|
||
@item M @var{file}
|
||
The file is modified in your working directory.
|
||
|
||
@samp{M} can indicate one of two states for a file
|
||
you're working on: either there were no modifications
|
||
to the same file in the repository, so that your file
|
||
remains as you last saw it; or there were modifications
|
||
in the repository as well as in your copy, but they
|
||
were merged successfully, without conflict, in your
|
||
working directory.
|
||
|
||
@sc{cvs} will print some messages if it merges your work,
|
||
and a backup copy of your working file (as it looked
|
||
before you ran @code{update}) will be made. The exact
|
||
name of that file is printed while @code{update} runs.
|
||
|
||
@item C @var{file}
|
||
A conflict was detected while trying to merge your
|
||
changes to @var{file} with changes from the source
|
||
repository. @var{file} (the copy in your working
|
||
directory) is now the output of the rcsmerge(1) command
|
||
on the two revisions; an unmodified copy of your file
|
||
is also in your working directory, with the name
|
||
@file{.#@var{file}.@var{revision}} where @var{revision}
|
||
is the @sc{rcs} revision that your modified file started
|
||
from. (Note that some systems automatically purge
|
||
files that begin with @file{.#} if they have not been
|
||
accessed for a few days. If you intend to keep a copy
|
||
of your original file, it is a very good idea to rename
|
||
it.)
|
||
|
||
@item ? @var{file}
|
||
@var{file} is in your working directory, but does not
|
||
correspond to anything in the source repository, and is
|
||
not in the list of files for @sc{cvs} to ignore (see the
|
||
description of the @samp{-I} option, and
|
||
@pxref{cvsignore}).
|
||
|
||
Note that no warning message like this is printed for
|
||
spurious directories that @sc{cvs} encounters. The
|
||
directory, and all its contents, are silently ignored.
|
||
@end table
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node update examples
|
||
@appendixsubsec update examples
|
||
|
||
The following line will display all files which are not
|
||
up-to-date without actually change anything in your
|
||
working directory. It can be used to check what has
|
||
been going on with the project.
|
||
|
||
@example
|
||
$ cvs -n -q update
|
||
@end example
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node Administrative files
|
||
@appendix Reference manual for the Administrative files
|
||
@cindex Administrative files (reference)
|
||
@cindex Files, reference manual
|
||
@cindex Reference manual (files)
|
||
@cindex CVSROOT (file)
|
||
|
||
Inside the repository, in the directory
|
||
@file{$CVSROOT/CVSROOT}, there are a number of
|
||
supportive files for @sc{cvs}. You can use @sc{cvs} in a limited
|
||
fashion without any of them, but if they are set up
|
||
properly they can help make life easier.
|
||
|
||
The most important of these files is the @file{modules}
|
||
file, which defines the modules inside the repository.
|
||
|
||
@menu
|
||
* modules:: Defining modules
|
||
* Wrappers:: Treat directories as files
|
||
* commit files:: The commit support files
|
||
* commitinfo:: Pre-commit checking
|
||
* editinfo:: Specifying how log messages are created
|
||
* loginfo:: Where should log messages be sent?
|
||
* rcsinfo:: Templates for the log messages
|
||
* cvsignore:: Ignoring files via cvsignore
|
||
* history file:: History information
|
||
* Setting up:: Setting up the repository
|
||
* Variables:: Various variables are expanded
|
||
@end menu
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node modules
|
||
@appendixsec The modules file
|
||
@cindex Modules (admin file)
|
||
@cindex Defining modules (reference manual)
|
||
|
||
The @file{modules} file records your definitions of
|
||
names for collections of source code. @sc{cvs} will
|
||
use these definitions if you use @sc{cvs} to update the
|
||
modules file (use normal commands like @code{add},
|
||
@code{commit}, etc).
|
||
|
||
The @file{modules} file may contain blank lines and
|
||
comments (lines beginning with @samp{#}) as well as
|
||
module definitions. Long lines can be continued on the
|
||
next line by specifying a backslash (@samp{\}) as the
|
||
last character on the line.
|
||
|
||
A module definition is a single line of the
|
||
@file{modules} file, in either of two formats. In both
|
||
cases, @var{mname} represents the symbolic module name,
|
||
and the remainder of the line is its definition.
|
||
|
||
@table @code
|
||
@item @var{mname} -a @var{aliases}@dots{}
|
||
This represents the simplest way of defining a module
|
||
@var{mname}. The @samp{-a} flags the definition as a
|
||
simple alias: @sc{cvs} will treat any use of @var{mname} (as
|
||
a command argument) as if the list of names
|
||
@var{aliases} had been specified instead.
|
||
@var{aliases} may contain either other module names or
|
||
paths. When you use paths in aliases, @code{checkout}
|
||
creates all intermediate directories in the working
|
||
directory, just as if the path had been specified
|
||
explicitly in the @sc{cvs} arguments.
|
||
|
||
@item @var{mname} [ options ] @var{dir} [ @var{files}@dots{} ] [ &@var{module}@dots{} ]
|
||
In the simplest case, this form of module definition
|
||
reduces to @samp{@var{mname} @var{dir}}. This defines
|
||
all the files in directory @var{dir} as module mname.
|
||
@var{dir} is a relative path (from @code{$CVSROOT}) to a
|
||
directory of source in the source repository. In this
|
||
case, on checkout, a single directory called
|
||
@var{mname} is created as a working directory; no
|
||
intermediate directory levels are used by default, even
|
||
if @var{dir} was a path involving several directory
|
||
levels.
|
||
|
||
By explicitly specifying files in the module definition
|
||
after @var{dir}, you can select particular files from
|
||
directory @var{dir}. The sample definition for
|
||
@samp{modules} is an example of a module defined with a
|
||
single file from a particular directory. Here is
|
||
another example:
|
||
|
||
@example
|
||
m4test unsupported/gnu/m4 foreach.m4 forloop.m4
|
||
@end example
|
||
|
||
@noindent
|
||
With this definition, executing @samp{cvs checkout
|
||
m4test} will create a single working directory
|
||
@file{m4test} containing the two files listed, which
|
||
both come from a common directory several levels deep
|
||
in the @sc{cvs} source repository.
|
||
|
||
A module definition can refer to other modules by
|
||
including @samp{&@var{module}} in its definition.
|
||
@code{checkout} creates a subdirectory for each such
|
||
module, in your working directory.
|
||
@c -- Nope. "in your working directory" is wrong. What
|
||
@c -- is right?
|
||
|
||
@table @code
|
||
@item -d @var{name}
|
||
Name the working directory something other than the
|
||
module name.
|
||
|
||
@cindex Export program
|
||
@item -e @var{prog}
|
||
Specify a program @var{prog} to run whenever files in a
|
||
module are exported. @var{prog} runs with a single
|
||
argument, the module name.
|
||
|
||
@cindex Checkin program
|
||
@item -i @var{prog}
|
||
Specify a program @var{prog} to run whenever files in a
|
||
module are committed. @var{prog} runs with a single
|
||
argument, the full pathname of the affected directory
|
||
in a source repository. The @file{commitinfo},
|
||
@file{loginfo}, and @file{editinfo} files provide other
|
||
ways to call a program on commit.
|
||
|
||
@cindex Checkout program
|
||
@item -o @var{prog}
|
||
Specify a program @var{prog} to run whenever files in a
|
||
module are checked out. @var{prog} runs with a single
|
||
argument, the module name.
|
||
|
||
@cindex Status of a module
|
||
@cindex Module status
|
||
@item -s @var{status}
|
||
Assign a status to the module. When the module file is
|
||
printed with @samp{cvs checkout -s} the modules are
|
||
sorted according to primarily module status, and
|
||
secondarily according to the module name. This option
|
||
has no other meaning. You can use this option for
|
||
several things besides status: for instance, list the
|
||
person that is responsible for this module.
|
||
|
||
@cindex Tag program
|
||
@item -t @var{prog}
|
||
Specify a program @var{prog} to run whenever files in a
|
||
module are tagged with @code{rtag}. @var{prog} runs
|
||
with two arguments: the module name and the symbolic
|
||
tag specified to @code{rtag}. There is no way to
|
||
specify a program to run when @code{tag} is executed.
|
||
|
||
@cindex Update program
|
||
@item -u @var{prog}
|
||
Specify a program @var{prog} to run whenever @samp{cvs
|
||
update} is executed from the top-level directory of the
|
||
checked-out module. @var{prog} runs with a single
|
||
argument, the full path to the source repository for
|
||
this module.
|
||
@end table
|
||
@end table
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Wrappers
|
||
@appendixsec The cvswrappers file
|
||
@cindex cvswrappers (admin file)
|
||
@cindex CVSWRAPPERS, environment variable
|
||
@cindex Wrappers
|
||
|
||
Wrappers allow you to set a hook which transforms files on
|
||
their way in and out of @sc{cvs}. Most or all of the
|
||
wrappers features do not work with client/server @sc{cvs}.
|
||
|
||
The file @file{cvswrappers} defines the script that will be
|
||
run on a file when its name matches a regular
|
||
expresion. There are two scripts that can be run on a
|
||
file or directory. One script is executed on the file/directory
|
||
before being checked into the repository (this is denoted
|
||
with the @code{-t} flag) and the other when the file is
|
||
checked out of the repository (this is denoted with the
|
||
@code{-f} flag)
|
||
|
||
The @file{cvswrappers} also has a @samp{-m} option to
|
||
specify the merge methodology that should be used when
|
||
the file is updated. @code{MERGE} means the usual
|
||
@sc{cvs} behavior: try to merge the files (this
|
||
generally will not work for binary files). @code{COPY}
|
||
means that @code{cvs update} will merely copy one
|
||
version over the other, and require the user using
|
||
mechanisms outside @sc{cvs}, to insert any necessary
|
||
changes.
|
||
@c FIXME: which version is copied over which version?
|
||
The @samp{-m} wrapper option only affects behavior when
|
||
merging is done on update; it does not affect how files
|
||
are stored. See @xref{Binary files}, for more on
|
||
binary files.
|
||
|
||
The basic format of the file @file{cvswrappers} is:
|
||
|
||
@example
|
||
wildcard [option value][option value]...
|
||
|
||
where option is one of
|
||
-f from cvs filter value: path tofilter
|
||
-t to cvs filter value: path to filter
|
||
-m update methodology value: MERGE or COPY
|
||
|
||
and value is a single-quote delimited value.
|
||
@end example
|
||
|
||
@example
|
||
*.nib -f 'unwrap %s' -t 'wrap %s %s' -m 'COPY'
|
||
*.c -t 'indent %s %s'
|
||
@end example
|
||
|
||
@noindent
|
||
The above example of a @file{cvswrappers} file
|
||
states that all files/directories that end with a @code{.nib}
|
||
should be filtered with the @file{wrap} program before
|
||
checking the file into the repository. The file should
|
||
be filtered though the @file{unwrap} program when the
|
||
file is checked out of the repository. The
|
||
@file{cvswrappers} file also states that a @code{COPY}
|
||
methodology should be used when updating the files in
|
||
the repository (that is no merging should be performed).
|
||
|
||
The last example line says that all files that end with
|
||
a @code{*.c} should be filtered with @file{indent}
|
||
before being checked into the repository. Unlike the previous
|
||
example no filtering of the @code{*.c} file is done when
|
||
it is checked out of the repository.
|
||
@noindent
|
||
The @code{-t} filter is called with two arguments,
|
||
the first is the name of the file/directory to filter
|
||
and the second is the pathname to where the resulting
|
||
filtered file should be placed.
|
||
|
||
@noindent
|
||
The @code{-f} filter is called with one argument,
|
||
which is the name of the file to filter from. The end
|
||
result of this filter will be a file in the users directory
|
||
that they can work on as they normally would.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node commit files
|
||
@appendixsec The commit support files
|
||
@cindex Commit files
|
||
|
||
The @samp{-i} flag in the @file{modules} file can be
|
||
used to run a certain program whenever files are
|
||
committed (@pxref{modules}). The files described in
|
||
this section provide other, more flexible, ways to run
|
||
programs whenever something is committed.
|
||
|
||
There are three kind of programs that can be run on
|
||
commit. They are specified in files in the repository,
|
||
as described below. The following table summarizes the
|
||
file names and the purpose of the corresponding
|
||
programs.
|
||
|
||
@table @file
|
||
@item commitinfo
|
||
The program is responsible for checking that the commit
|
||
is allowed. If it exits with a non-zero exit status
|
||
the commit will be aborted.
|
||
|
||
@item editinfo
|
||
The specified program is used to edit the log message,
|
||
and possibly verify that it contains all required
|
||
fields. This is most useful in combination with the
|
||
@file{rcsinfo} file, which can hold a log message
|
||
template (@pxref{rcsinfo}).
|
||
|
||
@item loginfo
|
||
The specified program is called when the commit is
|
||
complete. It receives the log message and some
|
||
additional information and can store the log message in
|
||
a file, or mail it to appropriate persons, or maybe
|
||
post it to a local newsgroup, or@dots{} Your
|
||
imagination is the limit!
|
||
@end table
|
||
|
||
@menu
|
||
* syntax:: The common syntax
|
||
@end menu
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node syntax
|
||
@appendixsubsec The common syntax
|
||
@cindex Info files (syntax)
|
||
@cindex Syntax of info files
|
||
@cindex Common syntax of info files
|
||
|
||
The four files @file{commitinfo}, @file{loginfo},
|
||
@file{rcsinfo} and @file{editinfo} all have a common
|
||
format. The purpose of the files are described later
|
||
on. The common syntax is described here.
|
||
|
||
Each line contains the following:
|
||
@itemize @bullet
|
||
@item
|
||
A regular expression
|
||
|
||
@item
|
||
A whitespace separator---one or more spaces and/or tabs.
|
||
|
||
@item
|
||
A file name or command-line template.
|
||
@end itemize
|
||
|
||
@noindent
|
||
Blank lines are ignored. Lines that start with the
|
||
character @samp{#} are treated as comments. Long lines
|
||
unfortunately can @emph{not} be broken in two parts in
|
||
any way.
|
||
|
||
The first regular expression that matches the current
|
||
directory name in the repository is used. The rest of the line
|
||
is used as a file name or command-line as appropriate.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node commitinfo
|
||
@appendixsec Commitinfo
|
||
@cindex Commitinfo
|
||
@cindex Checking commits
|
||
@cindex Precommit checking
|
||
|
||
The @file{commitinfo} file defines programs to execute
|
||
whenever @samp{cvs commit} is about to execute. These
|
||
programs are used for pre-commit checking to verify
|
||
that the modified, added and removed files are really
|
||
ready to be committed. This could be used, for
|
||
instance, to verify that the changed files conform to
|
||
to your site's standards for coding practice.
|
||
|
||
As mentioned earlier, each line in the
|
||
@file{commitinfo} file consists of a regular expression
|
||
and a command-line template. The template can include
|
||
a program name and any number of arguments you wish to
|
||
supply to it. The full path to the current source
|
||
repository is appended to the template, followed by the
|
||
file names of any files involved in the commit (added,
|
||
removed, and modified files).
|
||
|
||
The first line with a regular expression matching the
|
||
relative path to the module will be used. If the
|
||
command returns a non-zero exit status the commit will
|
||
be aborted.
|
||
|
||
@cindex DEFAULT in commitinfo
|
||
If the repository name does not match any of the
|
||
regular expressions in this file, the @samp{DEFAULT}
|
||
line is used, if it is specified.
|
||
|
||
@cindex ALL in commitinfo
|
||
All occurances of the name @samp{ALL} appearing as a
|
||
regular expression are used in addition to the first
|
||
matching regular expression or the name @samp{DEFAULT}.
|
||
|
||
Note: when @sc{CVS} is accessing a remote repository,
|
||
@file{commitinfo} will be run on the @emph{remote}
|
||
(i.e., server) side, not the client side (@pxref{Remote
|
||
repositories}).
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node editinfo
|
||
@appendixsec Editinfo
|
||
@cindex Editinfo
|
||
@cindex Editor, specifying per module
|
||
@cindex Per-module editor
|
||
@cindex Log messages, editing
|
||
|
||
If you want to make sure that all log messages look the
|
||
same way, you can use the @file{editinfo} file to
|
||
specify a program that is used to edit the log message.
|
||
This program could be a custom-made editor that always
|
||
enforces a certain style of the log message, or maybe a
|
||
simple shell script that calls an editor, and checks
|
||
that the entered message contains the required fields.
|
||
|
||
If no matching line is found in the @file{editinfo}
|
||
file, the editor specified in the environment variable
|
||
@code{$CVSEDITOR} is used instead. If that variable is
|
||
not set, then the environment variable @code{$EDITOR}
|
||
is used instead. If that variable is not
|
||
set a precompiled default, normally @code{vi}, will be
|
||
used.
|
||
|
||
The @file{editinfo} file is often most useful together
|
||
with the @file{rcsinfo} file, which can be used to
|
||
specify a log message template.
|
||
|
||
Each line in the @file{editinfo} file consists of a
|
||
regular expression and a command-line template. The
|
||
template must include a program name, and can include
|
||
any number of arguments. The full path to the current
|
||
log message template file is appended to the template.
|
||
|
||
One thing that should be noted is that the @samp{ALL}
|
||
keyword is not supported. If more than one matching
|
||
line is found, the first one is used. This can be
|
||
useful for specifying a default edit script in a
|
||
module, and then overriding it in a subdirectory.
|
||
|
||
@cindex DEFAULT in editinfo
|
||
If the repository name does not match any of the
|
||
regular expressions in this file, the @samp{DEFAULT}
|
||
line is used, if it is specified.
|
||
|
||
If the edit script exits with a non-zero exit status,
|
||
the commit is aborted.
|
||
|
||
Note: when @sc{CVS} is accessing a remote repository,
|
||
@file{editinfo} will be run on the @emph{remote}
|
||
(i.e., server) side, not the client side (@pxref{Remote
|
||
repositories}).
|
||
|
||
@menu
|
||
* editinfo example:: Editinfo example
|
||
@end menu
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node editinfo example
|
||
@appendixsubsec Editinfo example
|
||
|
||
The following is a little silly example of a
|
||
@file{editinfo} file, together with the corresponding
|
||
@file{rcsinfo} file, the log message template and an
|
||
editor script. We begin with the log message template.
|
||
We want to always record a bug-id number on the first
|
||
line of the log message. The rest of log message is
|
||
free text. The following template is found in the file
|
||
@file{/usr/cvssupport/tc.template}.
|
||
|
||
@example
|
||
BugId:
|
||
@end example
|
||
|
||
The script @file{/usr/cvssupport/bugid.edit} is used to
|
||
edit the log message.
|
||
|
||
@example
|
||
#!/bin/sh
|
||
#
|
||
# bugid.edit filename
|
||
#
|
||
# Call $EDITOR on FILENAME, and verify that the
|
||
# resulting file contains a valid bugid on the first
|
||
# line.
|
||
if [ "x$EDITOR" = "x" ]; then EDITOR=vi; fi
|
||
if [ "x$CVSEDITOR" = "x" ]; then CVSEDITOR=$EDITOR; fi
|
||
$CVSEDITOR $1
|
||
until head -1|grep '^BugId:[ ]*[0-9][0-9]*$' < $1
|
||
do echo -n "No BugId found. Edit again? ([y]/n)"
|
||
read ans
|
||
case $@{ans@} in
|
||
n*) exit 1;;
|
||
esac
|
||
$CVSEDITOR $1
|
||
done
|
||
@end example
|
||
|
||
The @file{editinfo} file contains this line:
|
||
|
||
@example
|
||
^tc /usr/cvssupport/bugid.edit
|
||
@end example
|
||
|
||
The @file{rcsinfo} file contains this line:
|
||
|
||
@example
|
||
^tc /usr/cvssupport/tc.template
|
||
@end example
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node loginfo
|
||
@appendixsec Loginfo
|
||
@cindex Loginfo
|
||
@cindex Storing log messages
|
||
@cindex Mailing log messages
|
||
@cindex Distributing log messages
|
||
@cindex Log messages
|
||
|
||
The @file{loginfo} file is used to control where
|
||
@samp{cvs commit} log information is sent. The first
|
||
entry on a line is a regular expression which is tested
|
||
against the directory that the change is being made to,
|
||
relative to the @code{$CVSROOT}. If a match is found, then
|
||
the remainder of the line is a filter program that
|
||
should expect log information on its standard input.
|
||
|
||
The filter program may use one and only one % modifier
|
||
(a la printf). If @samp{%s} is specified in the filter
|
||
program, a brief title is included (enclosed in single
|
||
quotes) showing the modified file names.
|
||
|
||
If the repository name does not match any of the
|
||
regular expressions in this file, the @samp{DEFAULT}
|
||
line is used, if it is specified.
|
||
|
||
All occurances of the name @samp{ALL} appearing as a
|
||
regular expression are used in addition to the first
|
||
matching regular expression or @samp{DEFAULT}.
|
||
|
||
The first matching regular expression is used.
|
||
|
||
@xref{commit files}, for a description of the syntax of
|
||
the @file{loginfo} file.
|
||
|
||
Note: when @sc{CVS} is accessing a remote repository,
|
||
@file{loginfo} will be run on the @emph{remote}
|
||
(i.e., server) side, not the client side (@pxref{Remote
|
||
repositories}).
|
||
|
||
@menu
|
||
* loginfo example:: Loginfo example
|
||
@end menu
|
||
|
||
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||
@node loginfo example
|
||
@appendixsubsec Loginfo example
|
||
|
||
The following @file{loginfo} file, together with the
|
||
tiny shell-script below, appends all log messages
|
||
to the file @file{$CVSROOT/CVSROOT/commitlog},
|
||
and any commits to the administrative files (inside
|
||
the @file{CVSROOT} directory) are also logged in
|
||
@file{/usr/adm/cvsroot-log}.
|
||
@c and mailed to @t{ceder}.
|
||
|
||
@c FIXME: is it a CVS feature or bug that only the
|
||
@c first matching line is used? It is documented
|
||
@c above, but is it useful? This example (with the
|
||
@c mail to ceder put back in) is awkward to write if
|
||
@c only the first matching line is used.
|
||
@example
|
||
ALL /usr/local/bin/cvs-log $CVSROOT/CVSROOT/commitlog
|
||
@c ^CVSROOT Mail -s %s ceder
|
||
^CVSROOT /usr/local/bin/cvs-log /usr/adm/cvsroot-log
|
||
@end example
|
||
|
||
The shell-script @file{/usr/local/bin/cvs-log} looks
|
||
like this:
|
||
|
||
@example
|
||
#!/bin/sh
|
||
(echo "-----------------------------------------------------------------";
|
||
echo -n $USER" ";
|
||
date;
|
||
echo;
|
||
sed '1s+'$@{CVSROOT@}'++') >> $1
|
||
@end example
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node rcsinfo
|
||
@appendixsec Rcsinfo
|
||
@cindex Rcsinfo
|
||
@cindex Form for log message
|
||
@cindex Log message template
|
||
@cindex Template for log message
|
||
|
||
The @file{rcsinfo} file can be used to specify a form to
|
||
edit when filling out the commit log. The
|
||
@file{rcsinfo} file has a syntax similar to the
|
||
@file{editinfo}, @file{commitinfo} and @file{loginfo}
|
||
files. @xref{syntax}. Unlike the other files the second
|
||
part is @emph{not} a command-line template. Instead,
|
||
the part after the regular expression should be a full pathname to
|
||
a file containing the log message template.
|
||
|
||
If the repository name does not match any of the
|
||
regular expressions in this file, the @samp{DEFAULT}
|
||
line is used, if it is specified.
|
||
|
||
All occurances of the name @samp{ALL} appearing as a
|
||
regular expression are used in addition to the first
|
||
matching regular expression or @samp{DEFAULT}.
|
||
|
||
The log message template will be used as a default log
|
||
message. If you specify a log message with @samp{cvs
|
||
commit -m @var{message}} or @samp{cvs commit -f
|
||
@var{file}} that log message will override the
|
||
template.
|
||
|
||
@xref{editinfo example}, for an example @file{rcsinfo}
|
||
file.
|
||
|
||
When @sc{CVS} is accessing a remote repository,
|
||
the contents of @file{rcsinfo} at the time a directory
|
||
is first checked out will specify a template which does
|
||
not then change. If you edit @file{rcsinfo} or its
|
||
templates, you may need to check out a new working
|
||
directory.
|
||
@c Would be nice to fix CVS so this isn't needed. For
|
||
@c example, a mechanism analogous to CVS/Entries, where
|
||
@c the client keeps track of what version of the template
|
||
@c it has.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node cvsignore
|
||
@appendixsec Ignoring files via cvsignore
|
||
@cindex Cvsignore, global
|
||
@cindex Global cvsignore
|
||
@cindex Ignoring files
|
||
@c -- This chapter should maybe be moved to the
|
||
@c tutorial part of the manual?
|
||
|
||
There are certain file names that frequently occur
|
||
inside your working copy, but that you don't want to
|
||
put under @sc{cvs} control. Examples are all the object
|
||
files that you get while you compile your sources.
|
||
Normally, when you run @samp{cvs update}, it prints a
|
||
line for each file it encounters that it doesn't know
|
||
about (@pxref{update output}).
|
||
|
||
@sc{cvs} has a list of files (or sh(1) file name patterns)
|
||
that it should ignore while running @code{update},
|
||
@code{import} and @code{release}.
|
||
@c -- Are those the only three commands affected?
|
||
This list is constructed in the following way.
|
||
|
||
@itemize @bullet
|
||
@item
|
||
The list is initialized to include certain file name
|
||
patterns: names associated with @sc{cvs}
|
||
administration, or with other common source control
|
||
systems; common names for patch files, object files,
|
||
archive files, and editor backup files; and other names
|
||
that are usually artifacts of assorted utilities.
|
||
Currently, the default list of ignored file name
|
||
patterns is:
|
||
|
||
@cindex Ignored files
|
||
@cindex Automatically ignored files
|
||
@example
|
||
RCS SCCS CVS CVS.adm
|
||
RCSLOG cvslog.*
|
||
tags TAGS
|
||
.make.state .nse_depinfo
|
||
*~ #* .#* ,* _$* *$
|
||
*.old *.bak *.BAK *.orig *.rej .del-*
|
||
*.a *.olb *.o *.obj *.so *.exe
|
||
*.Z *.elc *.ln
|
||
core
|
||
@end example
|
||
|
||
@item
|
||
The per-repository list in
|
||
@file{$CVSROOT/CVSROOT/cvsignore} is appended to
|
||
the list, if that file exists.
|
||
|
||
@item
|
||
The per-user list in @file{.cvsignore} in your home
|
||
directory is appended to the list, if it exists.
|
||
|
||
@item
|
||
Any entries in the environment variable
|
||
@code{$CVSIGNORE} is appended to the list.
|
||
|
||
@item
|
||
Any @samp{-I} options given to @sc{cvs} is appended.
|
||
|
||
@item
|
||
As @sc{cvs} traverses through your directories, the contents
|
||
of any @file{.cvsignore} will be appended to the list.
|
||
The patterns found in @file{.cvsignore} are only valid
|
||
for the directory that contains them, not for
|
||
any sub-directories.
|
||
@end itemize
|
||
|
||
In any of the 5 places listed above, a single
|
||
exclamation mark (@samp{!}) clears the ignore list.
|
||
This can be used if you want to store any file which
|
||
normally is ignored by @sc{cvs}.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node history file
|
||
@appendixsec The history file
|
||
@cindex History file
|
||
@cindex Log information, saving
|
||
|
||
The file @file{$CVSROOT/CVSROOT/history} is used
|
||
to log information for the @code{history} command
|
||
(@pxref{history}). This file must be created to turn
|
||
on logging. This is done automatically if the
|
||
@code{cvs init} command is used to set up the
|
||
repository (@pxref{Setting up}).
|
||
|
||
The file format of the @file{history} file is
|
||
documented only in comments in the @sc{cvs} source
|
||
code, but generally programs should use the @code{cvs
|
||
history} command to access it anyway, in case the
|
||
format changes with future releases of @sc{cvs}.
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Setting up
|
||
@appendixsec Setting up the repository
|
||
@cindex Repository, setting up
|
||
@cindex Creating a repository
|
||
@cindex Setting up a repository
|
||
|
||
To set up a @sc{cvs} repository, choose a directory
|
||
with ample disk space available for the revision
|
||
history of the source files. It should be accessable
|
||
(directly or via a networked file system) from all
|
||
machines which want to use @sc{cvs} in server or local
|
||
mode; the client machines need not have any access to
|
||
it other than via the @sc{cvs} protocol.
|
||
|
||
To create a repository, run the @code{cvs init}
|
||
command. It will set up an empty repository in the
|
||
@sc{cvs} root specified in the usual way
|
||
(@pxref{Repository}). For example,
|
||
|
||
@example
|
||
cvs -d /usr/local/cvsroot init
|
||
@end example
|
||
|
||
@code{cvs init} is careful to never overwrite any
|
||
existing files in the repository, so no harm is done if
|
||
you run @code{cvs init} on an already set-up
|
||
repository.
|
||
|
||
@code{cvs init} will enable history logging; if you
|
||
don't want that, remove the history file after running
|
||
@code{cvs init}. @xref{history file}.
|
||
|
||
@node Variables
|
||
@appendixsec Expansions in administrative files
|
||
|
||
Sometimes in writing an administrative file, you might
|
||
want the file to be able to know various things based
|
||
on environment @sc{cvs} is running in. There are
|
||
several mechanisms to do that.
|
||
|
||
To find the home directory of the user running @sc{cvs}
|
||
(from the @code{HOME} environment variable), use
|
||
@samp{~} followed by @samp{/} or the end of the line.
|
||
Likewise for the home directory of @var{user}, use
|
||
@samp{~@var{user}}. These variables are expanded on
|
||
the server machine, and don't get any resonable
|
||
expansion if pserver (@pxref{Password authenticated})
|
||
is in used; therefore user variables (see below) may be
|
||
a better choice to customize behavior based on the user
|
||
running @sc{cvs}.
|
||
@c Based on these limitations, should we deprecate ~?
|
||
@c What is it good for? Are people using it?
|
||
|
||
One may want to know about various pieces of
|
||
information internal to @sc{cvs}. A @sc{cvs} internal
|
||
variable has the syntax @code{$@{@var{variable}@}},
|
||
where @var{variable} starts with a letter and consists
|
||
of alphanumberic characters and @samp{_}. If the
|
||
character following @var{variable} is a
|
||
non-alphanumeric character other than @samp{_}, the
|
||
@samp{@{} and @samp{@}} can be omitted. The @sc{cvs}
|
||
internal variables are:
|
||
|
||
@table @code
|
||
@item CVSROOT
|
||
This is the value of the @sc{cvs} root in use.
|
||
@xref{Repository}, for a description of the various
|
||
ways to specify this.
|
||
|
||
@item RCSBIN
|
||
This is the value @sc{cvs} is using for where to find
|
||
@sc{rcs} binaries. @xref{Global options}, for a
|
||
description of how to specify this.
|
||
|
||
@item CVSEDITOR
|
||
@itemx VISUAL
|
||
@itemx EDITOR
|
||
These all expand to the same value, which is the editor
|
||
that @sc{cvs} is using. @xref{Global options}, for how
|
||
to specify this.
|
||
|
||
@item USER
|
||
Username of the user running @sc{cvs} (on the @sc{cvs}
|
||
server machine).
|
||
@end table
|
||
|
||
If you want to pass a value to the administrative files
|
||
which the user that is running @sc{cvs} can specify,
|
||
use a user variable. To expand a user variable, the
|
||
administrative file contains
|
||
@code{$@{=@var{variable}@}}. To set a user variable,
|
||
specify the global option @samp{-s} to @sc{cvs}, with
|
||
argument @code{@var{variable}=@var{value}}. It may be
|
||
particularly useful to specify this option via
|
||
@file{.cvsrc} (@pxref{~/.cvsrc}).
|
||
|
||
For example, if you want the administrative file to
|
||
refer to a test directory you might create a user
|
||
variable @code{TESTDIR}. Then if @sc{cvs} is invoked
|
||
as @code{cvs -s TESTDIR=/work/local/tests}, and the
|
||
administrative file contains @code{sh
|
||
$@{=TESTDIR@}/runtests}, then that string is expanded
|
||
to @code{sh /work/local/tests/runtests}.
|
||
|
||
All other strings containing @samp{$} are reserved;
|
||
there is no way to quote a @samp{$} character so that
|
||
@samp{$} represents itself.
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node Environment variables
|
||
@appendix All environment variables which affect CVS
|
||
@cindex Environment variables
|
||
@cindex Reference manual for variables
|
||
|
||
This is a complete list of all environment variables
|
||
that affect @sc{cvs}.
|
||
|
||
@table @code
|
||
@cindex CVSIGNORE
|
||
@item $CVSIGNORE
|
||
A whitespace-separated list of file name patterns that
|
||
@sc{cvs} should ignore. @xref{cvsignore}.
|
||
|
||
@cindex CVSWRAPPERS
|
||
@item $CVSWRAPPERS
|
||
A whitespace-separated list of file name patterns that
|
||
@sc{cvs} should treat as wrappers. @xref{Wrappers}.
|
||
|
||
@cindex CVSREAD
|
||
@item $CVSREAD
|
||
If this is set, @code{checkout} and @code{update} will
|
||
try hard to make the files in your working directory
|
||
read-only. When this is not set, the default behavior
|
||
is to permit modification of your working files.
|
||
|
||
@cindex CVSROOT
|
||
@item $CVSROOT
|
||
Should contain the full pathname to the root of the @sc{cvs}
|
||
source repository (where the @sc{rcs} history files are
|
||
kept). This information must be available to @sc{cvs} for
|
||
most commands to execute; if @code{$CVSROOT} is not set,
|
||
or if you wish to override it for one invocation, you
|
||
can supply it on the command line: @samp{cvs -d cvsroot
|
||
cvs_command@dots{}} Once you have checked out a working
|
||
directory, @sc{cvs} stores the appropriate root (in
|
||
the file @file{CVS/Root}), so normally you only need to
|
||
worry about this when initially checking out a working
|
||
directory.
|
||
|
||
@cindex EDITOR
|
||
@cindex CVSEDITOR
|
||
@item $EDITOR
|
||
@itemx $CVSEDITOR
|
||
Specifies the program to use for recording log messages
|
||
during commit. If not set, the default is
|
||
@samp{/usr/ucb/vi}. @code{$CVSEDITOR} overrides
|
||
@code{$EDITOR}. @code{$CVSEDITOR} does not exist in
|
||
@sc{cvs} 1.3, but the next release will probably
|
||
include it.
|
||
|
||
@cindex PATH
|
||
@item $PATH
|
||
If @code{$RCSBIN} is not set, and no path is compiled
|
||
into @sc{cvs}, it will use @code{$PATH} to try to find all
|
||
programs it uses.
|
||
|
||
@cindex RCSBIN
|
||
@item $RCSBIN
|
||
Specifies the full pathname of the location of @sc{rcs} programs,
|
||
such as co(1) and ci(1). If not set, a compiled-in
|
||
value is used, or your @code{$PATH} is searched.
|
||
|
||
@cindex HOME
|
||
@item $HOME
|
||
@cindex HOMEPATH
|
||
@item $HOMEPATH
|
||
Used to locate the directory where the @file{.cvsrc}
|
||
file is searched (@code{$HOMEPATH} is used for Windows-NT).
|
||
@pxref{~/.cvsrc}
|
||
|
||
@cindex CVS_RSH
|
||
@item $CVS_RSH
|
||
Used in client-server mode when accessing a remote
|
||
repository using @sc{rsh}. The default value is
|
||
@code{rsh}. You can set it to use another program for
|
||
accssing the remote server (e.g. for HP-UX 9, you
|
||
should set it to @code{remsh} because @code{rsh}
|
||
invokes the restricted shell). @pxref{Connecting via
|
||
rsh}
|
||
|
||
@item $CVS_SERVER
|
||
Used in client-server mode when accessing a remote
|
||
repository using @sc{rsh}. It specifies the name of
|
||
the program to start on the server side when accessing
|
||
a remote repository using @sc{rsh}. The default value
|
||
is @code{cvs}. @pxref{Connecting via rsh}
|
||
|
||
@item $CVS_PASSFILE
|
||
Used in client-server mode when accessing the @code{cvs
|
||
login server}. Default value is @file{$HOME/.cvspass}.
|
||
@pxref{Password authentication client}
|
||
|
||
@item $CVS_PASSWORD
|
||
Used in client-server mode when accessing the @code{cvs
|
||
login server}.
|
||
@pxref{Password authentication client}
|
||
|
||
@item $CVS_CLIENT_PORT
|
||
Used in client-server mode when accessing the server
|
||
via Kerberos.
|
||
@pxref{Kerberos authenticated}
|
||
|
||
@cindex CVS_RCMD_PORT
|
||
@item $CVS_RCMD_PORT
|
||
Used in client-server mode. If set, specifies the port
|
||
number to be used when accessing the @sc{rcmd} demon on
|
||
the server side. (Currently not used for Unix clients).
|
||
|
||
@cindex CVS_CLIENT_LOG
|
||
@item $CVS_CLIENT_LOG
|
||
Used for debugging only in client-server
|
||
mode. If set, everything send to the server is logged
|
||
into @file{@code{$CVS_CLIENT_LOG}.in} and everything
|
||
send from the server is logged into
|
||
@file{@code{$CVS_CLIENT_LOG}.out}.
|
||
|
||
@cindex CVS_SERVER_SLEEP
|
||
@item $CVS_SERVER_SLEEP
|
||
Used only for debugging the server side in
|
||
client-server mode. If set, delays the start of the
|
||
server child process the the specified amount of
|
||
seconds so that you can attach to it with a debugger.
|
||
|
||
@cindex CVS_IGNORE_REMOTE_ROOT
|
||
@item $CVS_IGNORE_REMOTE_ROOT
|
||
(What is the purpose of this variable?)
|
||
|
||
@cindex COMSPEC
|
||
@item $COMSPEC
|
||
Used under OS/2 only. It specifies the name of the
|
||
command interpreter and defaults to @sc{cmd.exe}.
|
||
|
||
|
||
@end table
|
||
|
||
@sc{cvs} is a front-end to @sc{rcs}. The following environment
|
||
variables affect @sc{rcs}. Note that if you are using
|
||
the client/server @sc{cvs}, these variables need to be
|
||
set on the server side (which may or not may be
|
||
possible depending on how you are connecting). There
|
||
is probably not any need to set any of them, however.
|
||
|
||
@table @code
|
||
@cindex LOGNAME
|
||
@item $LOGNAME
|
||
@cindex USER
|
||
@itemx $USER
|
||
If set, they affect who @sc{rcs} thinks you are. If you
|
||
have trouble checking in files it might be because your
|
||
login name differs from the setting of e.g.
|
||
@code{$LOGNAME}.
|
||
|
||
@cindex RCSINIT
|
||
@item $RCSINIT
|
||
Options prepended to the argument list, separated by
|
||
spaces. A backslash escapes spaces within an option.
|
||
The @code{$RCSINIT} options are prepended to the
|
||
argument lists of most @sc{rcs} commands.
|
||
|
||
@cindex TMPDIR
|
||
@item $TMPDIR
|
||
@cindex TMP
|
||
@itemx $TMP
|
||
@cindex TEMP
|
||
@itemx $TEMP
|
||
Name of the temporary directory. The environment
|
||
variables are inspected in the order they appear above
|
||
and the first value found is taken; if none of them are
|
||
set, a host-dependent default is used, typically
|
||
@file{/tmp}.
|
||
@end table
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node Troubleshooting
|
||
@appendix Troubleshooting
|
||
|
||
@menu
|
||
* Magic branch numbers:: Magic branch numbers
|
||
@end menu
|
||
|
||
@ignore
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@c @node Bad administrative files
|
||
@appendixsec Bad administrative files
|
||
|
||
@c -- Give hints on how to fix them
|
||
@end ignore
|
||
|
||
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||
@node Magic branch numbers
|
||
@appendixsec Magic branch numbers
|
||
|
||
Externally, branch numbers consist of an odd number of
|
||
dot-separated decimal integers. @xref{Revision
|
||
numbers}. That is not the whole truth, however. For
|
||
efficiency reasons @sc{cvs} sometimes inserts an extra 0
|
||
in the second rightmost position (1.2.3 becomes
|
||
1.2.0.3, 8.9.10.11.12 becomes 8.9.10.11.0.12 and so
|
||
on).
|
||
|
||
@sc{cvs} does a pretty good job at hiding these so
|
||
called magic branches, but in at least four places the
|
||
hiding is incomplete.
|
||
|
||
@itemize @bullet
|
||
@item
|
||
The magic branch can appear in the output from
|
||
@code{cvs status} in vanilla @sc{cvs} 1.3. This is
|
||
fixed in @sc{cvs} 1.3-s2.
|
||
|
||
@item
|
||
The magic branch number appears in the output from
|
||
@code{cvs log}. This is much harder to fix, since
|
||
@code{cvs log} runs @code{rlog} (which is part of the
|
||
@sc{rcs} distribution), and modifying @code{rlog} to
|
||
know about magic branches would probably break someone's
|
||
habits (if they use branch 0 for their own purposes).
|
||
|
||
@item
|
||
You cannot specify a symbolic branch name to @code{cvs log}.
|
||
|
||
@item
|
||
You cannot specify a symbolic branch name to @code{cvs
|
||
admin}.
|
||
|
||
@end itemize
|
||
|
||
You can use the @code{admin} command to reassign a
|
||
symbolic name to a branch the way @sc{rcs} expects it
|
||
to be. If @code{R4patches} is assigned to the branch
|
||
1.4.2 (magic branch number 1.4.0.2) in file
|
||
@file{numbers.c} you can do this:
|
||
|
||
@example
|
||
$ cvs admin -NR4patches:1.4.2 numbers.c
|
||
@end example
|
||
|
||
It only works if at least one revision is already
|
||
committed on the branch. Be very careful so that you
|
||
do not assign the tag to the wrong number. (There is
|
||
no way to see how the tag was assigned yesterday).
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node Copying
|
||
@appendix GNU GENERAL PUBLIC LICENSE
|
||
@c @include gpl.texinfo
|
||
|
||
@c ---------------------------------------------------------------------
|
||
@node Index
|
||
@unnumbered Index
|
||
@cindex Index
|
||
|
||
@printindex cp
|
||
|
||
@summarycontents
|
||
|
||
@contents
|
||
|
||
@bye
|
||
|
||
Local Variables:
|
||
fill-column: 55
|
||
End:
|