[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Texi2html-cvs] texi2html/test formatting/menus.texi formatting...
From: |
Patrice Dumas |
Subject: |
[Texi2html-cvs] texi2html/test formatting/menus.texi formatting... |
Date: |
Sun, 26 Apr 2009 18:37:22 +0000 |
CVSROOT: /cvsroot/texi2html
Module name: texi2html
Changes by: Patrice Dumas <pertusus> 09/04/26 18:37:22
Modified files:
test/formatting: menus.texi
test/formatting/res/menus: menus.html
test/formatting/res/menus_simple: menus.html
test/formatting/res/menus_xml: menus.xml
test/formatting/res/texi_menus: menus.passfirst menus.passtexi
menus.texi
Added files:
test/manuals/res/ccvs_info: cvs.info cvs.info-1 cvs.info-2
Log message:
minor change ini menus.texi, some files added.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/texi2html/test/formatting/menus.texi?cvsroot=texi2html&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/texi2html/test/formatting/res/menus/menus.html?cvsroot=texi2html&r1=1.9&r2=1.10
http://cvs.savannah.gnu.org/viewcvs/texi2html/test/formatting/res/menus_simple/menus.html?cvsroot=texi2html&r1=1.9&r2=1.10
http://cvs.savannah.gnu.org/viewcvs/texi2html/test/formatting/res/menus_xml/menus.xml?cvsroot=texi2html&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/texi2html/test/formatting/res/texi_menus/menus.passfirst?cvsroot=texi2html&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/texi2html/test/formatting/res/texi_menus/menus.passtexi?cvsroot=texi2html&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/texi2html/test/formatting/res/texi_menus/menus.texi?cvsroot=texi2html&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/texi2html/test/manuals/res/ccvs_info/cvs.info?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/test/manuals/res/ccvs_info/cvs.info-1?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/test/manuals/res/ccvs_info/cvs.info-2?cvsroot=texi2html&rev=1.1
Patches:
Index: formatting/menus.texi
===================================================================
RCS file: /cvsroot/texi2html/texi2html/test/formatting/menus.texi,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- formatting/menus.texi 26 Aug 2008 15:51:37 -0000 1.3
+++ formatting/menus.texi 26 Apr 2009 18:37:20 -0000 1.4
@@ -90,6 +90,7 @@
Menu comment
* a description:(manual) other manual node. Chapter 2
+* Other file: (foo). Test
@end ifset
@end example
@end menu
Index: formatting/res/menus/menus.html
===================================================================
RCS file: /cvsroot/texi2html/texi2html/test/formatting/res/menus/menus.html,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- formatting/res/menus/menus.html 2 Apr 2009 09:14:34 -0000 1.9
+++ formatting/res/menus/menus.html 26 Apr 2009 18:37:20 -0000 1.10
@@ -189,6 +189,7 @@
Menu comment
</pre><pre class="example">
</pre><pre class="example"><a href="manual.html#other-manual-node">• a
description:(manual) other manual node</a>. Chapter 2
+</pre><pre class="example"><a href="foo.html#Top">• Other file:
(foo)</a>. Test
</pre></td></tr></table>
</th></tr></table>
Index: formatting/res/menus_simple/menus.html
===================================================================
RCS file:
/cvsroot/texi2html/texi2html/test/formatting/res/menus_simple/menus.html,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- formatting/res/menus_simple/menus.html 2 Apr 2009 09:14:34 -0000
1.9
+++ formatting/res/menus_simple/menus.html 26 Apr 2009 18:37:21 -0000
1.10
@@ -168,6 +168,7 @@
Menu comment
<a href="manual.html#other-manual-node">• a description:(manual) other
manual node</a>. Chapter 2
+<a href="foo.html#Top">• Other file: (foo)</a>. Test
</pre></td></tr></table>
<p><a name="anchor"></a>
Index: formatting/res/menus_xml/menus.xml
===================================================================
RCS file: /cvsroot/texi2html/texi2html/test/formatting/res/menus_xml/menus.xml,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- formatting/res/menus_xml/menus.xml 2 Apr 2009 09:14:34 -0000 1.5
+++ formatting/res/menus_xml/menus.xml 26 Apr 2009 18:37:21 -0000 1.6
@@ -154,6 +154,11 @@
<menutitle> a description</menutitle>
<menucomment> Chapter 2
</menucomment>
+</menuentry><menuentry>
+<menunode> (foo)</menunode>
+<menutitle> Other file</menutitle>
+<menucomment> Test
+</menucomment>
</menuentry></example></menu>
<para><anchor name="anchor"></anchor>
Index: formatting/res/texi_menus/menus.passfirst
===================================================================
RCS file:
/cvsroot/texi2html/texi2html/test/formatting/res/texi_menus/menus.passfirst,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- formatting/res/texi_menus/menus.passfirst 26 Aug 2008 15:51:39 -0000
1.3
+++ formatting/res/texi_menus/menus.passfirst 26 Apr 2009 18:37:21 -0000
1.4
@@ -84,29 +84,30 @@
menus.texi(,90) Menu comment
menus.texi(,91)
menus.texi(,92) * a description:(manual) other manual node. Chapter 2
-menus.texi(,94) @end example
-menus.texi(,95) @end menu
-menus.texi(,96)
-menus.texi(,97) @anchor{anchor}
-menus.texi(,98)
-menus.texi(,100) @node subsubsection
-menus.texi(,101) @subsubsection subsubsection
-menus.texi(,103)
-menus.texi(,104) @node chapter2
-menus.texi(,105) @chapter chapter 2
-menus.texi(,106)
-menus.texi(,107) @example
-menus.texi(,108) @menu
-menus.texi(,109) * section in chapter 2:: in description @cartouche
-menus.texi(,110) in cartouche
-menus.texi(,111) @end cartouche
-menus.texi(,112) @end menu
-menus.texi(,113) @end example
-menus.texi(,114)
-menus.texi(,115) @node section in chapter 2
-menus.texi(,116) @section section in chapter 2
-menus.texi(,117)
-menus.texi(,118) @contents
-menus.texi(,119) @shortcontents
-menus.texi(,120)
-menus.texi(,121) @bye
+menus.texi(,93) * Other file: (foo). Test
+menus.texi(,95) @end example
+menus.texi(,96) @end menu
+menus.texi(,97)
+menus.texi(,98) @anchor{anchor}
+menus.texi(,99)
+menus.texi(,101) @node subsubsection
+menus.texi(,102) @subsubsection subsubsection
+menus.texi(,104)
+menus.texi(,105) @node chapter2
+menus.texi(,106) @chapter chapter 2
+menus.texi(,107)
+menus.texi(,108) @example
+menus.texi(,109) @menu
+menus.texi(,110) * section in chapter 2:: in description @cartouche
+menus.texi(,111) in cartouche
+menus.texi(,112) @end cartouche
+menus.texi(,113) @end menu
+menus.texi(,114) @end example
+menus.texi(,115)
+menus.texi(,116) @node section in chapter 2
+menus.texi(,117) @section section in chapter 2
+menus.texi(,118)
+menus.texi(,119) @contents
+menus.texi(,120) @shortcontents
+menus.texi(,121)
+menus.texi(,122) @bye
Index: formatting/res/texi_menus/menus.passtexi
===================================================================
RCS file:
/cvsroot/texi2html/texi2html/test/formatting/res/texi_menus/menus.passtexi,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- formatting/res/texi_menus/menus.passtexi 26 Aug 2008 15:51:39 -0000
1.3
+++ formatting/res/texi_menus/menus.passtexi 26 Apr 2009 18:37:21 -0000
1.4
@@ -84,29 +84,30 @@
menus.texi(,90) Menu comment
menus.texi(,91)
menus.texi(,92) * a description:(manual) other manual node. Chapter 2
-menus.texi(,94) @end example
-menus.texi(,95) @end menu
-menus.texi(,96)
-menus.texi(,97) @anchor{anchor}
-menus.texi(,98)
-menus.texi(,100) @node subsubsection
-menus.texi(,101) @subsubsection subsubsection
-menus.texi(,103)
-menus.texi(,104) @node chapter2
-menus.texi(,105) @chapter chapter 2
-menus.texi(,106)
-menus.texi(,107) @example
-menus.texi(,108) @menu
-menus.texi(,109) * section in chapter 2:: in description @cartouche
-menus.texi(,110) in cartouche
-menus.texi(,111) @end cartouche
-menus.texi(,112) @end menu
-menus.texi(,113) @end example
-menus.texi(,114)
-menus.texi(,115) @node section in chapter 2
-menus.texi(,116) @section section in chapter 2
-menus.texi(,117)
-menus.texi(,118) @contents
-menus.texi(,119) @shortcontents
-menus.texi(,120)
-menus.texi(,121) @bye
+menus.texi(,93) * Other file: (foo). Test
+menus.texi(,95) @end example
+menus.texi(,96) @end menu
+menus.texi(,97)
+menus.texi(,98) @anchor{anchor}
+menus.texi(,99)
+menus.texi(,101) @node subsubsection
+menus.texi(,102) @subsubsection subsubsection
+menus.texi(,104)
+menus.texi(,105) @node chapter2
+menus.texi(,106) @chapter chapter 2
+menus.texi(,107)
+menus.texi(,108) @example
+menus.texi(,109) @menu
+menus.texi(,110) * section in chapter 2:: in description @cartouche
+menus.texi(,111) in cartouche
+menus.texi(,112) @end cartouche
+menus.texi(,113) @end menu
+menus.texi(,114) @end example
+menus.texi(,115)
+menus.texi(,116) @node section in chapter 2
+menus.texi(,117) @section section in chapter 2
+menus.texi(,118)
+menus.texi(,119) @contents
+menus.texi(,120) @shortcontents
+menus.texi(,121)
+menus.texi(,122) @bye
Index: formatting/res/texi_menus/menus.texi
===================================================================
RCS file:
/cvsroot/texi2html/texi2html/test/formatting/res/texi_menus/menus.texi,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- formatting/res/texi_menus/menus.texi 26 Aug 2008 15:51:39 -0000
1.3
+++ formatting/res/texi_menus/menus.texi 26 Apr 2009 18:37:21 -0000
1.4
@@ -85,6 +85,7 @@
Menu comment
* a description:(manual) other manual node. Chapter 2
+* Other file: (foo). Test
@end example
@end menu
Index: manuals/res/ccvs_info/cvs.info
===================================================================
RCS file: manuals/res/ccvs_info/cvs.info
diff -N manuals/res/ccvs_info/cvs.info
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ manuals/res/ccvs_info/cvs.info 26 Apr 2009 18:37:21 -0000 1.1
@@ -0,0 +1,207 @@
+This is cvs.info, produced by makeinfo version 4.13 from cvs.texi.
+
+INFO-DIR-SECTION GNU Packages
+START-INFO-DIR-ENTRY
+* CVS: (cvs). Concurrent Versions System
+END-INFO-DIR-ENTRY
+INFO-DIR-SECTION Individual utilities
+START-INFO-DIR-ENTRY
+* cvs: (cvs)CVS commands. Concurrent Versions System
+END-INFO-DIR-ENTRY
+
+
+Indirect:
+cvs.info-1: 335
+cvs.info-2: 301680
+
+Tag Table:
+(Indirect)
+Node: Top335
+Node: Overview3237
+Node: What is CVS?3802
+Node: What is CVS not?6404
+Node: A sample session11960
+Node: Getting the source12787
+Node: Committing your changes13673
+Node: Cleaning up15841
+Node: Viewing differences17554
+Node: Repository18459
+Node: Specifying a repository21172
+Node: Repository storage22512
+Node: Repository files23733
+Node: File permissions26581
+Node: Windows permissions30446
+Node: Attic31399
+Node: CVS in repository32453
+Node: Locks35549
+Node: CVSROOT storage38696
+Node: Working directory storage40503
+Node: Intro administrative files50130
+Node: Multiple repositories51852
+Node: Creating a repository53346
+Node: Backing up55289
+Node: Moving a repository57217
+Node: Remote repositories58297
+Node: Server requirements59938
+Node: Connecting via rsh62369
+Node: Password authenticated65115
+Node: Password authentication server65877
+Node: Password authentication client77131
+Node: Password authentication security80336
+Node: GSSAPI authenticated82196
+Node: Kerberos authenticated84046
+Node: Connecting via fork85874
+Node: Read-only access86986
+Node: Server temporary directory89993
+Node: Starting a new project91287
+Node: Setting up the files92032
+Node: From files92661
+Node: From other version control systems94648
+Node: From scratch97221
+Node: Defining the module97966
+Node: Revisions98952
+Node: Revision numbers100159
+Node: Versions revisions releases101200
+Node: Assigning revisions101787
+Node: Tags103338
+Node: Tagging the working directory108680
+Node: Tagging by date/tag110072
+Node: Modifying tags111450
+Node: Tagging add/remove114648
+Node: Sticky tags116287
+Node: Branching and merging119378
+Node: Branches motivation120676
+Node: Creating a branch121692
+Node: Accessing branches123257
+Node: Branches and revisions126488
+Node: Magic branch numbers129207
+Node: Merging a branch130704
+Node: Merging more than once133008
+Node: Merging two revisions135490
+Node: Merging adds and removals136820
+Node: Merging and keywords138100
+Node: Recursive behavior141421
+Node: Adding and removing143249
+Node: Adding files144144
+Node: Removing files146819
+Node: Removing directories150245
+Node: Moving files151413
+Node: Outside152066
+Node: Inside152990
+Node: Rename by copying153847
+Node: Moving directories154858
+Node: History browsing156265
+Node: log messages156818
+Node: history database157144
+Node: user-defined logging157628
+Node: annotate159434
+Node: Binary files160593
+Node: Binary why161231
+Node: Binary howto163470
+Node: Multiple developers166518
+Node: File status168678
+Node: Updating a file171769
+Node: Conflicts example173075
+Node: Informing others177116
+Node: Concurrency177662
+Node: Watches179414
+Node: Setting a watch180811
+Node: Getting Notified182109
+Node: Editing files185819
+Node: Watch information188341
+Node: Watches Compatibility189195
+Node: Choosing a model190076
+Node: Revision management192758
+Node: When to commit193364
+Node: Keyword substitution194479
+Node: Keyword list195545
+Node: Using keywords200363
+Node: Avoiding substitution202012
+Node: Substitution modes203222
+Node: Configuring keyword expansion206006
+Node: Log keyword209153
+Node: Tracking sources210311
+Node: First import211833
+Node: Update imports213177
+Node: Reverting local changes214962
+Node: Binary files in imports215661
+Node: Keywords in imports215977
+Node: Multiple vendor branches217123
+Node: Builds218824
+Node: Special Files221503
+Node: CVS commands222152
+Node: Structure223610
+Node: Exit status224886
+Node: ~/.cvsrc225883
+Node: Global options227926
+Node: Common options233080
+Node: admin240768
+Node: admin options241952
+Node: checkout253133
+Node: checkout options255898
+Node: checkout examples260242
+Node: commit260528
+Node: commit options262400
+Node: commit examples263765
+Node: diff266157
+Node: diff options267060
+Node: Line group formats274904
+Node: Line formats280629
+Node: diff examples283845
+Node: export284814
+Node: export options286122
+Node: history287205
+Node: history options287992
+Node: import291512
+Node: import options294127
+Node: import output295392
+Node: import examples296466
+Node: log296645
+Node: log options297800
+Node: log examples301680
+Node: rdiff301837
+Node: rdiff options303155
+Node: rdiff examples304824
+Node: release305801
+Node: release options307107
+Node: release output307796
+Node: release examples309080
+Node: update309562
+Node: update options310623
+Node: update output314738
+Node: Invoking CVS317602
+Node: Administrative files339763
+Node: modules341029
+Node: Alias modules342383
+Node: Regular modules343441
+Node: Ampersand modules344843
+Node: Excluding directories346088
+Node: Module options346640
+Node: Module program options348220
+Node: Wrappers349005
+Node: commit files350708
+Node: syntax352713
+Node: commitinfo353621
+Node: verifymsg355787
+Node: editinfo360414
+Node: editinfo example362714
+Node: loginfo364022
+Node: loginfo example366608
+Node: Keeping a checked out copy367456
+Node: rcsinfo368486
+Node: cvsignore370045
+Node: checkoutlist373317
+Node: history file374650
+Node: Variables375308
+Node: config378860
+Node: Environment variables383999
+Node: Compatibility389995
+Node: Troubleshooting391014
+Node: Error messages391652
+Node: Connection407710
+Node: Other problems412649
+Node: Credits413587
+Node: BUGS414991
+Node: Index418598
+
+End Tag Table
Index: manuals/res/ccvs_info/cvs.info-1
===================================================================
RCS file: manuals/res/ccvs_info/cvs.info-1
diff -N manuals/res/ccvs_info/cvs.info-1
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ manuals/res/ccvs_info/cvs.info-1 26 Apr 2009 18:37:21 -0000 1.1
@@ -0,0 +1,7334 @@
+This is cvs.info, produced by makeinfo version 4.13 from cvs.texi.
+
+INFO-DIR-SECTION GNU Packages
+START-INFO-DIR-ENTRY
+* CVS: (cvs). Concurrent Versions System
+END-INFO-DIR-ENTRY
+INFO-DIR-SECTION Individual utilities
+START-INFO-DIR-ENTRY
+* cvs: (cvs)CVS commands. Concurrent Versions System
+END-INFO-DIR-ENTRY
+
+
+File: cvs.info, Node: Top, Next: Overview, Up: (dir)
+
+CVS--Concurrent Versions System v4.2
+************************************
+
+This info manual describes how to use and administer CVS version 4.2.
+
+Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+ 2001, 2002, 2003 Free Software Foundation, Inc.
+
+Portions
+ Copyright (C) 1999, 2000, 2001, 2002, 2003 Derek R. Price,
+ Copyright (C) 2002, 2003 Ximbiot <http://ximbiot.com>,
+ Copyright (C) 1992, 1993, 1999 Signum Support AB,
+ and Copyright (C) others.
+
+ 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 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 this permission notice may be stated in a
+translation approved by the Free Software Foundation.
+
+* Menu:
+
+* Overview:: An introduction to CVS
+* Repository:: Where all your sources are stored
+* Starting a new project:: Starting a project with CVS
+* Revisions:: Numeric and symbolic names for revisions
+* Branching and merging:: Diverging/rejoining branches of development
+* Recursive behavior:: CVS descends directories
+* Adding and removing:: Adding/removing/renaming files/directories
+* History browsing:: Viewing the history of files in various ways
+
+CVS and the Real World.
+---------------
+* Binary files:: CVS can handle binary files
+* Multiple developers:: How CVS helps a group of developers
+* Revision management:: Policy questions for revision management
+* Keyword substitution:: CVS can include the revision inside the file
+* Tracking sources:: Tracking third-party sources
+* Builds:: Issues related to CVS and builds
+* Special Files:: Devices, links and other non-regular files
+
+References.
+-------
+* CVS commands:: CVS commands share some things
+* Invoking CVS:: Quick reference to CVS commands
+* Administrative files:: Reference manual for the Administrative files
+* Environment variables:: All environment variables which affect CVS
+* Compatibility:: Upgrading CVS versions
+* Troubleshooting:: Some tips when nothing works
+* Credits:: Some of the contributors to this manual
+* BUGS:: Dealing with bugs in CVS or this manual
+* Index:: Index
+
+
+File: cvs.info, Node: Overview, Next: Repository, Prev: Top, Up: Top
+
+1 Overview
+**********
+
+This chapter is for people who have never used CVS, and perhaps have
+never used version control software before.
+
+ If you are already familiar with CVS and are just trying to learn a
+particular feature or remember a certain command, you can probably skip
+everything here.
+
+* Menu:
+
+* What is CVS?:: What you can do with CVS
+* What is CVS not?:: Problems CVS doesn't try to solve
+* A sample session:: A tour of basic CVS usage
+
+
+File: cvs.info, Node: What is CVS?, Next: What is CVS not?, Up: Overview
+
+1.1 What is CVS?
+================
+
+CVS is a version control system. Using it, you can record the history
+of your source files.
+
+ 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 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.
+CVS stores all the versions of a file in a single file in a clever way
+that only stores the differences between versions.
+
+ 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 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. CVS solves this problem by insulating the different
+developers from each other. Every developer works in his own directory,
+and CVS merges the work when each developer is done.
+
+ CVS started out as a bunch of shell scripts written by Dick Grune,
+posted to the newsgroup `comp.sources.unix' in the volume 6 release of
+July, 1986. While no actual code from these shell scripts is present in
+the current version of CVS much of the CVS conflict resolution
+algorithms come from them.
+
+ In April, 1989, Brian Berliner designed and coded CVS. Jeff Polk
+later helped Brian with the design of the CVS module and vendor branch
+support.
+
+ You can get CVS in a variety of ways, including free download from
+the internet. For more information on downloading CVS and other CVS
+topics, see:
+
+ http://www.cvshome.org/
+ http://www.loria.fr/~molli/cvs-index.html
+
+ There is a mailing list, known as `info-cvs', devoted to CVS. To
+subscribe or unsubscribe write to address@hidden'. If you
+prefer a usenet group, the right group is `comp.software.config-mgmt'
+which is for CVS discussions (along with other configuration management
+systems). In the future, it might be possible to create a
+`comp.software.config-mgmt.cvs', but probably only if there is
+sufficient CVS traffic on `comp.software.config-mgmt'.
+
+ You can also subscribe to the `bug-cvs' mailing list, described in
+more detail in *note BUGS::. To subscribe send mail to
address@hidden'.
+
+
+File: cvs.info, Node: What is CVS not?, Next: A sample session, Prev: What
is CVS?, Up: Overview
+
+1.2 What is CVS not?
+====================
+
+CVS can do a lot of things for you, but it does not try to be everything
+for everyone.
+
+CVS is not a build system.
+ Though the structure of your repository and modules file interact
+ with your build system (e.g. `Makefile's), they are essentially
+ independent.
+
+ CVS does not dictate how you build anything. It merely stores
+ files for retrieval in a tree structure you devise.
+
+ CVS does not dictate how to use disk space in the checked out
+ working directories. If you write your `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.
+
+ If you modularize your work, and construct a build system that will
+ share files (via links, mounts, `VPATH' in `Makefile's, etc.), you
+ can arrange your disk usage however you like.
+
+ But you have to remember that _any_ such system is a lot of work to
+ construct and maintain. CVS does not address the issues involved.
+
+ Of course, you should place the tools created to support such a
+ build system (scripts, `Makefile's, etc) under CVS.
+
+ Figuring out what files need to be rebuilt when something changes
+ is, again, something to be handled outside the scope of CVS. One
+ traditional approach is to use `make' for building, and use some
+ automated tool for generating the dependencies which `make' uses.
+
+ See *note Builds::, for more information on doing builds in
+ conjunction with CVS.
+
+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, CVS can't
+ help.
+
+ 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.
+
+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.
+
+ 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 "conflict" is purely
+ textual, arising when two changes to the same base file are near
+ enough to spook the merge (i.e. `diff3') command.
+
+ 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 `X' defined
+ in file `A'. At the same time, someone edits file `B', adding new
+ calls to function `X' using the old arguments. You are outside the
+ realm of CVS's competence.
+
+ Acquire the habit of reading specs and talking to your peers.
+
+CVS does not have change control
+ Change control refers to a number of things. First of all it can
+ mean "bug-tracking", that is being able to keep a database of
+ reported bugs and the status of each one (is it fixed? in what
+ release? has the bug submitter agreed that it is fixed?). For
+ interfacing CVS to an external bug-tracking system, see the
+ `rcsinfo' and `verifymsg' files (*note Administrative files::).
+
+ Another aspect of change control is keeping track of the fact that
+ changes to several files were in fact changed together as one
+ logical change. If you check in several files in a single `cvs
+ commit' operation, CVS then forgets that those files were checked
+ in together, and the fact that they have the same log message is
+ the only thing tying them together. Keeping a GNU style
+ `ChangeLog' can help somewhat.
+
+ Another aspect of change control, in some systems, is the ability
+ to keep track of the status of each change. Some changes have been
+ written by a developer, others have been reviewed by a second
+ developer, and so on. Generally, the way to do this with CVS is to
+ generate a diff (using `cvs diff' or `diff') and email it to
+ someone who can then apply it using the `patch' utility. This is
+ very flexible, but depends on mechanisms outside CVS to make sure
+ nothing falls through the cracks.
+
+CVS is not an automated testing program
+ It should be possible to enforce mandatory use of a testsuite using
+ the `commitinfo' file. I haven't heard a lot about projects trying
+ to do that or whether there are subtle gotchas, however.
+
+CVS does not have a builtin process model
+ Some systems provide ways to ensure that changes or releases go
+ through various steps, with various approvals as needed.
+ Generally, one can accomplish this with CVS but it might be a
+ little more work. In some cases you'll want to use the
+ `commitinfo', `loginfo', `rcsinfo', or `verifymsg' files, to
+ require that certain steps be performed before cvs will allow a
+ checkin. Also consider whether features such as branches and tags
+ can be used to perform tasks such as doing work in a development
+ tree and then merging certain changes over to a stable tree only
+ once they have been proven.
+
+
+File: cvs.info, Node: A sample session, Prev: What is CVS not?, Up: Overview
+
+1.3 A sample session
+====================
+
+As a way of introducing CVS, we'll go through a typical work-session
+using CVS. The first thing to understand is that CVS stores all files
+in a centralized "repository" (*note Repository::); this section assumes
+that a repository is set up.
+
+ Suppose you are working on a simple compiler. The source consists of
+a handful of C files and a `Makefile'. The compiler is called `tc'
+(Trivial Compiler), and the repository is set up so that there is a
+module called `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
+
+
+File: cvs.info, Node: Getting the source, Next: Committing your changes,
Up: A sample session
+
+1.3.1 Getting the source
+------------------------
+
+The first thing you must do is to get your own working copy of the
+source for `tc'. For this, you use the `checkout' command:
+
+ $ cvs checkout tc
+
+This will create a new directory called `tc' and populate it with the
+source files.
+
+ $ cd tc
+ $ ls
+ CVS Makefile backend.c driver.c frontend.c parser.c
+
+ The `CVS' directory is used internally by CVS. Normally, you should
+not modify or remove any of the files in it.
+
+ You start your favorite editor, hack away at `backend.c', and a
+couple of hours later you have added an optimization pass to the
+compiler. A note to RCS and SCCS users: There is no need to lock the
+files that you want to edit. *Note Multiple developers::, for an
+explanation.
+
+
+File: cvs.info, Node: Committing your changes, Next: Cleaning up, Prev:
Getting the source, Up: A sample session
+
+1.3.2 Committing your changes
+-----------------------------
+
+When you have checked that the compiler is still compilable you decide
+to make a new version of `backend.c'. This will store your new
+`backend.c' in the repository and make it available to anyone else who
+is using that same repository.
+
+ $ cvs commit backend.c
+
+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 `$CVSEDITOR' determines which editor is
+started. If `$CVSEDITOR' is not set, then if the environment variable
+`$EDITOR' is set, it will be used. If both `$CVSEDITOR' and `$EDITOR'
+are not set then there is a default which will vary with your operating
+system, for example `vi' for unix or `notepad' for Windows NT/95.
+
+ In addition, CVS checks the `$VISUAL' environment variable. Opinions
+vary on whether this behavior is desirable and whether future releases
+of CVS should check `$VISUAL' or ignore it. You will be OK either way
+if you make sure that `$VISUAL' is either unset or set to the same thing
+as `$EDITOR'.
+
+ When CVS starts the editor, it includes a list of files which are
+modified. For the CVS client, this list is based on comparing the
+modification time of the file against the modification time that the
+file had when it was last gotten or updated. Therefore, if a file's
+modification time has changed but its contents have not, it will show up
+as modified. The simplest way to handle this is simply not to worry
+about it--if you proceed with the commit CVS will detect that the
+contents are not modified and treat it as an unmodified file. The next
+`update' will clue CVS in to the fact that the file is unmodified, and
+it will reset its stored timestamp so that the file will not show up in
+future editor sessions.
+
+ If you want to avoid starting an editor you can specify the log
+message on the command line using the `-m' flag instead, like this:
+
+ $ cvs commit -m "Added an optimization pass" backend.c
+
+
+File: cvs.info, Node: Cleaning up, Next: Viewing differences, Prev:
Committing your changes, Up: A sample session
+
+1.3.3 Cleaning up
+-----------------
+
+Before you turn to other tasks you decide to remove your working copy of
+tc. One acceptable way to do that is of course
+
+ $ cd ..
+ $ rm -r tc
+
+but a better way is to use the `release' command (*note release::):
+
+ $ 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) directory `tc': n
+ ** `release' aborted by user choice.
+
+ The `release' command checks that all your modifications have been
+committed. If history logging is enabled it also makes a note in the
+history file. *Note history file::.
+
+ When you use the `-d' flag with `release', it also removes your
+working copy.
+
+ In the example above, the `release' command wrote a couple of lines
+of output. `? tc' means that the file `tc' is unknown to CVS. That is
+nothing to worry about: `tc' is the executable compiler, and it should
+not be stored in the repository. *Note cvsignore::, for information
+about how to make that warning go away. *Note release output::, for a
+complete explanation of all possible output from `release'.
+
+ `M driver.c' is more serious. It means that the file `driver.c' has
+been modified since it was checked out.
+
+ The `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 `n <RET>' when `release' asks
+for confirmation.
+
+
+File: cvs.info, Node: Viewing differences, Prev: Cleaning up, Up: A sample
session
+
+1.3.4 Viewing differences
+-------------------------
+
+You do not remember modifying `driver.c', so you want to see what has
+happened to that file.
+
+ $ cd tc
+ $ cvs diff driver.c
+
+ This command runs `diff' to compare the version of `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.
+
+ $ 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) directory `tc': y
+
+
+File: cvs.info, Node: Repository, Next: Starting a new project, Prev:
Overview, Up: Top
+
+2 The Repository
+****************
+
+The CVS "repository" stores a complete copy of all the files and
+directories which are under version control.
+
+ Normally, you never access any of the files in the repository
+directly. Instead, you use CVS commands to get your own copy of the
+files into a "working directory", and then work on that copy. When
+you've finished a set of changes, you check (or "commit") them back into
+the repository. The repository then contains the changes which you have
+made, as well as recording exactly what you changed, when you changed
+it, and other such information. Note that the repository is not a
+subdirectory of the working directory, or vice versa; they should be in
+separate locations.
+
+ CVS can access a repository by a variety of means. It might be on
+the local computer, or it might be on a computer across the room or
+across the world. To distinguish various ways to access a repository,
+the repository name can start with an "access method". For example, the
+access method `:local:' means to access a repository directory, so the
+repository `:local:/usr/local/cvsroot' means that the repository is in
+`/usr/local/cvsroot' on the computer running CVS. For information on
+other access methods, see *note Remote repositories::.
+
+ If the access method is omitted, then if the repository starts with
+`/', then `:local:' is assumed. If it does not start with `/' then
+either `:ext:' or `:server:' is assumed. For example, if you have a
+local repository in `/usr/local/cvsroot', you can use
+`/usr/local/cvsroot' instead of `:local:/usr/local/cvsroot'. But if
+(under Windows NT, for example) your local repository is
+`c:\src\cvsroot', then you must specify the access method, as in
+`:local:c:/src/cvsroot'.
+
+ The repository is split in two parts. `$CVSROOT/CVSROOT' contains
+administrative files for CVS. The other directories contain the actual
+user-defined modules.
+
+* Menu:
+
+* Specifying a repository:: Telling CVS where your repository is
+* Repository storage:: The structure of the repository
+* Working directory storage:: The structure of working directories
+* Intro administrative files:: Defining modules
+* Multiple repositories:: Multiple repositories
+* Creating a repository:: Creating a repository
+* Backing up:: Backing up a repository
+* Moving a repository:: Moving a repository
+* Remote repositories:: Accessing repositories on remote machines
+* Read-only access:: Granting read-only access to the repository
+* Server temporary directory:: The server creates temporary directories
+
+
+File: cvs.info, Node: Specifying a repository, Next: Repository storage,
Up: Repository
+
+2.1 Telling CVS where your repository is
+========================================
+
+There are several ways to tell CVS where to find the repository. You
+can name the repository on the command line explicitly, with the `-d'
+(for "directory") option:
+
+ cvs -d /usr/local/cvsroot checkout yoyodyne/tc
+
+ Or you can set the `$CVSROOT' environment variable to an absolute
+path to the root of the repository, `/usr/local/cvsroot' in this
+example. To set `$CVSROOT', `csh' and `tcsh' users should have this
+line in their `.cshrc' or `.tcshrc' files:
+
+ setenv CVSROOT /usr/local/cvsroot
+
+`sh' and `bash' users should instead have these lines in their
+`.profile' or `.bashrc':
+
+ CVSROOT=/usr/local/cvsroot
+ export CVSROOT
+
+ A repository specified with `-d' will override the `$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 `CVS/Root' file in the working copy).
+
+ The `-d' option and the `CVS/Root' file both override the `$CVSROOT'
+environment variable. If `-d' option differs from `CVS/Root', the
+former is used. Of course, for proper operation they should be two ways
+of referring to the same repository.
+
+
+File: cvs.info, Node: Repository storage, Next: Working directory storage,
Prev: Specifying a repository, Up: Repository
+
+2.2 How data is stored in the repository
+========================================
+
+For most purposes it isn't important _how_ CVS stores information in the
+repository. In fact, the format has changed in the past, and is likely
+to change in the future. Since in almost all cases one accesses the
+repository via CVS commands, such changes need not be disruptive.
+
+ However, in some cases it may be necessary to understand how CVS
+stores data in the repository, for example you might need to track down
+CVS locks (*note Concurrency::) or you might need to deal with the file
+permissions appropriate for the repository.
+
+* Menu:
+
+* Repository files:: What files are stored in the repository
+* File permissions:: File permissions
+* Windows permissions:: Issues specific to Windows
+* Attic:: Some files are stored in the Attic
+* CVS in repository:: Additional information in CVS directory
+* Locks:: CVS locks control concurrent accesses
+* CVSROOT storage:: A few things about CVSROOT are different
+
+
+File: cvs.info, Node: Repository files, Next: File permissions, Up:
Repository storage
+
+2.2.1 Where files are stored within the repository
+--------------------------------------------------
+
+The overall structure of the repository is a directory tree
+corresponding to the directories in the working directory. For example,
+supposing the repository is in
+
+ /usr/local/cvsroot
+
+here is a possible directory tree (showing only the directories):
+
+ /usr
+ |
+ +--local
+ | |
+ | +--cvsroot
+ | | |
+ | | +--CVSROOT
+ | (administrative files)
+ |
+ +--gnu
+ | |
+ | +--diff
+ | | (source code to GNU diff)
+ | |
+ | +--rcs
+ | | (source code to RCS)
+ | |
+ | +--cvs
+ | (source code to CVS)
+ |
+ +--yoyodyne
+ |
+ +--tc
+ | |
+ | +--man
+ | |
+ | +--testing
+ |
+ +--(other Yoyodyne software)
+
+ With the directories are "history files" for each file under version
+control. The name of the history file is the name of the corresponding
+file with `,v' appended to the end. Here is what the repository for the
+`yoyodyne/tc' directory might look like:
+ `$CVSROOT'
+ |
+ +--yoyodyne
+ | |
+ | +--tc
+ | | |
+ +--Makefile,v
+ +--backend.c,v
+ +--driver.c,v
+ +--frontend.c,v
+ +--parser.c,v
+ +--man
+ | |
+ | +--tc.1,v
+ |
+ +--testing
+ |
+ +--testpgm.t,v
+ +--test2.t,v
+
+ The history files 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. The history files
+are known as "RCS files", because the first program to store files in
+that format was a version control system known as RCS. For a full
+description of the file format, see the `man' page `rcsfile(5)',
+distributed with RCS, or the file `doc/RCSFILES' in the CVS source
+distribution. This file format has become very common--many systems
+other than CVS or RCS can at least import history files in this format.
+
+ The RCS files used in CVS differ in a few ways from the standard
+format. The biggest difference is magic branches; for more information
+see *note Magic branch numbers::. Also in CVS the valid tag names are a
+subset of what RCS accepts; for CVS's rules see *note Tags::.
+
+
+File: cvs.info, Node: File permissions, Next: Windows permissions, Prev:
Repository files, Up: Repository storage
+
+2.2.2 File permissions
+----------------------
+
+All `,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. (On some systems, you also need to set the
+set-group-ID-on-execution bit on the repository directories (see
+chmod(1)) so that newly-created files and directories get the group-ID
+of the parent directory rather than that of the current process.)
+
+ This means that you can only control access to files on a
+per-directory basis.
+
+ Note that users must also have write access to check out files,
+because CVS needs to create lock files (*note Concurrency::). You can
+use LockDir in CVSROOT/config to put the lock files somewhere other than
+in the repository if you want to allow read-only access to some
+directories (*note config::).
+
+ Also note that users must have write access to the `CVSROOT/val-tags'
+file. CVS uses it to keep track of what tags are valid tag names (it is
+sometimes updated when tags are used, as well as when they are created).
+
+ Each RCS file will be owned by the user who last checked it in. This
+has little significance; what really matters is who owns the
+directories.
+
+ 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. If you set the `CVSUMASK' environment variable that
+will control the file permissions which CVS uses in creating directories
+and/or files in the repository. `CVSUMASK' does not affect the file
+permissions in the working directory; such files have the permissions
+which are typical for newly created files, except that sometimes CVS
+creates them read-only (see the sections on watches, *note Setting a
+watch::; -r, *note Global options::; or `CVSREAD', *note Environment
+variables::).
+
+ Note that using the client/server CVS (*note Remote repositories::),
+there is no good way to set `CVSUMASK'; the setting on the client
+machine has no effect. If you are connecting with `rsh', you can set
+`CVSUMASK' in `.bashrc' or `.cshrc', as described in the documentation
+for your operating system. This behavior might change in future
+versions of CVS; do not rely on the setting of `CVSUMASK' on the client
+having no effect.
+
+ Using pserver, you will generally need stricter permissions on the
+CVSROOT directory and directories above it in the tree; see *note
+Password authentication security::.
+
+ Some operating systems have features which allow a particular program
+to run with the ability to perform operations which the caller of the
+program could not. For example, the set user ID (setuid) or set group
+ID (setgid) features of unix or the installed image feature of VMS. CVS
+was not written to use such features and therefore attempting to install
+CVS in this fashion will provide protection against only accidental
+lapses; anyone who is trying to circumvent the measure will be able to
+do so, and depending on how you have set it up may gain access to more
+than just CVS. You may wish to instead consider pserver. It shares
+some of the same attributes, in terms of possibly providing a false
+sense of security or opening security holes wider than the ones you are
+trying to fix, so read the documentation on pserver security carefully
+if you are considering this option (*note Password authentication
+security::).
+
+
+File: cvs.info, Node: Windows permissions, Next: Attic, Prev: File
permissions, Up: Repository storage
+
+2.2.3 File Permission issues specific to Windows
+------------------------------------------------
+
+Some file permission issues are specific to Windows operating systems
+(Windows 95, Windows NT, and presumably future operating systems in this
+family. Some of the following might apply to OS/2 but I'm not sure).
+
+ If you are using local CVS and the repository is on a networked file
+system which is served by the Samba SMB server, some people have
+reported problems with permissions. Enabling WRITE=YES in the samba
+configuration is said to fix/workaround it. Disclaimer: I haven't
+investigated enough to know the implications of enabling that option,
+nor do I know whether there is something which CVS could be doing
+differently in order to avoid the problem. If you find something out,
+please let us know as described in *note BUGS::.
+
+
+File: cvs.info, Node: Attic, Next: CVS in repository, Prev: Windows
permissions, Up: Repository storage
+
+2.2.4 The attic
+---------------
+
+You will notice that sometimes CVS stores an RCS file in the `Attic'.
+For example, if the CVSROOT is `/usr/local/cvsroot' and we are talking
+about the file `backend.c' in the directory `yoyodyne/tc', then the file
+normally would be in
+
+ /usr/local/cvsroot/yoyodyne/tc/backend.c,v
+
+but if it goes in the attic, it would be in
+
+ /usr/local/cvsroot/yoyodyne/tc/Attic/backend.c,v
+
+instead. It should not matter from a user point of view whether a file
+is in the attic; CVS keeps track of this and looks in the attic when it
+needs to. But in case you want to know, the rule is that the RCS file
+is stored in the attic if and only if the head revision on the trunk has
+state `dead'. A `dead' state means that file has been removed, or never
+added, for that revision. For example, if you add a file on a branch,
+it will have a trunk revision in `dead' state, and a branch revision in
+a non-`dead' state.
+
+
+File: cvs.info, Node: CVS in repository, Next: Locks, Prev: Attic, Up:
Repository storage
+
+2.2.5 The CVS directory in the repository
+-----------------------------------------
+
+The `CVS' directory in each repository directory contains information
+such as file attributes (in a file called `CVS/fileattr'. In the future
+additional files may be added to this directory, so implementations
+should silently ignore additional files.
+
+ This behavior is implemented only by CVS 1.7 and later; for details
+see *note Watches Compatibility::.
+
+ The format of the fileattr file is a series of entries of the
+following form (where `{' and `}' means the text between the braces can
+be repeated zero or more times):
+
+ ENT-TYPE FILENAME <tab> ATTRNAME = ATTRVAL {; ATTRNAME = ATTRVAL}
+<linefeed>
+
+ ENT-TYPE is `F' for a file, in which case the entry specifies the
+attributes for that file.
+
+ ENT-TYPE is `D', and FILENAME empty, to specify default attributes to
+be used for newly added files.
+
+ Other ENT-TYPE are reserved for future expansion. CVS 1.9 and older
+will delete them any time it writes file attributes. CVS 1.10 and later
+will preserve them.
+
+ Note that the order of the lines is not significant; a program
+writing the fileattr file may rearrange them at its convenience.
+
+ There is currently no way of quoting tabs or linefeeds in the
+filename, `=' in ATTRNAME, `;' in ATTRVAL, etc. Note: some
+implementations also don't handle a NUL character in any of the fields,
+but implementations are encouraged to allow it.
+
+ By convention, ATTRNAME starting with `_' is for an attribute given
+special meaning by CVS; other ATTRNAMEs are for user-defined attributes
+(or will be, once implementations start supporting user-defined
+attributes).
+
+ Builtin attributes:
+
+`_watched'
+ Present means the file is watched and should be checked out
+ read-only.
+
+`_watchers'
+ Users with watches for this file. Value is WATCHER > TYPE { ,
+ WATCHER > TYPE } where WATCHER is a username, and TYPE is zero or
+ more of edit,unedit,commit separated by `+' (that is, nothing if
+ none; there is no "none" or "all" keyword).
+
+`_editors'
+ Users editing this file. Value is EDITOR > VAL { , EDITOR > VAL }
+ where EDITOR is a username, and VAL is TIME+HOSTNAME+PATHNAME,
+ where TIME is when the `cvs edit' command (or equivalent) happened,
+ and HOSTNAME and PATHNAME are for the working directory.
+
+ Example:
+
+ Ffile1 _watched=;_watchers=joe>edit,mary>commit
+ Ffile2 _watched=;_editors=sue>8 Jan 1975+workstn1+/home/sue/cvs
+ D _watched=
+
+means that the file `file1' should be checked out read-only.
+Furthermore, joe is watching for edits and mary is watching for commits.
+ The file `file2' should be checked out read-only; sue started editing
+it on 8 Jan 1975 in the directory `/home/sue/cvs' on the machine
+`workstn1'. Future files which are added should be checked out
+read-only. To represent this example here, we have shown a space after
+`D', `Ffile1', and `Ffile2', but in fact there must be a single tab
+character there and no spaces.
+
+
+File: cvs.info, Node: Locks, Next: CVSROOT storage, Prev: CVS in
repository, Up: Repository storage
+
+2.2.6 CVS locks in the repository
+---------------------------------
+
+For an introduction to CVS locks focusing on user-visible behavior, see
+*note Concurrency::. The following section is aimed at people who are
+writing tools which want to access a CVS repository without interfering
+with other tools accessing the same repository. If you find yourself
+confused by concepts described here, like "read lock", "write lock", and
+"deadlock", you might consult the literature on operating systems or
+databases.
+
+ Any file in the repository with a name starting with `#cvs.rfl.' is a
+read lock. Any file in the repository with a name starting with
+`#cvs.wfl' is a write lock. Old versions of CVS (before CVS 1.5) also
+created files with names starting with `#cvs.tfl', but they are not
+discussed here. The directory `#cvs.lock' serves as a master lock.
+That is, one must obtain this lock first before creating any of the
+other locks.
+
+ To obtain a readlock, first create the `#cvs.lock' directory. This
+operation must be atomic (which should be true for creating a directory
+under most operating systems). If it fails because the directory
+already existed, wait for a while and try again. After obtaining the
+`#cvs.lock' lock, create a file whose name is `#cvs.rfl.' followed by
+information of your choice (for example, hostname and process
+identification number). Then remove the `#cvs.lock' directory to
+release the master lock. Then proceed with reading the repository.
+When you are done, remove the `#cvs.rfl' file to release the read lock.
+
+ To obtain a writelock, first create the `#cvs.lock' directory, as
+with a readlock. Then check that there are no files whose names start
+with `#cvs.rfl.'. If there are, remove `#cvs.lock', wait for a while,
+and try again. If there are no readers, then create a file whose name
+is `#cvs.wfl' followed by information of your choice (for example,
+hostname and process identification number). Hang on to the `#cvs.lock'
+lock. Proceed with writing the repository. When you are done, first
+remove the `#cvs.wfl' file and then the `#cvs.lock' directory. Note that
+unlike the `#cvs.rfl' file, the `#cvs.wfl' file is just informational;
+it has no effect on the locking operation beyond what is provided by
+holding on to the `#cvs.lock' lock itself.
+
+ Note that each lock (writelock or readlock) only locks a single
+directory in the repository, including `Attic' and `CVS' but not
+including subdirectories which represent other directories under version
+control. To lock an entire tree, you need to lock each directory (note
+that if you fail to obtain any lock you need, you must release the whole
+tree before waiting and trying again, to avoid deadlocks).
+
+ Note also that CVS expects writelocks to control access to individual
+`foo,v' files. RCS has a scheme where the `,foo,' file serves as a
+lock, but CVS does not implement it and so taking out a CVS writelock is
+recommended. See the comments at rcs_internal_lockfile in the CVS
+source code for further discussion/rationale.
+
+
+File: cvs.info, Node: CVSROOT storage, Prev: Locks, Up: Repository storage
+
+2.2.7 How files are stored in the CVSROOT directory
+---------------------------------------------------
+
+The `$CVSROOT/CVSROOT' directory contains the various administrative
+files. In some ways this directory is just like any other directory in
+the repository; it contains RCS files whose names end in `,v', and many
+of the CVS commands operate on it the same way. However, there are a
+few differences.
+
+ For each administrative file, in addition to the RCS file, there is
+also a checked out copy of the file. For example, there is an RCS file
+`loginfo,v' and a file `loginfo' which contains the latest revision
+contained in `loginfo,v'. When you check in an administrative file, CVS
+should print
+
+ cvs commit: Rebuilding administrative file database
+
+and update the checked out copy in `$CVSROOT/CVSROOT'. If it does not,
+there is something wrong (*note BUGS::). To add your own files to the
+files to be updated in this fashion, you can add them to the
+`checkoutlist' administrative file (*note checkoutlist::).
+
+ By default, the `modules' file behaves as described above. If the
+modules file is very large, storing it as a flat text file may make
+looking up modules slow (I'm not sure whether this is as much of a
+concern now as when CVS first evolved this feature; I haven't seen
+benchmarks). Therefore, by making appropriate edits to the CVS source
+code one can store the modules file in a database which implements the
+`ndbm' interface, such as Berkeley db or GDBM. If this option is in
+use, then the modules database will be stored in the files `modules.db',
+`modules.pag', and/or `modules.dir'.
+
+ For information on the meaning of the various administrative files,
+see *note Administrative files::.
+
+
+File: cvs.info, Node: Working directory storage, Next: Intro administrative
files, Prev: Repository storage, Up: Repository
+
+2.3 How data is stored in the working directory
+===============================================
+
+While we are discussing CVS internals which may become visible from time
+to time, we might as well talk about what CVS puts in the `CVS'
+directories in the working directories. As with the repository, CVS
+handles this information and one can usually access it via CVS commands.
+ But in some cases it may be useful to look at it, and other programs,
+such as the `jCVS' graphical user interface or the `VC' package for
+emacs, may need to look at it. Such programs should follow the
+recommendations in this section if they hope to be able to work with
+other programs which use those files, including future versions of the
+programs just mentioned and the command-line CVS client.
+
+ The `CVS' directory contains several files. Programs which are
+reading this directory should silently ignore files which are in the
+directory but which are not documented here, to allow for future
+expansion.
+
+ The files are stored according to the text file convention for the
+system in question. This means that working directories are not
+portable between systems with differing conventions for storing text
+files. This is intentional, on the theory that the files being managed
+by CVS probably will not be portable between such systems either.
+
+`Root'
+ This file contains the current CVS root, as described in *note
+ Specifying a repository::.
+
+`Repository'
+ This file contains the directory within the repository which the
+ current directory corresponds with. It can be either an absolute
+ pathname or a relative pathname; CVS has had the ability to read
+ either format since at least version 1.3 or so. The relative
+ pathname is relative to the root, and is the more sensible
+ approach, but the absolute pathname is quite common and
+ implementations should accept either. For example, after the
+ command
+
+ cvs -d :local:/usr/local/cvsroot checkout yoyodyne/tc
+
+ `Root' will contain
+
+ :local:/usr/local/cvsroot
+
+ and `Repository' will contain either
+
+ /usr/local/cvsroot/yoyodyne/tc
+
+ or
+
+ yoyodyne/tc
+
+ If the particular working directory does not correspond to a
+ directory in the repository, then `Repository' should contain
+ `CVSROOT/Emptydir'.
+
+`Entries'
+ This file lists the files and directories in the working directory.
+ The first character of each line indicates what sort of line it
+ is. If the character is unrecognized, programs reading the file
+ should silently skip that line, to allow for future expansion.
+
+ If the first character is `/', then the format is:
+
+ /NAME/REVISION/TIMESTAMP[+CONFLICT]/OPTIONS/TAGDATE
+
+ where `[' and `]' are not part of the entry, but instead indicate
+ that the `+' and conflict marker are optional. NAME is the name of
+ the file within the directory. REVISION is the revision that the
+ file in the working derives from, or `0' for an added file, or `-'
+ followed by a revision for a removed file. TIMESTAMP is the
+ timestamp of the file at the time that CVS created it; if the
+ timestamp differs with the actual modification time of the file it
+ means the file has been modified. It is stored in the format used
+ by the ISO C asctime() function (for example, `Sun Apr 7 01:29:26
+ 1996'). One may write a string which is not in that format, for
+ example, `Result of merge', to indicate that the file should always
+ be considered to be modified. This is not a special case; to see
+ whether a file is modified a program should take the timestamp of
+ the file and simply do a string compare with TIMESTAMP. If there
+ was a conflict, CONFLICT can be set to the modification time of the
+ file after the file has been written with conflict markers (*note
+ Conflicts example::). Thus if CONFLICT is subsequently the same as
+ the actual modification time of the file it means that the user has
+ obviously not resolved the conflict. OPTIONS contains sticky
+ options (for example `-kb' for a binary file). TAGDATE contains
+ `T' followed by a tag name, or `D' for a date, followed by a sticky
+ tag or date. Note that if TIMESTAMP contains a pair of timestamps
+ separated by a space, rather than a single timestamp, you are
+ dealing with a version of CVS earlier than CVS 1.5 (not documented
+ here).
+
+ The timezone on the timestamp in CVS/Entries (local or universal)
+ should be the same as the operating system stores for the timestamp
+ of the file itself. For example, on Unix the file's timestamp is
+ in universal time (UT), so the timestamp in CVS/Entries should be
+ too. On VMS, the file's timestamp is in local time, so CVS on VMS
+ should use local time. This rule is so that files do not appear to
+ be modified merely because the timezone changed (for example, to or
+ from summer time).
+
+ If the first character of a line in `Entries' is `D', then it
+ indicates a subdirectory. `D' on a line all by itself indicates
+ that the program which wrote the `Entries' file does record
+ subdirectories (therefore, if there is such a line and no other
+ lines beginning with `D', one knows there are no subdirectories).
+ Otherwise, the line looks like:
+
+ D/NAME/FILLER1/FILLER2/FILLER3/FILLER4
+
+ where NAME is the name of the subdirectory, and all the FILLER
+ fields should be silently ignored, for future expansion. Programs
+ which modify `Entries' files should preserve these fields.
+
+ The lines in the `Entries' file can be in any order.
+
+`Entries.Log'
+ This file does not record any information beyond that in `Entries',
+ but it does provide a way to update the information without having
+ to rewrite the entire `Entries' file, including the ability to
+ preserve the information even if the program writing `Entries' and
+ `Entries.Log' abruptly aborts. Programs which are reading the
+ `Entries' file should also check for `Entries.Log'. If the latter
+ exists, they should read `Entries' and then apply the changes
+ mentioned in `Entries.Log'. After applying the changes, the
+ recommended practice is to rewrite `Entries' and then delete
+ `Entries.Log'. The format of a line in `Entries.Log' is a single
+ character command followed by a space followed by a line in the
+ format specified for a line in `Entries'. The single character
+ command is `A' to indicate that the entry is being added, `R' to
+ indicate that the entry is being removed, or any other character to
+ indicate that the entire line in `Entries.Log' should be silently
+ ignored (for future expansion). If the second character of the
+ line in `Entries.Log' is not a space, then it was written by an
+ older version of CVS (not documented here).
+
+ Programs which are writing rather than reading can safely ignore
+ `Entries.Log' if they so choose.
+
+`Entries.Backup'
+ This is a temporary file. Recommended usage is to write a new
+ entries file to `Entries.Backup', and then to rename it
+ (atomically, where possible) to `Entries'.
+
+`Entries.Static'
+ The only relevant thing about this file is whether it exists or
+ not. If it exists, then it means that only part of a directory was
+ gotten and CVS will not create additional files in that directory.
+ To clear it, use the `update' command with the `-d' option, which
+ will get the additional files and remove `Entries.Static'.
+
+`Tag'
+ This file contains per-directory sticky tags or dates. The first
+ character is `T' for a branch tag, `N' for a non-branch tag, or `D'
+ for a date, or another character to mean the file should be
+ silently ignored, for future expansion. This character is followed
+ by the tag or date. Note that per-directory sticky tags or dates
+ are used for things like applying to files which are newly added;
+ they might not be the same as the sticky tags or dates on
+ individual files. For general information on sticky tags and
+ dates, see *note Sticky tags::.
+
+`Notify'
+ This file stores notifications (for example, for `edit' or
+ `unedit') which have not yet been sent to the server. Its format
+ is not yet documented here.
+
+`Notify.tmp'
+ This file is to `Notify' as `Entries.Backup' is to `Entries'. That
+ is, to write `Notify', first write the new contents to `Notify.tmp'
+ and then (atomically where possible), rename it to `Notify'.
+
+`Base'
+ If watches are in use, then an `edit' command stores the original
+ copy of the file in the `Base' directory. This allows the `unedit'
+ command to operate even if it is unable to communicate with the
+ server.
+
+`Baserev'
+ The file lists the revision for each of the files in the `Base'
+ directory. The format is:
+
+ BNAME/REV/EXPANSION
+
+ where EXPANSION should be ignored, to allow for future expansion.
+
+`Baserev.tmp'
+ This file is to `Baserev' as `Entries.Backup' is to `Entries'.
+ That is, to write `Baserev', first write the new contents to
+ `Baserev.tmp' and then (atomically where possible), rename it to
+ `Baserev'.
+
+`Template'
+ This file contains the template specified by the `rcsinfo' file
+ (*note rcsinfo::). It is only used by the client; the
+ non-client/server CVS consults `rcsinfo' directly.
+
+
+File: cvs.info, Node: Intro administrative files, Next: Multiple
repositories, Prev: Working directory storage, Up: Repository
+
+2.4 The administrative files
+============================
+
+The directory `$CVSROOT/CVSROOT' contains some "administrative files".
+*Note Administrative files::, for a complete description. You can use
+CVS without any of these files, but some commands work better when at
+least the `modules' file is properly set up.
+
+ The most important of these files is the `modules' file. It defines
+all modules in the repository. This is a sample `modules' file.
+
+ CVSROOT CVSROOT
+ modules CVSROOT modules
+ cvs gnu/cvs
+ rcs gnu/rcs
+ diff gnu/diff
+ tc yoyodyne/tc
+
+ The `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 `$CVSROOT'. The
+last four lines in the example above are examples of such lines.
+
+ The line that defines the module called `modules' uses features that
+are not explained here. *Note modules::, for a full explanation of all
+the available features.
+
+2.4.1 Editing administrative files
+----------------------------------
+
+You edit the administrative files in the same way that you would edit
+any other module. Use `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.
+
+
+File: cvs.info, Node: Multiple repositories, Next: Creating a repository,
Prev: Intro administrative files, Up: Repository
+
+2.5 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
+`CVSROOT' environment variable, the `-d' option to CVS, or (once you
+have checked out a working directory) by simply allowing CVS to use the
+repository that was used to check out the working directory (*note
+Specifying a repository::).
+
+ The big advantage of having multiple repositories is that they can
+reside on different servers. With CVS version 1.10, a single command
+cannot recurse into directories from different repositories. With
+development versions of CVS, you can check out code from multiple
+servers into your working directory. CVS will recurse and handle all
+the details of making connections to as many server machines as
+necessary to perform the requested command. Here is an example of how
+to set up a working directory:
+
+ cvs -d server1:/cvs co dir1
+ cd dir1
+ cvs -d server2:/root co sdir
+ cvs update
+
+ The `cvs co' commands set up the working directory, and then the `cvs
+update' command will contact server2, to update the dir1/sdir
+subdirectory, and server1, to update everything else.
+
+
+File: cvs.info, Node: Creating a repository, Next: Backing up, Prev:
Multiple repositories, Up: Repository
+
+2.6 Creating a repository
+=========================
+
+To set up a CVS repository, first choose the machine and disk on which
+you want to store the revision history of the source files. CPU and
+memory requirements are modest, so most machines should be adequate.
+For details see *note Server requirements::.
+
+ To estimate disk space requirements, if you are importing RCS files
+from another system, the size of those files is the approximate initial
+size of your repository, or if you are starting without any version
+history, a rule of thumb is to allow for the server approximately three
+times the size of the code to be under CVS for the repository (you will
+eventually outgrow this, but not for a while). On the machines on which
+the developers will be working, you'll want disk space for approximately
+one working directory for each developer (either the entire tree or a
+portion of it, depending on what each developer uses).
+
+ The repository should be accessible (directly or via a networked file
+system) from all machines which want to use CVS in server or local mode;
+the client machines need not have any access to it other than via the
+CVS protocol. It is not possible to use CVS to read from a repository
+which one only has read access to; CVS needs to be able to create lock
+files (*note Concurrency::).
+
+ To create a repository, run the `cvs init' command. It will set up
+an empty repository in the CVS root specified in the usual way (*note
+Repository::). For example,
+
+ cvs -d /usr/local/cvsroot init
+
+ `cvs init' is careful to never overwrite any existing files in the
+repository, so no harm is done if you run `cvs init' on an already
+set-up repository.
+
+ `cvs init' will enable history logging; if you don't want that,
+remove the history file after running `cvs init'. *Note history file::.
+
+
+File: cvs.info, Node: Backing up, Next: Moving a repository, Prev: Creating
a repository, Up: Repository
+
+2.7 Backing up a repository
+===========================
+
+There is nothing particularly magical about the files in the repository;
+for the most part it is possible to back them up just like any other
+files. However, there are a few issues to consider.
+
+ The first is that to be paranoid, one should either not use CVS
+during the backup, or have the backup program lock CVS while doing the
+backup. To not use CVS, you might forbid logins to machines which can
+access the repository, turn off your CVS server, or similar mechanisms.
+The details would depend on your operating system and how you have CVS
+set up. To lock CVS, you would create `#cvs.rfl' locks in each
+repository directory. See *note Concurrency::, for more on CVS locks.
+Having said all this, if you just back up without any of these
+precautions, the results are unlikely to be particularly dire.
+Restoring from backup, the repository might be in an inconsistent state,
+but this would not be particularly hard to fix manually.
+
+ When you restore a repository from backup, assuming that changes in
+the repository were made after the time of the backup, working
+directories which were not affected by the failure may refer to
+revisions which no longer exist in the repository. Trying to run CVS in
+such directories will typically produce an error message. One way to
+get those changes back into the repository is as follows:
+
+ * Get a new working directory.
+
+ * Copy the files from the working directory from before the failure
+ over to the new working directory (do not copy the contents of the
+ `CVS' directories, of course).
+
+ * Working in the new working directory, use commands such as `cvs
+ update' and `cvs diff' to figure out what has changed, and then
+ when you are ready, commit the changes into the repository.
+
+
+File: cvs.info, Node: Moving a repository, Next: Remote repositories, Prev:
Backing up, Up: Repository
+
+2.8 Moving a repository
+=======================
+
+Just as backing up the files in the repository is pretty much like
+backing up any other files, if you need to move a repository from one
+place to another it is also pretty much like just moving any other
+collection of files.
+
+ The main thing to consider is that working directories point to the
+repository. The simplest way to deal with a moved repository is to just
+get a fresh working directory after the move. Of course, you'll want to
+make sure that the old working directory had been checked in before the
+move, or you figured out some other way to make sure that you don't lose
+any changes. If you really do want to reuse the existing working
+directory, it should be possible with manual surgery on the
+`CVS/Repository' files. You can see *note Working directory storage::,
+for information on the `CVS/Repository' and `CVS/Root' files, but unless
+you are sure you want to bother, it probably isn't worth it.
+
+
+File: cvs.info, Node: Remote repositories, Next: Read-only access, Prev:
Moving a repository, Up: Repository
+
+2.9 Remote repositories
+=======================
+
+Your working copy of the sources can be on a different machine than the
+repository. Using CVS in this manner is known as "client/server"
+operation. You run CVS on a machine which can mount your working
+directory, known as the "client", and tell it to communicate to a
+machine which can mount the repository, known as the "server".
+Generally, using a remote repository is just like using a local one,
+except that the format of the repository name is:
+
+ [:METHOD:][[USER][:address@hidden:[PORT]]/path/to/repository
+
+ Specifying a password in the repository name is not recommended
+during checkout, since this will cause CVS to store a cleartext copy of
+the password in each created directory. `cvs login' first instead
+(*note Password authentication client::).
+
+ The details of exactly what needs to be set up depend on how you are
+connecting to the server.
+
+ If METHOD is not specified, and the repository name contains `:',
+then the default is `ext' or `server', depending on your platform; both
+are described in *note Connecting via rsh::.
+
+* Menu:
+
+* Server requirements:: Memory and other resources for servers
+* Connecting via rsh:: Using the `rsh' program to connect
+* Password authenticated:: Direct connections using passwords
+* GSSAPI authenticated:: Direct connections using GSSAPI
+* Kerberos authenticated:: Direct connections with kerberos
+* Connecting via fork:: Using a forked `cvs server' to connect
+
+
+File: cvs.info, Node: Server requirements, Next: Connecting via rsh, Up:
Remote repositories
+
+2.9.1 Server requirements
+-------------------------
+
+The quick answer to what sort of machine is suitable as a server is that
+requirements are modest--a server with 32M of memory or even less can
+handle a fairly large source tree with a fair amount of activity.
+
+ The real answer, of course, is more complicated. Estimating the
+known areas of large memory consumption should be sufficient to estimate
+memory requirements. There are two such areas documented here; other
+memory consumption should be small by comparison (if you find that is
+not the case, let us know, as described in *note BUGS::, so we can
+update this documentation).
+
+ The first area of big memory consumption is large checkouts, when
+using the CVS server. The server consists of two processes for each
+client that it is serving. Memory consumption on the child process
+should remain fairly small. Memory consumption on the parent process,
+particularly if the network connection to the client is slow, can be
+expected to grow to slightly more than the size of the sources in a
+single directory, or two megabytes, whichever is larger.
+
+ Multiplying the size of each CVS server by the number of servers
+which you expect to have active at one time should give an idea of
+memory requirements for the server. For the most part, the memory
+consumed by the parent process probably can be swap space rather than
+physical memory.
+
+ The second area of large memory consumption is `diff', when checking
+in large files. This is required even for binary files. The rule of
+thumb is to allow about ten times the size of the largest file you will
+want to check in, although five times may be adequate. For example, if
+you want to check in a file which is 10 megabytes, you should have 100
+megabytes of memory on the machine doing the checkin (the server machine
+for client/server, or the machine running CVS for non-client/server).
+This can be swap space rather than physical memory. Because the memory
+is only required briefly, there is no particular need to allow memory
+for more than one such checkin at a time.
+
+ Resource consumption for the client is even more modest--any machine
+with enough capacity to run the operating system in question should have
+little trouble.
+
+ For information on disk space requirements, see *note Creating a
+repository::.
+
+
+File: cvs.info, Node: Connecting via rsh, Next: Password authenticated,
Prev: Server requirements, Up: Remote repositories
+
+2.9.2 Connecting with rsh
+-------------------------
+
+CVS uses the `rsh' protocol to perform these operations, so the remote
+user host needs to have a `.rhosts' file which grants access to the
+local user. Note that the program that CVS uses for this purpose may be
+specified using the `--with-rsh' flag to configure.
+
+ For example, suppose you are the user `mozart' on the local machine
+`toe.example.com', and the server machine is `faun.example.org'. On
+faun, put the following line into the file `.rhosts' in `bach''s home
+directory:
+
+ toe.example.com mozart
+
+Then test that `rsh' is working with
+
+ rsh -l bach faun.example.org 'echo $PATH'
+
+ Next you have to make sure that `rsh' will be able to find the
+server. Make sure that the path which `rsh' printed in the above
+example includes the directory containing a program named `cvs' which is
+the server. You need to set the path in `.bashrc', `.cshrc', etc., not
+`.login' or `.profile'. Alternately, you can set the environment
+variable `CVS_SERVER' on the client machine to the filename of the
+server you want to use, for example `/usr/local/bin/cvs-1.6'.
+
+ There is no need to edit `inetd.conf' or start a CVS server daemon.
+
+ There are two access methods that you use in `CVSROOT' for rsh.
+`:server:' specifies an internal rsh client, which is supported only by
+some CVS ports. `:ext:' specifies an external rsh program. By default
+this is `rsh' (unless otherwise specified by the `--with-rsh' flag to
+configure) but you may set the `CVS_RSH' environment variable to invoke
+another program which can access the remote server (for example, `remsh'
+on HP-UX 9 because `rsh' is something different). It must be a program
+which can transmit data to and from the server without modifying it; for
+example the Windows NT `rsh' is not suitable since it by default
+translates between CRLF and LF. The OS/2 CVS port has a hack to pass
+`-b' to `rsh' to get around this, but since this could potentially cause
+problems for programs other than the standard `rsh', it may change in
+the future. If you set `CVS_RSH' to `SSH' or some other rsh
+replacement, the instructions in the rest of this section concerning
+`.rhosts' and so on are likely to be inapplicable; consult the
+documentation for your rsh replacement.
+
+ Continuing our example, supposing you want to access the module `foo'
+in the repository `/usr/local/cvsroot/', on machine `faun.example.org',
+you are ready to go:
+
+ cvs -d :ext:address@hidden:/usr/local/cvsroot checkout foo
+
+(The `bach@' can be omitted if the username is the same on both the
+local and remote hosts.)
+
+
+File: cvs.info, Node: Password authenticated, Next: GSSAPI authenticated,
Prev: Connecting via rsh, Up: Remote repositories
+
+2.9.3 Direct connection with password authentication
+----------------------------------------------------
+
+The CVS client can also connect to the server using a password protocol.
+ This is particularly useful if using `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
+
+
+File: cvs.info, Node: Password authentication server, Next: Password
authentication client, Up: Password authenticated
+
+2.9.3.1 Setting up the server for password authentication
+.........................................................
+
+First of all, you probably want to tighten the permissions on the
+`$CVSROOT' and `$CVSROOT/CVSROOT' directories. See *note Password
+authentication security::, for more details.
+
+ On the server side, the file `/etc/inetd.conf' needs to be edited so
+`inetd' knows to run the command `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 `CVS_AUTH_PORT'
+defined to something else, though. This can also be specified in the
+CVSROOT variable (*note Remote repositories::) or overridden with the
+CVS_CLIENT_PORT environment variable (*note Environment variables::).
+
+ If your `inetd' allows raw port numbers in `/etc/inetd.conf', then
+the following (all on a single line in `inetd.conf') should be
+sufficient:
+
+ 2401 stream tcp nowait root /usr/local/bin/cvs
+ cvs -f --allow-root=/usr/cvsroot pserver
+
+(You could also use the `-T' option to specify a temporary directory.)
+
+ The `--allow-root' option specifies the allowable CVSROOT directory.
+Clients which attempt to use a different CVSROOT directory will not be
+allowed to connect. If there is more than one CVSROOT directory which
+you want to allow, repeat the option. (Unfortunately, many versions of
+`inetd' have very small limits on the number of arguments and/or the
+total length of the command. The usual solution to this problem is to
+have `inetd' run a shell script which then invokes CVS with the
+necessary arguments.)
+
+ If your `inetd' wants a symbolic service name instead of a raw port
+number, then put this in `/etc/services':
+
+ cvspserver 2401/tcp
+
+and put `cvspserver' instead of `2401' in `inetd.conf'.
+
+ If your system uses `xinetd' instead of `inetd', the procedure is
+slightly different. Create a file called `/etc/xinetd.d/cvspserver'
+containing the following:
+
+ service cvspserver
+ {
+ port = 2401
+ socket_type = stream
+ protocol = tcp
+ wait = no
+ user = root
+ passenv = PATH
+ server = /usr/local/bin/cvs
+ server_args = -f --allow-root=/usr/cvsroot pserver
+ }
+
+(If `cvspserver' is defined in `/etc/services', you can omit the `port'
+line.)
+
+ Once the above is taken care of, restart your `inetd', or do whatever
+is necessary to force it to reread its initialization files.
+
+ If you are having trouble setting this up, see *note Connection::.
+
+ Because the client stores and transmits passwords in cleartext
+(almost--see *note Password authentication security::, for details), a
+separate CVS password file is generally used, so people don't compromise
+their regular passwords when they access the repository. This file is
+`$CVSROOT/CVSROOT/passwd' (*note Intro administrative files::). It uses
+a colon-separated format, similar to `/etc/passwd' on Unix systems,
+except that it has fewer fields: CVS username, optional password, and an
+optional system username for CVS to run as if authentication succeeds.
+Here is an example `passwd' file with five entries:
+
+ anonymous:
+ bach:ULtgRLXo7NRxs
+ spwang:1sOp854gDF3DY
+ melissa:tGX1fS8sun6rY:pubcvs
+ qproj:XR4EZcEs0szik:pubcvs
+
+(The passwords are encrypted according to the standard Unix `crypt()'
+function, so it is possible to paste in passwords directly from regular
+Unix `/etc/passwd' files.)
+
+ The first line in the example will grant access to any CVS client
+attempting to authenticate as user `anonymous', no matter what password
+they use, including an empty password. (This is typical for sites
+granting anonymous read-only access; for information on how to do the
+"read-only" part, see *note Read-only access::.)
+
+ The second and third lines will grant access to `bach' and `spwang'
+if they supply their respective plaintext passwords.
+
+ The fourth line will grant access to `melissa', if she supplies the
+correct password, but her CVS operations will actually run on the server
+side under the system user `pubcvs'. Thus, there need not be any system
+user named `melissa', but there _must_ be one named `pubcvs'.
+
+ The fifth line shows that system user identities can be shared: any
+client who successfully authenticates as `qproj' will actually run as
+`pubcvs', just as `melissa' does. That way you could create a single,
+shared system user for each project in your repository, and give each
+developer their own line in the `$CVSROOT/CVSROOT/passwd' file. The CVS
+username on each line would be different, but the system username would
+be the same. The reason to have different CVS usernames is that CVS
+will log their actions under those names: when `melissa' commits a
+change to a project, the checkin is recorded in the project's history
+under the name `melissa', not `pubcvs'. And the reason to have them
+share a system username is so that you can arrange permissions in the
+relevant area of the repository such that only that account has
+write-permission there.
+
+ If the system-user field is present, all password-authenticated CVS
+commands run as that user; if no system user is specified, CVS simply
+takes the CVS username as the system username and runs commands as that
+user. In either case, if there is no such user on the system, then the
+CVS operation will fail (regardless of whether the client supplied a
+valid password).
+
+ The password and system-user fields can both be omitted (and if the
+system-user field is omitted, then also omit the colon that would have
+separated it from the encrypted password). For example, this would be a
+valid `$CVSROOT/CVSROOT/passwd' file:
+
+ anonymous::pubcvs
+ fish:rKa5jzULzmhOo:kfogel
+ sussman:1sOp854gDF3DY
+
+When the password field is omitted or empty, then the client's
+authentication attempt will succeed with any password, including the
+empty string. However, the colon after the CVS username is always
+necessary, even if the password is empty.
+
+ CVS can also fall back to use system authentication. When
+authenticating a password, the server first checks for the user in the
+`$CVSROOT/CVSROOT/passwd' file. If it finds the user, it will use that
+entry for authentication as described above. But if it does not find
+the user, or if the CVS `passwd' file does not exist, then the server
+can try to authenticate the username and password using the operating
+system's user-lookup routines (this "fallback" behavior can be disabled
+by setting `SystemAuth=no' in the CVS `config' file, *note config::).
+
+ The default fallback behaviour is to look in `/etc/passwd' for this
+system password unless your system has PAM (Pluggable Authentication
+Modules) and your CVS server executable was configured to use it at
+compile time (using `./configure --enable-pam' - see the INSTALL file
+for more). In this case, PAM will be consulted instead. This means
+that CVS can be configured to use any password authentication source PAM
+can be configured to use (possibilities include a simple UNIX password,
+NIS, LDAP, and others) in its global configuration file (usually
+`/etc/pam.conf' or possibly `/etc/pam.d/cvs'). See your PAM
+documentation for more details on PAM configuration.
+
+ Note that PAM is an experimental feature in CVS and feedback is
+encouraged. Please send a mail to one of the CVS mailing lists
+(address@hidden' or address@hidden') if you use the CVS PAM
+support.
+
+ *WARNING: Using PAM gives the system administrator much more
+flexibility about how CVS users are authenticated but no more security
+than other methods. See below for more.*
+
+ CVS needs an "auth" and "account" module in the PAM configuration
+file. A typical PAM configuration would therefore have the following
+lines in `/etc/pam.conf' to emulate the standard CVS system
+`/etc/passwd' authentication:
+
+ cvs auth required pam_unix.so
+ cvs account required pam_unix.so
+
+ The the equivalent `/etc/pam.d/cvs' would contain
+
+ auth required pam_unix.so
+ account required pam_unix.so
+
+ Some systems require a full path to the module so that `pam_unix.so'
+(Linux) would become something like
+`/usr/lib/security/$ISA/pam_unix.so.1' (Sun Solaris). See the
+`contrib/pam' subdirectory of the CVS source distribution for further
+example configurations.
+
+ The PAM service name given above as "cvs" is just the service name in
+the default configuration amd can be set using `./configure
+--with-hardcoded-pam-service-name=<pam-service-name>' before compiling.
+CVS can also be configured to use whatever name it is invoked as as its
+PAM service name using `./configure
+--without-hardcoded-pam-service-name', but this feature should not be
+used if you may not have control of the name CVS will be invoked as.
+
+ Be aware, also, that falling back to system authentication might be a
+security risk: CVS operations would then be authenticated with that
+user's regular login password, and the password flies across the network
+in plaintext. See *note Password authentication security:: for more on
+this. This may be more of a problem with PAM authentication because it
+is likely that the source of the system password is some central
+authentication service like LDAP which is also used to authenticate
+other services.
+
+ On the other hand, PAM makes it very easy to change your password
+regularly. If they are given the option of a one-password system for
+all of their activities, users are often more willing to change their
+password on a regular basis.
+
+ In the non-PAM configuration where the password is stored in the
+`CVSROOT/passwd' file, it is difficult to change passwords on a regular
+basis since only administrative users (or in some cases processes that
+act as an administrative user) are typicaly given access to modify this
+file. Either there needs to be some hand-crafted web page or set-uid
+program to update the file, or the update needs to be done by submitting
+a request to an administrator to perform the duty by hand. In the first
+case, having to remember to update a separate password on a periodic
+basis can be difficult. In the second case, the manual nature of the
+change will typically mean that the password will not be changed unless
+it is absolutely necessary.
+
+ Note that PAM administrators should probably avoid configuring
+one-time-passwords (OTP) for CVS authentication/authorization. If OTPs
+are desired, the administrator may wish to encourage the use of one of
+the other Client/Server access methods. See the section on *note Remote
+repositories:: for a list of other methods.
+
+ Right now, the only way to put a password in the CVS `passwd' file is
+to paste it there from somewhere else. Someday, there may be a `cvs
+passwd' command.
+
+ Unlike many of the files in `$CVSROOT/CVSROOT', it is normal to edit
+the `passwd' file in-place, rather than via CVS. This is because of the
+possible security risks of having the `passwd' file checked out to
+people's working copies. If you do want to include the `passwd' file in
+checkouts of `$CVSROOT/CVSROOT', see *note checkoutlist::.
+
+
+File: cvs.info, Node: Password authentication client, Next: Password
authentication security, Prev: Password authentication server, Up: Password
authenticated
+
+2.9.3.2 Using the client with password authentication
+.....................................................
+
+To run a CVS command on a remote repository via the
+password-authenticating server, one specifies the `pserver' protocol,
+optional username, repository host, an optional port number, and path to
+the repository. For example:
+
+ cvs -d :pserver:faun.example.org:/usr/local/cvsroot checkout someproj
+
+or
+
+ CVSROOT=:pserver:address@hidden:2401/usr/local/cvsroot
+ cvs checkout someproj
+
+ However, unless you're connecting to a public-access repository
+(i.e., one where that username doesn't require a password), you'll need
+to supply a password or "log in" first. Logging in verifies your
+password with the repository and stores it in a file. It's done with
+the `login' command, which will prompt you interactively for the
+password if you didn't supply one as part of $CVSROOT:
+
+ cvs -d :pserver:address@hidden:/usr/local/cvsroot login
+ CVS password:
+
+or
+
+ cvs -d :pserver:bach:address@hidden:/usr/local/cvsroot login
+
+ After you enter the password, CVS verifies it with the server. If
+the verification succeeds, then that combination of username, host,
+repository, and password is permanently recorded, so future transactions
+with that repository won't require you to run `cvs login'. (If
+verification fails, CVS will exit complaining that the password was
+incorrect, and nothing will be recorded.)
+
+ The records are stored, by default, in the file `$HOME/.cvspass'.
+That file's format is human-readable, and to a degree human-editable,
+but note that the passwords are not stored in cleartext--they are
+trivially encoded to protect them from "innocent" compromise (i.e.,
+inadvertent viewing by a system administrator or other non-malicious
+person).
+
+ You can change the default location of this file by setting the
+`CVS_PASSFILE' environment variable. If you use this variable, make
+sure you set it _before_ `cvs login' is run. If you were to set it
+after running `cvs login', then later CVS commands would be unable to
+look up the password for transmission to the server.
+
+ Once you have logged in, all CVS commands using that remote
+repository and username will authenticate with the stored password. So,
+for example
+
+ cvs -d :pserver:address@hidden:/usr/local/cvsroot checkout foo
+
+should just work (unless the password changes on the server side, in
+which case you'll have to re-run `cvs login').
+
+ Note that if the `:pserver:' were not present in the repository
+specification, CVS would assume it should use `rsh' to connect with the
+server instead (*note Connecting via rsh::).
+
+ Of course, once you have a working copy checked out and are running
+CVS commands from within it, there is no longer any need to specify the
+repository explicitly, because CVS can deduce the repository from the
+working copy's `CVS' subdirectory.
+
+ The password for a given remote repository can be removed from the
+`CVS_PASSFILE' by using the `cvs logout' command.
+
+
+File: cvs.info, Node: Password authentication security, Prev: Password
authentication client, Up: Password authenticated
+
+2.9.3.3 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 CVS password file (*note 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
+non-read-only 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 CVS to prevent that, but no one has done so as of this writing.
+
+ Note that because the `$CVSROOT/CVSROOT' directory contains `passwd'
+and other files which are used to check security, you must control the
+permissions on this directory as tightly as the permissions on `/etc'.
+The same applies to the `$CVSROOT' directory itself and any directory
+above it in the tree. Anyone who has write access to such a directory
+will have the ability to become any user on the system. Note that these
+permissions are typically tighter than you would use if you are not
+using pserver.
+
+ In summary, anyone who gets the password gets repository access
+(which may imply 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.
+
+
+File: cvs.info, Node: GSSAPI authenticated, Next: Kerberos authenticated,
Prev: Password authenticated, Up: Remote repositories
+
+2.9.4 Direct connection with GSSAPI
+-----------------------------------
+
+GSSAPI is a generic interface to network security systems such as
+Kerberos 5. If you have a working GSSAPI library, you can have CVS
+connect via a direct TCP connection, authenticating with GSSAPI.
+
+ To do this, CVS needs to be compiled with GSSAPI support; when
+configuring CVS it tries to detect whether GSSAPI libraries using
+kerberos version 5 are present. You can also use the `--with-gssapi'
+flag to configure.
+
+ The connection is authenticated using GSSAPI, but the message stream
+is _not_ authenticated by default. You must use the `-a' global option
+to request stream authentication.
+
+ The data transmitted is _not_ encrypted by default. Encryption
+support must be compiled into both the client and the server; use the
+`--enable-encrypt' configure option to turn it on. You must then use
+the `-x' global option to request encryption.
+
+ GSSAPI connections are handled on the server side by the same server
+which handles the password authentication server; see *note Password
+authentication server::. If you are using a GSSAPI mechanism such as
+Kerberos which provides for strong authentication, you will probably
+want to disable the ability to authenticate via cleartext passwords. To
+do so, create an empty `CVSROOT/passwd' password file, and set
+`SystemAuth=no' in the config file (*note config::).
+
+ The GSSAPI server uses a principal name of cvs/HOSTNAME, where
+HOSTNAME is the canonical name of the server host. You will have to set
+this up as required by your GSSAPI mechanism.
+
+ To connect using GSSAPI, use `:gserver:'. For example,
+
+ cvs -d :gserver:faun.example.org:/usr/local/cvsroot checkout foo
+
+
+File: cvs.info, Node: Kerberos authenticated, Next: Connecting via fork,
Prev: GSSAPI authenticated, Up: Remote repositories
+
+2.9.5 Direct connection with kerberos
+-------------------------------------
+
+The easiest way to use kerberos is to use the kerberos `rsh', as
+described in *note Connecting via rsh::. 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 TCP connection, authenticating with kerberos.
+
+ This section concerns the kerberos network security system, version
+4. Kerberos version 5 is supported via the GSSAPI generic network
+security interface, as described in the previous section.
+
+ To do this, CVS needs to be compiled with kerberos support; when
+configuring CVS it tries to detect whether kerberos is present or you
+can use the `--with-krb4' flag to configure.
+
+ The data transmitted is _not_ encrypted by default. Encryption
+support must be compiled into both the client and server; use the
+`--enable-encryption' configure option to turn it on. You must then use
+the `-x' global option to request encryption.
+
+ You need to edit `inetd.conf' on the server machine to run `cvs
+kserver'. The client uses port 1999 by default; if you want to use
+another port specify it in the `CVSROOT' (*note Remote repositories::)
+or the `CVS_CLIENT_PORT' environment variable (*note Environment
+variables::) on the client.
+
+ When you want to use CVS, get a ticket in the usual way (generally
+`kinit'); it must be a ticket which allows you to log into the server
+machine. Then you are ready to go:
+
+ cvs -d :kserver:faun.example.org:/usr/local/cvsroot checkout foo
+
+ Previous versions of CVS would fall back to a connection via rsh;
+this version will not do so.
+
+
+File: cvs.info, Node: Connecting via fork, Prev: Kerberos authenticated,
Up: Remote repositories
+
+2.9.6 Connecting with fork
+--------------------------
+
+This access method allows you to connect to a repository on your local
+disk via the remote protocol. In other words it does pretty much the
+same thing as `:local:', but various quirks, bugs and the like are those
+of the remote CVS rather than the local CVS.
+
+ For day-to-day operations you might prefer either `:local:' or
+`:fork:', depending on your preferences. Of course `:fork:' comes in
+particularly handy in testing or debugging `cvs' and the remote
+protocol. Specifically, we avoid all of the network-related
+setup/configuration, timeouts, and authentication inherent in the other
+remote access methods but still create a connection which uses the
+remote protocol.
+
+ To connect using the `fork' method, use `:fork:' and the pathname to
+your local repository. For example:
+
+ cvs -d :fork:/usr/local/cvsroot checkout foo
+
+ As with `:ext:', the server is called `cvs' by default, or the value
+of the `CVS_SERVER' environment variable.
+
+
+File: cvs.info, Node: Read-only access, Next: Server temporary directory,
Prev: Remote repositories, Up: Repository
+
+2.10 Read-only repository access
+================================
+
+It is possible to grant read-only repository access to people using the
+password-authenticated server (*note Password authenticated::). (The
+other access methods do not have explicit support for read-only users
+because those methods all assume login access to the repository machine
+anyway, and therefore the user can do whatever local file permissions
+allow her to do.)
+
+ A user who has read-only access can do only those CVS operations
+which do not modify the repository, except for certain "administrative"
+files (such as lock files and the history file). It may be desirable to
+use this feature in conjunction with user-aliasing (*note Password
+authentication server::).
+
+ Unlike with previous versions of CVS, read-only users should be able
+merely to read the repository, and not to execute programs on the server
+or otherwise gain unexpected levels of access. Or to be more accurate,
+the _known_ holes have been plugged. Because this feature is new and
+has not received a comprehensive security audit, you should use whatever
+level of caution seems warranted given your attitude concerning
+security.
+
+ There are two ways to specify read-only access for a user: by
+inclusion, and by exclusion.
+
+ "Inclusion" means listing that user specifically in the
+`$CVSROOT/CVSROOT/readers' file, which is simply a newline-separated
+list of users. Here is a sample `readers' file:
+
+ melissa
+ splotnik
+ jrandom
+
+(Don't forget the newline after the last user.)
+
+ "Exclusion" means explicitly listing everyone who has _write_
+access--if the file
+
+ $CVSROOT/CVSROOT/writers
+
+exists, then only those users listed in it have write access, and
+everyone else has read-only access (of course, even the read-only users
+still need to be listed in the CVS `passwd' file). The `writers' file
+has the same format as the `readers' file.
+
+ Note: if your CVS `passwd' file maps cvs users onto system users
+(*note Password authentication server::), make sure you deny or grant
+read-only access using the _cvs_ usernames, not the system usernames.
+That is, the `readers' and `writers' files contain cvs usernames, which
+may or may not be the same as system usernames.
+
+ Here is a complete description of the server's behavior in deciding
+whether to grant read-only or read-write access:
+
+ If `readers' exists, and this user is listed in it, then she gets
+read-only access. Or if `writers' exists, and this user is NOT listed
+in it, then she also gets read-only access (this is true even if
+`readers' exists but she is not listed there). Otherwise, she gets full
+read-write access.
+
+ Of course there is a conflict if the user is listed in both files.
+This is resolved in the more conservative way, it being better to
+protect the repository too much than too little: such a user gets
+read-only access.
+
+
+File: cvs.info, Node: Server temporary directory, Prev: Read-only access,
Up: Repository
+
+2.11 Temporary directories for the server
+=========================================
+
+While running, the CVS server creates temporary directories. They are
+named
+
+ cvs-servPID
+
+where PID is the process identification number of the server. They are
+located in the directory specified by the `-T' global option (*note
+Global options::), the `TMPDIR' environment variable (*note Environment
+variables::), or, failing that, `/tmp'.
+
+ In most cases the server will remove the temporary directory when it
+is done, whether it finishes normally or abnormally. However, there are
+a few cases in which the server does not or cannot remove the temporary
+directory, for example:
+
+ * If the server aborts due to an internal server error, it may
+ preserve the directory to aid in debugging
+
+ * If the server is killed in a way that it has no way of cleaning up
+ (most notably, `kill -KILL' on unix).
+
+ * If the system shuts down without an orderly shutdown, which tells
+ the server to clean up.
+
+ In cases such as this, you will need to manually remove the
+`cvs-servPID' directories. As long as there is no server running with
+process identification number PID, it is safe to do so.
+
+
+File: cvs.info, Node: Starting a new project, Next: Revisions, Prev:
Repository, Up: Top
+
+3 Starting a project with CVS
+*****************************
+
+Because renaming files and moving them between directories is somewhat
+inconvenient, the first thing you do when you start a new project should
+be to think through your file organization. It is not impossible to
+rename or move files, but it does increase the potential for confusion
+and CVS does have some quirks particularly in the area of renaming
+directories. *Note 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
+
+
+File: cvs.info, Node: Setting up the files, Next: Defining the module, Up:
Starting a new project
+
+3.1 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.
+
+* 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 directory tree from scratch.
+
+
+File: cvs.info, Node: From files, Next: From other version control systems,
Up: Setting up the files
+
+3.1.1 Creating a directory tree from a number of files
+------------------------------------------------------
+
+When you begin using CVS, you will probably already have several
+projects that can be put under CVS control. In these cases the easiest
+way is to use the `import' command. An example is probably the easiest
+way to explain how to use it. If the files you want to install in CVS
+reside in `WDIR', and you want them to appear in the repository as
+`$CVSROOT/yoyodyne/RDIR', you can do this:
+
+ $ cd WDIR
+ $ cvs import -m "Imported sources" yoyodyne/RDIR yoyo start
+
+ Unless you supply a log message with the `-m' flag, CVS starts an
+editor and prompts for a message. The string `yoyo' is a "vendor tag",
+and `start' is a "release tag". They may fill no purpose in this
+context, but since CVS requires them they must be present. *Note
+Tracking sources::, for more information about them.
+
+ You can now verify that it worked, and remove your original source
+directory.
+
+ $ cd ..
+ $ cvs checkout yoyodyne/RDIR # Explanation below
+ $ diff -r WDIR yoyodyne/RDIR
+ $ rm -r WDIR
+
+Erasing the original sources is a good idea, to make sure that you do
+not accidentally edit them in WDIR, bypassing CVS. Of course, it would
+be wise to make sure that you have a backup of the sources before you
+remove them.
+
+ The `checkout' command can either take a module name as argument (as
+it has done in all previous examples) or a path name relative to
+`$CVSROOT', as it did in the example above.
+
+ It is a good idea to check that the permissions CVS sets on the
+directories inside `$CVSROOT' are reasonable, and that they belong to
+the proper groups. *Note File permissions::.
+
+ If some of the files you want to import are binary, you may want to
+use the wrappers features to specify which files are binary and which
+are not. *Note Wrappers::.
+
+
+File: cvs.info, Node: From other version control systems, Next: From
scratch, Prev: From files, Up: Setting up the files
+
+3.1.2 Creating Files From Other Version Control Systems
+-------------------------------------------------------
+
+If you have a project which you are maintaining with another version
+control system, such as RCS, you may wish to put the files from that
+project into CVS, and preserve the revision history of the files.
+
+From RCS
+ If you have been using RCS, find the RCS files--usually a file
+ named `foo.c' will have its RCS file in `RCS/foo.c,v' (but it could
+ be other places; consult the RCS documentation for details). Then
+ create the appropriate directories in CVS if they do not already
+ exist. Then copy the files into the appropriate directories in the
+ CVS repository (the name in the repository must be the name of the
+ source file with `,v' added; the files go directly in the
+ appropriate directory of the repository, not in an `RCS'
+ subdirectory). This is one of the few times when it is a good idea
+ to access the CVS repository directly, rather than using CVS
+ commands. Then you are ready to check out a new working directory.
+
+ The RCS file should not be locked when you move it into CVS; if it
+ is, CVS will have trouble letting you operate on it.
+
+From another version control system
+ Many version control systems have the ability to export RCS files
+ in the standard format. If yours does, export the RCS files and
+ then follow the above instructions.
+
+ Failing that, probably your best bet is to write a script that will
+ check out the files one revision at a time using the command line
+ interface to the other system, and then check the revisions into
+ CVS. The `sccs2rcs' script mentioned below may be a useful example
+ to follow.
+
+From SCCS
+ There is a script in the `contrib' directory of the CVS source
+ distribution called `sccs2rcs' which converts SCCS files to RCS
+ files. Note: you must run it on a machine which has both SCCS and
+ RCS installed, and like everything else in contrib it is
+ unsupported (your mileage may vary).
+
+From PVCS
+ There is a script in the `contrib' directory of the CVS source
+ distribution called `pvcs_to_rcs' which converts PVCS archives to
+ RCS files. You must run it on a machine which has both PVCS and
+ RCS installed, and like everything else in contrib it is
+ unsupported (your mileage may vary). See the comments in the
+ script for details.
+
+
+File: cvs.info, Node: From scratch, Prev: From other version control
systems, Up: Setting up the files
+
+3.1.3 Creating a directory tree from scratch
+--------------------------------------------
+
+For a new project, the easiest thing to do is probably to create an
+empty directory structure, like this:
+
+ $ mkdir tc
+ $ mkdir tc/man
+ $ mkdir tc/testing
+
+ After that, you use the `import' command to create the corresponding
+(empty) directory structure inside the repository:
+
+ $ cd tc
+ $ cvs import -m "Created directory structure" yoyodyne/DIR yoyo start
+
+ Then, use `add' to add files (and new directories) as they appear.
+
+ Check that the permissions CVS sets on the directories inside
+`$CVSROOT' are reasonable.
+
+
+File: cvs.info, Node: Defining the module, Prev: Setting up the files, Up:
Starting a new project
+
+3.2 Defining the module
+=======================
+
+The next step is to define the module in the `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.
+
+ 1. Get a working copy of the modules file.
+
+ $ cvs checkout CVSROOT/modules
+ $ cd CVSROOT
+
+ 2. Edit the file and insert a line that defines the module. *Note
+ Intro administrative files::, for an introduction. *Note
+ modules::, for a full description of the modules file. You can use
+ the following line to define the module `tc':
+
+ tc yoyodyne/tc
+
+ 3. Commit your changes to the modules file.
+
+ $ cvs commit -m "Added the tc module." modules
+
+ 4. Release the modules module.
+
+ $ cd ..
+ $ cvs release -d CVSROOT
+
+
+File: cvs.info, Node: Revisions, Next: Branching and merging, Prev:
Starting a new project, Up: Top
+
+4 Revisions
+***********
+
+For many uses of CVS, one doesn't need to worry too much about revision
+numbers; CVS assigns numbers such as `1.1', `1.2', and so on, and that
+is all one needs to know. However, some people prefer to have more
+knowledge and control concerning how CVS assigns revision numbers.
+
+ If one wants to keep track of a set of revisions involving more than
+one file, such as which revisions went into a particular release, one
+uses a "tag", which is a symbolic revision which can be assigned to a
+numeric revision in each file.
+
+* Menu:
+
+* Revision numbers:: The meaning of a revision number
+* Versions revisions releases:: Terminology used in this manual
+* Assigning revisions:: Assigning revisions
+* Tags:: Tags-Symbolic revisions
+* Tagging the working directory:: The cvs tag command
+* Tagging by date/tag:: The cvs rtag command
+* Modifying tags:: Adding, renaming, and deleting tags
+* Tagging add/remove:: Tags with adding and removing files
+* Sticky tags:: Certain tags are persistent
+
+
+File: cvs.info, Node: Revision numbers, Next: Versions revisions releases,
Up: Revisions
+
+4.1 Revision numbers
+====================
+
+Each version of a file has a unique "revision number". Revision numbers
+look like `1.1', `1.2', `1.3.2.2' or even `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.
+
+ +-----+ +-----+ +-----+ +-----+ +-----+
+ ! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 !
+ +-----+ +-----+ +-----+ +-----+ +-----+
+
+ It is also possible to end up with numbers containing more than one
+period, for example `1.3.2.2'. Such revisions represent revisions on
+branches (*note Branching and merging::); such revision numbers are
+explained in detail in *note Branches and revisions::.
+
+
+File: cvs.info, Node: Versions revisions releases, Next: Assigning
revisions, Prev: Revision numbers, Up: Revisions
+
+4.2 Versions, revisions and releases
+====================================
+
+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 `4.1.1'.
+
+ Versions in the first sense are called "revisions" in this document,
+and versions in the second sense are called "releases". To avoid
+confusion, the word "version" is almost never used in this document.
+
+
+File: cvs.info, Node: Assigning revisions, Next: Tags, Prev: Versions
revisions releases, Up: Revisions
+
+4.3 Assigning revisions
+=======================
+
+By default, CVS will assign numeric revisions by leaving the first
+number the same and incrementing the second number. For example, `1.1',
+`1.2', `1.3', etc.
+
+ When adding a new file, the second number will always be one and the
+first number will equal the highest first number of any file in that
+directory. For example, the current directory contains files whose
+highest numbered revisions are `1.7', `3.1', and `4.12', then an added
+file will be given the numeric revision `4.1'.
+
+ Normally there is no reason to care about the revision numbers--it is
+easier to treat them as internal numbers that CVS maintains, and tags
+provide a better way to distinguish between things like release 1 versus
+release 2 of your product (*note Tags::). However, if you want to set
+the numeric revisions, the `-r' option to `cvs commit' can do that. The
+`-r' option implies the `-f' option, in the sense that it causes the
+files to be committed even if they are not modified.
+
+ For example, to bring all your files up to revision 3.0 (including
+those that haven't changed), you might invoke:
+
+ $ cvs commit -r 3.0
+
+ Note that the number you specify with `-r' must be larger than any
+existing revision number. That is, if revision 3.0 exists, you cannot
+`cvs commit -r 1.3'. If you want to maintain several releases in
+parallel, you need to use a branch (*note Branching and merging::).
+
+
+File: cvs.info, Node: Tags, Next: Tagging the working directory, Prev:
Assigning revisions, Up: Revisions
+
+4.4 Tags-Symbolic revisions
+===========================
+
+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 CVS the revision numbers might change several
+times between two releases. As an example, some of the source files
+that make up RCS 5.6 have the following revision numbers:
+
+ 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
+
+ You can use the `tag' command to give a symbolic name to a certain
+revision of a file. You can use the `-v' flag to the `status' command
+to see all tags that a file has, and which revision numbers they
+represent. Tag names must start with an uppercase or lowercase letter
+and can contain uppercase and lowercase letters, digits, `-', and `_'.
+The two tag names `BASE' and `HEAD' are reserved for use by CVS. It is
+expected that future names which are special to CVS will be specially
+named, for example by starting with `.', rather than being named
+analogously to `BASE' and `HEAD', to avoid conflicts with actual tag
+names.
+
+ You'll want to choose some convention for naming tags, based on
+information such as the name of the program and the version number of
+the release. For example, one might take the name of the program,
+immediately followed by the version number with `.' changed to `-', so
+that CVS 1.9 would be tagged with the name `cvs1-9'. If you choose a
+consistent convention, then you won't constantly be guessing whether a
+tag is `cvs-1-9' or `cvs1_9' or what. You might even want to consider
+enforcing your convention in the taginfo file (*note user-defined
+logging::).
+
+ The following example shows how you can add a tag to a file. The
+commands must be issued inside your working directory. That is, you
+should issue the command in the directory where `backend.c' resides.
+
+ $ cvs tag rel-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 /u/cvsroot/yoyodyne/tc/backend.c,v
+ Sticky Tag: (none)
+ Sticky Date: (none)
+ Sticky Options: (none)
+
+ Existing Tags:
+ rel-0-4 (revision: 1.4)
+
+ For a complete summary of the syntax of `cvs tag', including the
+various options, see *note Invoking CVS::.
+
+ 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.
+
+ $ cvs tag rel-1-0 .
+ cvs tag: Tagging .
+ T Makefile
+ T backend.c
+ T driver.c
+ T frontend.c
+ T parser.c
+
+(When you give 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. *Note Recursive behavior::.)
+
+ The `checkout' command has a flag, `-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 `tc' at any time in the
+future:
+
+ $ cvs checkout -r rel-1-0 tc
+
+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. *Note
+checkout options::. When specifying `-r' to any of these commands, you
+will need beware of sticky tags; see *note Sticky tags::.
+
+ 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:
+
+ 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
+
+ At some time in the past, the `*' 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:
+
+ 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
+
+
+File: cvs.info, Node: Tagging the working directory, Next: Tagging by
date/tag, Prev: Tags, Up: Revisions
+
+4.5 Specifying what to tag from the working directory
+=====================================================
+
+The example in the previous section demonstrates one of the most common
+ways to choose which revisions to tag. Namely, running the `cvs tag'
+command without arguments causes CVS to select the revisions which are
+checked out in the current working directory. For example, if the copy
+of `backend.c' in working directory was checked out from revision 1.4,
+then CVS will tag revision 1.4. Note that the tag is applied
+immediately to revision 1.4 in the repository; tagging is not like
+modifying a file, or other operations in which one first modifies the
+working directory and then runs `cvs commit' to transfer that
+modification to the repository.
+
+ One potentially surprising aspect of the fact that `cvs tag' operates
+on the repository is that you are tagging the checked-in revisions,
+which may differ from locally modified files in your working directory.
+If you want to avoid doing this by mistake, specify the `-c' option to
+`cvs tag'. If there are any locally modified files, CVS will abort with
+an error before it tags any files:
+
+ $ cvs tag -c rel-0-4
+ cvs tag: backend.c is locally modified
+ cvs [tag aborted]: correct the above errors first!
+
+
+File: cvs.info, Node: Tagging by date/tag, Next: Modifying tags, Prev:
Tagging the working directory, Up: Revisions
+
+4.6 Specifying what to tag by date or revision
+==============================================
+
+The `cvs rtag' command tags the repository as of a certain date or time
+(or can be used to tag the latest revision). `rtag' works directly on
+the repository contents (it requires no prior checkout and does not look
+for a working directory).
+
+ The following options specify which date or revision to tag. See
+*note Common options::, for a complete description of them.
+
+`-D DATE'
+ Tag the most recent revision no later than DATE.
+
+`-f'
+ Only useful with the `-D DATE' or `-r TAG' flags. If no matching
+ revision is found, use the most recent revision (instead of
+ ignoring the file).
+
+`-r TAG'
+ Only tag those files that contain existing tag TAG.
+
+ The `cvs tag' command also allows one to specify files by revision or
+date, using the same `-r', `-D', and `-f' options. However, this
+feature is probably not what you want. The reason is that `cvs tag'
+chooses which files to tag based on the files that exist in the working
+directory, rather than the files which existed as of the given tag/date.
+ Therefore, you are generally better off using `cvs rtag'. The
+exceptions might be cases like:
+
+ cvs tag -r 1.4 stable backend.c
+
+
+File: cvs.info, Node: Modifying tags, Next: Tagging add/remove, Prev:
Tagging by date/tag, Up: Revisions
+
+4.7 Deleting, moving, and renaming tags
+=======================================
+
+Normally one does not modify tags. They exist in order to record the
+history of the repository and so deleting them or changing their meaning
+would, generally, not be what you want.
+
+ However, there might be cases in which one uses a tag temporarily or
+accidentally puts one in the wrong place. Therefore, one might delete,
+move, or rename a tag.
+
+*WARNING: the commands in this section are dangerous; they permanently
+discard historical information and it can be difficult or impossible to
+recover from errors. If you are a CVS administrator, you may consider
+restricting these commands with taginfo (*note user-defined logging::).*
+
+ To delete a tag, specify the `-d' option to either `cvs tag' or `cvs
+rtag'. For example:
+
+ cvs rtag -d rel-0-4 tc
+
+deletes the non-branch tag `rel-0-4' from the module `tc'. In the event
+that branch tags are encountered within the repository with the given
+name, a warning message will be issued and the branch tag will not be
+deleted. If you are absolutely certain you know what you are doing, the
+`-B' option may be specified to allow deletion of branch tags. In that
+case, any non-branch tags encountered will trigger warnings and will not
+be deleted.
+
+*WARNING: Moving branch tags is very dangerous! If you think you need
+the `-B' option, think again and ask your CVS administrator about it (if
+that isn't you). There is almost certainly another way to accomplish
+what you want to accomplish.*
+
+ When we say "move" a tag, we mean to make the same name point to
+different revisions. For example, the `stable' tag may currently point
+to revision 1.4 of `backend.c' and perhaps we want to make it point to
+revision 1.6. To move a non-branch tag, specify the `-F' option to
+either `cvs tag' or `cvs rtag'. For example, the task just mentioned
+might be accomplished as:
+
+ cvs tag -r 1.6 -F stable backend.c
+
+If any branch tags are encountered in the repository with the given
+name, a warning is issued and the branch tag is not disturbed. If you
+are absolutely certain you wish to move the branch tag, the `-B' option
+may be specified. In that case, non-branch tags encountered with the
+given name are ignored with a warning message.
+
+*WARNING: Moving branch tags is very dangerous! If you think you need
+the `-B' option, think again and ask your CVS administrator about it (if
+that isn't you). There is almost certainly another way to accomplish
+what you want to accomplish.*
+
+ When we say "rename" a tag, we mean to make a different name point to
+the same revisions as the old tag. For example, one may have misspelled
+the tag name and want to correct it (hopefully before others are relying
+on the old spelling). To rename a tag, first create a new tag using the
+`-r' option to `cvs rtag', and then delete the old name. (Caution: this
+method will not work with branch tags.) This leaves the new tag on
+exactly the same files as the old tag. For example:
+
+ cvs rtag -r old-name-0-4 rel-0-4 tc
+ cvs rtag -d old-name-0-4 tc
+
+
+File: cvs.info, Node: Tagging add/remove, Next: Sticky tags, Prev:
Modifying tags, Up: Revisions
+
+4.8 Tagging and adding and removing files
+=========================================
+
+The subject of exactly how tagging interacts with adding and removing
+files is somewhat obscure; for the most part CVS will keep track of
+whether files exist or not without too much fussing. By default, tags
+are applied to only files which have a revision corresponding to what is
+being tagged. Files which did not exist yet, or which were already
+removed, simply omit the tag, and CVS knows to treat the absence of a
+tag as meaning that the file didn't exist as of that tag.
+
+ However, this can lose a small amount of information. For example,
+suppose a file was added and then removed. Then, if the tag is missing
+for that file, there is no way to know whether the tag refers to the
+time before the file was added, or the time after it was removed. If
+you specify the `-r' option to `cvs rtag', then CVS tags the files which
+have been removed, and thereby avoids this problem. For example, one
+might specify `-r HEAD' to tag the head.
+
+ On the subject of adding and removing files, the `cvs rtag' command
+has a `-a' option which means to clear the tag from removed files that
+would not otherwise be tagged. For example, one might specify this
+option in conjunction with `-F' when moving a tag. If one moved a tag
+without `-a', then the tag in the removed files might still refer to the
+old revision, rather than reflecting the fact that the file had been
+removed. I don't think this is necessary if `-r' is specified, as noted
+above.
+
+
+File: cvs.info, Node: Sticky tags, Prev: Tagging add/remove, Up: Revisions
+
+4.9 Sticky tags
+===============
+
+Sometimes a working copy's revision has extra data associated with it,
+for example it might be on a branch (*note Branching and merging::), or
+restricted to versions prior to a certain date by `checkout -D' or
+`update -D'. Because this data persists - that is, it applies to
+subsequent commands in the working copy - we refer to it as "sticky".
+
+ Most of the time, stickiness is an obscure aspect of CVS that you
+don't need to think about. However, even if you don't want to use the
+feature, you may need to know _something_ about sticky tags (for
+example, how to avoid them!).
+
+ You can use the `status' command to see if any sticky tags or dates
+are set:
+
+ $ cvs status 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 /u/cvsroot/yoyodyne/tc/driver.c,v
+ Sticky Tag: rel-1-0-patches (branch: 1.7.2)
+ Sticky Date: (none)
+ Sticky Options: (none)
+
+ The sticky tags will remain on your working files until you delete
+them with `cvs update -A'. The `-A' option merges local changes into
+the version of the file from the head of the trunk, removing any sticky
+tags, dates, or options. See *note update:: for more on the operation
+of `cvs update'.
+
+ The most common use of sticky tags is to identify which branch one is
+working on, as described in *note Accessing branches::. However,
+non-branch sticky tags have uses as well. For example, suppose that you
+want to avoid updating your working directory, to isolate yourself from
+possibly destabilizing changes other people are making. You can, of
+course, just refrain from running `cvs update'. But if you want to
+avoid updating only a portion of a larger tree, then sticky tags can
+help. If you check out a certain revision (such as 1.4) it will become
+sticky. Subsequent `cvs update' commands will not retrieve the latest
+revision until you reset the tag with `cvs update -A'. Likewise, use of
+the `-D' option to `update' or `checkout' sets a "sticky date", which,
+similarly, causes that date to be used for future retrievals.
+
+ People often want to retrieve an old version of a file without
+setting a sticky tag. This can be done with the `-p' option to
+`checkout' or `update', which sends the contents of the file to standard
+output. For 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
+ ***************
+ $
+
+ However, this isn't the easiest way, if you are asking how to undo a
+previous checkin (in this example, put `file1' back to the way it was as
+of revision 1.1). In that case you are better off using the `-j' option
+to `update'; for further discussion see *note Merging two revisions::.
+
+
+File: cvs.info, Node: Branching and merging, Next: Recursive behavior,
Prev: Revisions, Up: Top
+
+5 Branching and merging
+***********************
+
+CVS allows you to isolate changes onto a separate line of development,
+known as a "branch". When you change files on a branch, those changes
+do not appear on the main trunk or other branches.
+
+ Later you can move changes from one branch to another branch (or the
+main trunk) by "merging". Merging involves first running `cvs update
+-j', to merge the changes into the working directory. You can then
+commit that revision, and thus effectively copy the changes onto another
+branch.
+
+* Menu:
+
+* Branches motivation:: What branches are good for
+* Creating a branch:: Creating a branch
+* Accessing branches:: Checking out and updating branches
+* Branches and revisions:: Branches are reflected in revision numbers
+* Magic branch numbers:: Magic branch numbers
+* 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
+* Merging adds and removals:: What if files are added or removed?
+* Merging and keywords:: Avoiding conflicts due to keyword substitution
+
+
+File: cvs.info, Node: Branches motivation, Next: Creating a branch, Up:
Branching and merging
+
+5.1 What branches are good for
+==============================
+
+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 (*note 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 "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 elect to either
+incorporate them on the main trunk, or leave them on the branch.
+
+
+File: cvs.info, Node: Creating a branch, Next: Accessing branches, Prev:
Branches motivation, Up: Branching and merging
+
+5.2 Creating a branch
+=====================
+
+You can create a branch with `tag -b'; for example, assuming you're in a
+working copy:
+
+ $ cvs tag -b rel-1-0-patches
+
+ This splits off a branch based on the current revisions in the
+working copy, assigning that branch the name `rel-1-0-patches'.
+
+ It is important to understand that branches get created in the
+repository, not in the working copy. Creating a branch based on current
+revisions, as the above example does, will _not_ automatically switch
+the working copy to be on the new branch. For information on how to do
+that, see *note Accessing branches::.
+
+ You can also create a branch without reference to any working copy,
+by using `rtag':
+
+ $ cvs rtag -b -r rel-1-0 rel-1-0-patches tc
+
+ `-r rel-1-0' says that this branch should be rooted at the revision
+that corresponds to the tag `rel-1-0'. It need not be the most recent
+revision - it's often useful to split a branch off an old revision (for
+example, when fixing a bug in a past release otherwise known to be
+stable).
+
+ As with `tag', the `-b' flag tells `rtag' to create a branch (rather
+than just a symbolic revision name). Note that the numeric revision
+number that matches `rel-1-0' will probably be different from file to
+file.
+
+ So, the full effect of the command is to create a new branch - named
+`rel-1-0-patches' - in module `tc', rooted in the revision tree at the
+point tagged by `rel-1-0'.
+
+
+File: cvs.info, Node: Accessing branches, Next: Branches and revisions,
Prev: Creating a branch, Up: Branching and merging
+
+5.3 Accessing branches
+======================
+
+You can retrieve a branch in one of two ways: by checking it out fresh
+from the repository, or by switching an existing working copy over to
+the branch.
+
+ To check out a branch from the repository, invoke `checkout' with the
+`-r' flag, followed by the tag name of the branch (*note Creating a
+branch::):
+
+ $ cvs checkout -r rel-1-0-patches tc
+
+ Or, if you already have a working copy, you can switch it to a given
+branch with `update -r':
+
+ $ cvs update -r rel-1-0-patches tc
+
+or equivalently:
+
+ $ cd tc
+ $ cvs update -r rel-1-0-patches
+
+ It does not matter if the working copy was originally on the main
+trunk or on some other branch - the above command will switch it to the
+named branch. And similarly to a regular `update' command, `update -r'
+merges any changes you have made, notifying you of conflicts where they
+occur.
+
+ Once you have a working copy tied to a particular branch, it remains
+there until you tell it otherwise. This means that changes checked in
+from the working copy will add new revisions on that branch, while
+leaving the main trunk and other branches unaffected.
+
+ To find out what branch a working copy is on, you can use the
+`status' command. In its output, look for the field named `Sticky tag'
+(*note Sticky tags::) - that's CVS's way of telling you the branch, if
+any, of the current working files:
+
+ $ 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 /u/cvsroot/yoyodyne/tc/driver.c,v
+ Sticky Tag: rel-1-0-patches (branch: 1.7.2)
+ Sticky Date: (none)
+ Sticky Options: (none)
+
+ Existing Tags:
+ rel-1-0-patches (branch: 1.7.2)
+ rel-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 /u/cvsroot/yoyodyne/tc/backend.c,v
+ Sticky Tag: rel-1-0-patches (branch: 1.4.2)
+ Sticky Date: (none)
+ Sticky Options: (none)
+
+ Existing Tags:
+ rel-1-0-patches (branch: 1.4.2)
+ rel-1-0 (revision: 1.4)
+ rel-0-4 (revision: 1.4)
+
+ Don't be confused by the fact that the branch numbers for each file
+are different (`1.7.2' and `1.4.2' respectively). The branch tag is the
+same, `rel-1-0-patches', and the files are indeed on the same branch.
+The numbers simply reflect the point in each file's revision history at
+which the branch was made. In the above example, one can deduce that
+`driver.c' had been through more changes than `backend.c' before this
+branch was created.
+
+ See *note Branches and revisions:: for details about how branch
+numbers are constructed.
+
+
+File: cvs.info, Node: Branches and revisions, Next: Magic branch numbers,
Prev: Accessing branches, Up: Branching and merging
+
+5.4 Branches and revisions
+==========================
+
+Ordinarily, a file's revision history is a linear series of increments
+(*note Revision numbers::):
+
+ +-----+ +-----+ +-----+ +-----+ +-----+
+ ! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 !
+ +-----+ +-----+ +-----+ +-----+ +-----+
+
+ However, CVS is not limited to linear development. The "revision
+tree" can be split into "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 "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.
+
+ 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.
+
+ +-------------+
+ 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.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 !
+ +---------+ +---------+ +---------+
+
+ 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 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 CVS (*note Magic branch
+numbers::). The branch 1.1.1 has a special meaning. *Note Tracking
+sources::.
+
+
+File: cvs.info, Node: Magic branch numbers, Next: Merging a branch, Prev:
Branches and revisions, Up: Branching and merging
+
+5.5 Magic branch numbers
+========================
+
+This section describes a CVS feature called "magic branches". For most
+purposes, you need not worry about magic branches; CVS handles them for
+you. However, they are visible to you in certain circumstances, so it
+may be useful to have some idea of how it works.
+
+ Externally, branch numbers consist of an odd number of dot-separated
+decimal integers. *Note Revision numbers::. That is not the whole
+truth, however. For efficiency reasons CVS sometimes inserts an extra 0
+in the second rightmost position (1.2.4 becomes 1.2.0.4, 8.9.10.11.12
+becomes 8.9.10.11.0.12 and so on).
+
+ CVS does a pretty good job at hiding these so called magic branches,
+but in a few places the hiding is incomplete:
+
+ * The magic branch number appears in the output from `cvs log'.
+
+ * You cannot specify a symbolic branch name to `cvs admin'.
+
+ You can use the `admin' command to reassign a symbolic name to a
+branch the way RCS expects it to be. If `R4patches' is assigned to the
+branch 1.4.2 (magic branch number 1.4.0.2) in file `numbers.c' you can
+do this:
+
+ $ cvs admin -NR4patches:1.4.2 numbers.c
+
+ 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).
+
+
+File: cvs.info, Node: Merging a branch, Next: Merging more than once, Prev:
Magic branch numbers, Up: Branching and merging
+
+5.6 Merging an entire branch
+============================
+
+You can merge changes made on a branch into your working copy by giving
+the `-j BRANCHNAME' flag to the `update' subcommand. With one `-j
+BRANCHNAME' option it merges the changes made between the greatest
+common ancestor (GCA) of the branch and the destination revision (in the
+simple case below the GCA is the point where the branch forked) and the
+newest revision on that branch into your working copy.
+
+ The `-j' stands for "join".
+
+ Consider this revision tree:
+
+ +-----+ +-----+ +-----+ +-----+
+ ! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 ! <- The main trunk
+ +-----+ +-----+ +-----+ +-----+
+ !
+ !
+ ! +---------+ +---------+
+ Branch R1fix -> +---! 1.2.2.1 !----! 1.2.2.2 !
+ +---------+ +---------+
+
+The branch 1.2.2 has been given the tag (symbolic name) `R1fix'. The
+following example assumes that the module `mod' contains only one file,
+`m.c'.
+
+ $ cvs checkout mod # Retrieve the latest revision, 1.4
+
+ $ cvs update -j R1fix m.c # Merge all changes made on the branch,
+ # i.e. the changes between revision 1.2
+ # and 1.2.2.2, into your working copy
+ # of the file.
+
+ $ cvs commit -m "Included R1fix" # Create revision 1.5.
+
+ A conflict can result from a merge operation. If that happens, you
+should resolve it before committing the new revision. *Note Conflicts
+example::.
+
+ If your source files contain keywords (*note Keyword substitution::),
+you might be getting more conflicts than strictly necessary. See *note
+Merging and keywords::, for information on how to avoid this.
+
+ The `checkout' command also supports the `-j BRANCHNAME' flag. The
+same effect as above could be achieved with this:
+
+ $ cvs checkout -j R1fix mod
+ $ cvs commit -m "Included R1fix"
+
+ It should be noted that `update -j TAGNAME' will also work but may
+not produce the desired result. *Note Merging adds and removals::, for
+more.
+
+
+File: cvs.info, Node: Merging more than once, Next: Merging two revisions,
Prev: Merging a branch, Up: Branching and merging
+
+5.7 Merging from a branch several times
+=======================================
+
+Continuing our example, the revision tree now looks like this:
+
+ +-----+ +-----+ +-----+ +-----+ +-----+
+ ! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 ! <- The main trunk
+ +-----+ +-----+ +-----+ +-----+ +-----+
+ ! *
+ ! *
+ ! +---------+ +---------+
+ Branch R1fix -> +---! 1.2.2.1 !----! 1.2.2.2 !
+ +---------+ +---------+
+
+where the starred line represents the merge from the `R1fix' branch to
+the main trunk, as just discussed.
+
+ Now suppose that development continues on the `R1fix' branch:
+
+ +-----+ +-----+ +-----+ +-----+ +-----+
+ ! 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 !
+ +---------+ +---------+ +---------+
+
+and then you want to merge those new changes onto the main trunk. If
+you just use the `cvs update -j R1fix m.c' command again, 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 `-j' options, and CVS merges the changes from
+the first revision to the second revision. For example, in this case
+the simplest way would be
+
+ cvs update -j 1.2.2.2 -j R1fix m.c # Merge changes from 1.2.2.2 to the
+ # head of the R1fix branch
+
+ 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:
+
+ cvs update -j R1fix:yesterday -j R1fix m.c
+
+ Better yet, tag the R1fix branch after every merge into the trunk,
+and then use that tag for subsequent merges:
+
+ cvs update -j merged_from_R1fix_to_trunk -j R1fix m.c
+
+
+File: cvs.info, Node: Merging two revisions, Next: Merging adds and
removals, Prev: Merging more than once, Up: Branching and merging
+
+5.8 Merging differences between any two revisions
+=================================================
+
+With two `-j REVISION' flags, the `update' (and `checkout') command can
+merge the differences between any two revisions into your working file.
+
+ $ cvs update -j 1.5 -j 1.3 backend.c
+
+will undo 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. You almost always use symbolic tags rather
+than revision numbers when operating on multiple files.
+
+ Specifying two `-j' options can also undo file removals or additions.
+ For example, suppose you have a file named `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:
+
+ $ cvs update -j 1.2 -j 1.1 file1
+ U file1
+ $ 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
+ $
+
+
+File: cvs.info, Node: Merging adds and removals, Next: Merging and keywords,
Prev: Merging two revisions, Up: Branching and merging
+
+5.9 Merging can add or remove files
+===================================
+
+If the changes which you are merging involve removing or adding some
+files, `update -j' will reflect such additions or removals.
+
+ For example:
+ cvs update -A
+ touch a b c
+ cvs add a b c ; cvs ci -m "added" a b c
+ cvs tag -b branchtag
+ cvs update -r branchtag
+ touch d ; cvs add d
+ rm a ; cvs rm a
+ cvs ci -m "added d, removed a"
+ cvs update -A
+ cvs update -jbranchtag
+
+ After these commands are executed and a `cvs commit' is done, file
+`a' will be removed and file `d' added in the main branch.
+
+ Note that using a single static tag (`-j TAGNAME') rather than a
+dynamic tag (`-j BRANCHNAME') to merge changes from a branch will
+usually not remove files which were removed on the branch since CVS does
+not automatically add static tags to dead revisions. The exception to
+this rule occurs when a static tag has been attached to a dead revision
+manually. Use the branch tag to merge all changes from the branch or
+use two static tags as merge endpoints to be sure that all intended
+changes are propagated in the merge.
+
+
+File: cvs.info, Node: Merging and keywords, Prev: Merging adds and removals,
Up: Branching and merging
+
+5.10 Merging and keywords
+=========================
+
+If you merge files containing keywords (*note Keyword substitution::),
+you will normally get numerous conflicts during the merge, because the
+keywords are expanded differently in the revisions which you are
+merging.
+
+ Therefore, you will often want to specify the `-kk' (*note
+Substitution modes::) switch to the merge command line. By substituting
+just the name of the keyword, not the expanded value of that keyword,
+this option ensures that the revisions which you are merging will be the
+same as each other, and avoid spurious conflicts.
+
+ For example, suppose you have a file like this:
+
+ +---------+
+ _! 1.1.2.1 ! <- br1
+ / +---------+
+ /
+ /
+ +-----+ +-----+
+ ! 1.1 !----! 1.2 !
+ +-----+ +-----+
+
+and your working directory is currently on the trunk (revision 1.2).
+Then you might get the following results from a merge:
+
+ $ cat file1
+ key $Revision: 1.1 $
+ . . .
+ $ cvs update -j br1
+ U file1
+ RCS file: /cvsroot/first-dir/file1,v
+ retrieving revision 1.1
+ retrieving revision 1.1.2.1
+ Merging differences between 1.1 and 1.1.2.1 into file1
+ rcsmerge: warning: conflicts during merge
+ $ cat file1
+ <<<<<<< file1
+ key $Revision: 1.1 $
+ =======
+ key $Revision: 1.1 $
+ >>>>>>> 1.1.2.1
+ . . .
+
+ What happened was that the merge tried to merge the differences
+between 1.1 and 1.1.2.1 into your working directory. So, since the
+keyword changed from `Revision: 1.1' to `Revision: 1.1.2.1', CVS tried
+to merge that change into your working directory, which conflicted with
+the fact that your working directory had contained `Revision: 1.2'.
+
+ Here is what happens if you had used `-kk':
+
+ $ cat file1
+ key $Revision: 1.1 $
+ . . .
+ $ cvs update -kk -j br1
+ U file1
+ RCS file: /cvsroot/first-dir/file1,v
+ retrieving revision 1.1
+ retrieving revision 1.1.2.1
+ Merging differences between 1.1 and 1.1.2.1 into file1
+ $ cat file1
+ key $Revision: 1.1 $
+ . . .
+
+ What is going on here is that revision 1.1 and 1.1.2.1 both expand as
+plain `Revision', and therefore merging the changes between them into
+the working directory need not change anything. Therefore, there is no
+conflict.
+
+ *WARNING: In versions of CVS prior to 1.12.2, there was a major
+problem with using `-kk' on merges. Namely, `-kk' overrode any default
+keyword expansion mode set in the archive file in the repository. This
+could, unfortunately for some users, cause data corruption in binary
+files (with a default keyword expansion mode set to `-kb'). Therefore,
+when a repository contained binary files, conflicts had to be dealt with
+manually rather than using `-kk' in a merge command.*
+
+ In CVS version 1.12.2 and later, the keyword expansion mode provided
+on the command line to any CVS command no longer overrides the `-kb'
+keyword expansion mode setting for binary files, though it will still
+override other default keyword expansion modes. You can now safely
+merge using `-kk' to avoid spurious conflicts on lines containing RCS
+keywords, even when your repository contains binary files.
+
+
+File: cvs.info, Node: Recursive behavior, Next: Adding and removing, Prev:
Branching and merging, Up: Top
+
+6 Recursive behavior
+********************
+
+Almost all of the subcommands of CVS work recursively when you specify a
+directory as an argument. For instance, consider this directory
+structure:
+
+ `$HOME'
+ |
+ +--tc
+ | |
+ +--CVS
+ | (internal CVS files)
+ +--Makefile
+ +--backend.c
+ +--driver.c
+ +--frontend.c
+ +--parser.c
+ +--man
+ | |
+ | +--CVS
+ | | (internal CVS files)
+ | +--tc.1
+ |
+ +--testing
+ |
+ +--CVS
+ | (internal CVS files)
+ +--testpgm.t
+ +--test2.t
+
+If `tc' is the current working directory, the following is true:
+
+ * `cvs update testing' is equivalent to
+
+ cvs update testing/testpgm.t testing/test2.t
+
+ * `cvs update testing man' updates all files in the subdirectories
+
+ * `cvs update .' or just `cvs update' updates all files in the `tc'
+ directory
+
+ If no arguments are given to `update' it will update all files in the
+current working directory and all its subdirectories. In other words,
+`.' is a default argument to `update'. This is also true for most of
+the CVS subcommands, not only the `update' command.
+
+ The recursive behavior of the CVS subcommands can be turned off with
+the `-l' option. Conversely, the `-R' option can be used to force
+recursion if `-l' is specified in `~/.cvsrc' (*note ~/.cvsrc::).
+
+ $ cvs update -l # Don't update files in subdirectories
+
+
+File: cvs.info, Node: Adding and removing, Next: History browsing, Prev:
Recursive behavior, Up: Top
+
+7 Adding, removing, and renaming files and directories
+******************************************************
+
+In the course of a project, one will often add new files. Likewise with
+removing or renaming, or with directories. The general concept to keep
+in mind in all these cases is that instead of making an irreversible
+change you want CVS to record the fact that a change has taken place,
+just as with modifying an existing file. The exact mechanisms to do
+this in CVS vary depending on the situation.
+
+* Menu:
+
+* Adding files:: Adding files
+* Removing files:: Removing files
+* Removing directories:: Removing directories
+* Moving files:: Moving and renaming files
+* Moving directories:: Moving and renaming directories
+
+
+File: cvs.info, Node: Adding files, Next: Removing files, Up: Adding and
removing
+
+7.1 Adding files to a directory
+===============================
+
+To add a new file to a directory, follow these steps.
+
+ * You must have a working copy of the directory. *Note Getting the
+ source::.
+
+ * Create the new file inside your working copy of the directory.
+
+ * Use `cvs add FILENAME' to tell CVS that you want to version control
+ the file. If the file contains binary data, specify `-kb' (*note
+ Binary files::).
+
+ * Use `cvs commit FILENAME' to actually check in the file into the
+ repository. Other developers cannot see the file until you perform
+ this step.
+
+ You can also use the `add' command to add a new directory.
+
+ Unlike most other commands, the `add' command is not recursive. You
+cannot even type `cvs add foo/bar'! Instead, you have to
+
+ $ cd foo
+ $ cvs add bar
+
+ -- Command: cvs add [`-k' kflag] [`-m' message] files ...
+ Schedule FILES to be added to the repository. The files or
+ directories specified with `add' must already exist in the current
+ directory. To add a whole new directory hierarchy to the source
+ repository (for example, files received from a third-party vendor),
+ use the `import' command instead. *Note import::.
+
+ The added files are not placed in the source repository until you
+ use `commit' to make the change permanent. Doing an `add' on a
+ file that was removed with the `remove' command will undo the
+ effect of the `remove', unless a `commit' command intervened.
+ *Note Removing files::, for an example.
+
+ The `-k' option specifies the default way that this file will be
+ checked out; for more information see *note Substitution modes::.
+
+ The `-m' option specifies a description for the file. This
+ description appears in the history log (if it is enabled, *note
+ history file::). It will also be saved in the version history
+ inside the repository when the file is committed. The `log'
+ command displays this description. The description can be changed
+ using `admin -t'. *Note admin::. If you omit the `-m DESCRIPTION'
+ flag, an empty string will be used. You will not be prompted for a
+ description.
+
+ For example, the following commands add the file `backend.c' to the
+repository:
+
+ $ cvs add backend.c
+ $ cvs commit -m "Early version. Not yet compilable." backend.c
+
+ When you add a file it is added only on the branch which you are
+working on (*note Branching and merging::). You can later merge the
+additions to another branch if you want (*note Merging adds and
+removals::).
+
+
+File: cvs.info, Node: Removing files, Next: Removing directories, Prev:
Adding files, Up: Adding and removing
+
+7.2 Removing files
+==================
+
+Directories change. New files are added, and old files disappear.
+Still, you want to be able to retrieve an exact copy of old releases.
+
+ Here is what you can do to remove a file, but remain able to retrieve
+old revisions:
+
+ * Make sure that you have not made any uncommitted modifications to
+ the file. *Note Viewing differences::, for one way to do that.
+ You can also use the `status' or `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.
+
+ * Remove the file from your working copy of the directory. You can
+ for instance use `rm'.
+
+ * Use `cvs remove FILENAME' to tell CVS that you really want to
+ delete the file.
+
+ * Use `cvs commit FILENAME' to actually perform the removal of the
+ file from the repository.
+
+ When you commit the removal of the file, 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 `-r' and `-D' options specified to `checkout' or `update'.
+
+ -- Command: cvs remove [options] files ...
+ 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. For a full list of
+ options, see *note Invoking CVS::.
+
+ Here is an example of removing several files:
+
+ $ 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 .
+
+ As a convenience you can remove the file and `cvs remove' it in one
+step, by specifying the `-f' option. For example, the above example
+could also be done like this:
+
+ $ cd test
+ $ cvs remove -f *.c
+ 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 .
+
+ If you execute `remove' for a file, and then change your mind before
+you commit, you can undo the `remove' with an `add' command.
+
+ $ 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
+
+ If you realize your mistake before you run the `remove' command you
+can use `update' to resurrect the file:
+
+ $ rm oj.c
+ $ cvs update oj.c
+ cvs update: warning: oj.c was lost
+ U oj.c
+
+ When you remove a file it is removed only on the branch which you are
+working on (*note Branching and merging::). You can later merge the
+removals to another branch if you want (*note Merging adds and
+removals::).
+
+
+File: cvs.info, Node: Removing directories, Next: Moving files, Prev:
Removing files, Up: Adding and removing
+
+7.3 Removing directories
+========================
+
+In concept removing directories is somewhat similar to removing
+files--you want the directory to not exist in your current working
+directories, but you also want to be able to retrieve old releases in
+which the directory existed.
+
+ The way that you remove a directory is to remove all the files in it.
+ You don't remove the directory itself; there is no way to do that.
+Instead you specify the `-P' option to `cvs update' or `cvs checkout',
+which will cause CVS to remove empty directories from working
+directories. (Note that `cvs export' always removes empty directories.)
+ Probably the best way to do this is to always specify `-P'; if you want
+an empty directory then put a dummy file (for example `.keepme') in it
+to prevent `-P' from removing it.
+
+ Note that `-P' is implied by the `-r' or `-D' options of `checkout'.
+This way CVS will be able to correctly create the directory or not
+depending on whether the particular version you are checking out
+contains any files in that directory.
+
+
+File: cvs.info, Node: Moving files, Next: Moving directories, Prev:
Removing directories, Up: Adding and removing
+
+7.4 Moving and renaming files
+=============================
+
+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. *Note Moving directories::.).
+
+ The examples below assume that the file OLD is renamed to NEW.
+
+* Menu:
+
+* Outside:: The normal way to Rename
+* Inside:: A tricky, alternative way
+* Rename by copying:: Another tricky, alternative way
+
+
+File: cvs.info, Node: Outside, Next: Inside, Up: Moving files
+
+7.4.1 The Normal way to Rename
+------------------------------
+
+The normal way to move a file is to copy OLD to NEW, and then issue the
+normal CVS commands to remove OLD from the repository, and add NEW to
+it.
+
+ $ mv OLD NEW
+ $ cvs remove OLD
+ $ cvs add NEW
+ $ cvs commit -m "Renamed OLD to NEW" OLD NEW
+
+ 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, `cvs log
+OLD' will give the log up until the time of the rename.
+
+ When NEW is committed its revision numbers will start again, usually
+at 1.1, so if that bothers you, use the `-r rev' option to commit. For
+more information see *note Assigning revisions::.
+
+
+File: cvs.info, Node: Inside, Next: Rename by copying, Prev: Outside, Up:
Moving files
+
+7.4.2 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!
+
+ $ cd $CVSROOT/DIR
+ $ mv OLD,v NEW,v
+
+Advantages:
+
+ * The log of changes is maintained intact.
+
+ * The revision numbers are not affected.
+
+Disadvantages:
+
+ * Old releases cannot easily be fetched from the repository. (The
+ file will show up as NEW even in revisions from the time before it
+ was renamed).
+
+ * There is no log information of when the file was renamed.
+
+ * Nasty things might happen if someone accesses the history file
+ while you are moving it. Make sure no one else runs any of the CVS
+ commands while you move it.
+
+
+File: cvs.info, Node: Rename by copying, Prev: Inside, Up: Moving files
+
+7.4.3 Copying the history file
+------------------------------
+
+This way also involves direct modifications to the repository. It is
+safe, but not without drawbacks.
+
+ # Copy the RCS file inside the repository
+ $ cd $CVSROOT/DIR
+ $ cp OLD,v NEW,v
+ # Remove the old file
+ $ cd ~/DIR
+ $ rm OLD
+ $ cvs remove OLD
+ $ cvs commit OLD
+ # Remove all tags from NEW
+ $ cvs update NEW
+ $ cvs log NEW # Remember the non-branch tag names
+ $ cvs tag -d TAG1 NEW
+ $ cvs tag -d TAG2 NEW
+ ...
+
+ By removing the tags you will be able to check out old revisions.
+
+Advantages:
+
+ * Checking out old revisions works correctly, as long as you use
+ `-rTAG' and not `-DDATE' to retrieve the revisions.
+
+ * The log of changes is maintained intact.
+
+ * The revision numbers are not affected.
+
+Disadvantages:
+
+ * You cannot easily see the history of the file across the rename.
+
+
+File: cvs.info, Node: Moving directories, Prev: Moving files, Up: Adding
and removing
+
+7.5 Moving and renaming directories
+===================================
+
+The normal way to rename or move a directory is to rename or move each
+file within it as described in *note Outside::. Then check out with the
+`-P' option, as described in *note Removing directories::.
+
+ If you really want to hack the repository to rename or delete a
+directory in the repository, you can do it like this:
+
+ 1. Inform everyone who has a checked out copy of the directory that
+ the directory will be renamed. They should commit all their
+ changes, and remove their working copies, before you take the steps
+ below.
+
+ 2. Rename the directory inside the repository.
+
+ $ cd $CVSROOT/PARENT-DIR
+ $ mv OLD-DIR NEW-DIR
+
+ 3. Fix the CVS administrative files, if necessary (for instance if you
+ renamed an entire module).
+
+ 4. Tell everyone that they can check out again and continue working.
+
+ If someone had a working copy the 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.
+
+
+File: cvs.info, Node: History browsing, Next: Binary files, Prev: Adding
and removing, Up: Top
+
+8 History browsing
+******************
+
+Once you have used 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?
+
+
+File: cvs.info, Node: log messages, Next: history database, Up: History
browsing
+
+8.1 Log messages
+================
+
+Whenever you commit a file you specify a log message.
+
+ To look through the log messages which have been specified for every
+revision which has been committed, use the `cvs log' command (*note
+log::).
+
+
+File: cvs.info, Node: history database, Next: user-defined logging, Prev:
log messages, Up: History browsing
+
+8.2 The history database
+========================
+
+You can use the history file (*note history file::) to log various CVS
+actions. To retrieve the information from the history file, use the
+`cvs history' command (*note history::).
+
+ Note: you can control what is logged to this file by using the
+`LogHistory' keyword in the `CVSROOT/config' file (*note config::).
+
+
+File: cvs.info, Node: user-defined logging, Next: annotate, Prev: history
database, Up: History browsing
+
+8.3 User-defined logging
+========================
+
+You can customize 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 `loginfo' file (*note loginfo::). To log
+commits, checkouts, exports, and tags, respectively, you can also use
+the `-i', `-o', `-e', and `-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 `cvs
+watch add' command (*note Getting Notified::); this command is useful
+even if you are not using `cvs watch on'.
+
+ The `taginfo' file defines programs to execute when someone executes
+a `tag' or `rtag' command. The `taginfo' file has the standard form for
+administrative files (*note 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 TAGNAME, OPERATION (`add' for
+`tag', `mov' for `tag -F', and `del' for `tag -d'), REPOSITORY, and any
+remaining are pairs of FILENAME REVISION. A non-zero exit of the filter
+program will cause the tag to be aborted.
+
+ Here is an example of using taginfo to log tag and rtag commands. In
+the taginfo file put:
+
+ ALL /usr/local/cvsroot/CVSROOT/loggit
+
+Where `/usr/local/cvsroot/CVSROOT/loggit' contains the following script:
+
+ #!/bin/sh
+ echo "$@" >>/home/kingdon/cvsroot/CVSROOT/taglog
+
+
+File: cvs.info, Node: annotate, Prev: user-defined logging, Up: History
browsing
+
+8.4 Annotate command
+====================
+
+ -- Command: cvs annotate [`-FflR'] [`-r rev'|`-D date'] files ...
+ For each file in FILES, print the head revision of the trunk,
+ together with information on the last modification for each line.
+ For 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
+
+ The file `ssfile' currently contains two lines. The `ssfile line
+ 1' line was checked in by `mary' on March 27. Then, on March 28,
+ `joe' added a line `ssfile line 2', without modifying the `ssfile
+ line 1' line. This report doesn't tell you anything about lines
+ which have been deleted or replaced; you need to use `cvs diff' for
+ that (*note diff::).
+
+ The options to `cvs annotate' are listed in *note Invoking CVS::, and
+can be used to select the files and revisions to annotate. The options
+are described in more detail there and in *note Common options::.
+
+
+File: cvs.info, Node: Binary files, Next: Multiple developers, Prev:
History browsing, Up: Top
+
+9 Handling binary files
+***********************
+
+The most common use for CVS is to store text files. With text files,
+CVS can merge revisions, display the differences between revisions in a
+human-visible fashion, and other such operations. However, if you are
+willing to give up a few of these abilities, CVS can store binary files.
+ For example, one might store a web site in CVS including both text
+files and binary images.
+
+* Menu:
+
+* Binary why:: More details on issues with binary files
+* Binary howto:: How to store them
+
+
+File: cvs.info, Node: Binary why, Next: Binary howto, Up: Binary files
+
+9.1 The issues with binary files
+================================
+
+While the need to manage binary files may seem obvious if the files that
+you customarily work with are binary, putting them into version control
+does present some additional issues.
+
+ One basic function of version control is to show the differences
+between two revisions. For example, if someone else checked in a new
+version of a file, you may wish to look at what they changed and
+determine whether their changes are good. For text files, CVS provides
+this functionality via the `cvs diff' command. For binary files, it may
+be possible to extract the two revisions and then compare them with a
+tool external to CVS (for example, word processing software often has
+such a feature). If there is no such tool, one must track changes via
+other mechanisms, such as urging people to write good log messages, and
+hoping that the changes they actually made were the changes that they
+intended to make.
+
+ Another ability of a version control system is the ability to merge
+two revisions. For CVS this happens in two contexts. The first is when
+users make changes in separate working directories (*note Multiple
+developers::). The second is when one merges explicitly with the
+`update -j' command (*note Branching and merging::).
+
+ In the case of text files, CVS can merge changes made independently,
+and signal a conflict if the changes conflict. With binary files, the
+best that CVS can do is present the two different copies of the file,
+and leave it to the user to resolve the conflict. The user may choose
+one copy or the other, or may run an external merge tool which knows
+about that particular file format, if one exists. Note that having the
+user merge relies primarily on the user to not accidentally omit some
+changes, and thus is potentially error prone.
+
+ If this process is thought to be undesirable, the best choice may be
+to avoid merging. To avoid the merges that result from separate working
+directories, see the discussion of reserved checkouts (file locking) in
+*note Multiple developers::. To avoid the merges resulting from
+branches, restrict use of branches.
+
+
+File: cvs.info, Node: Binary howto, Prev: Binary why, Up: Binary files
+
+9.2 How to store binary files
+=============================
+
+There are two issues with using CVS to store binary files. The first is
+that CVS by default converts 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 (*note Keyword substitution::), so keyword
+expansion must be turned off.
+
+ The `-kb' option available with some CVS commands insures that
+neither line ending conversion nor keyword expansion will be done.
+
+ Here is an example of how you can create a new file using the `-kb'
+flag:
+
+ $ echo '$Id: cvs.info-1,v 1.1 2009/04/26 18:37:21 pertusus Exp $' > kotest
+ $ cvs add -kb -m"A test file" kotest
+ $ cvs ci -m"First checkin; contains a keyword" kotest
+
+ If a file accidentally gets added without `-kb', one can use the `cvs
+admin' command to recover. For example:
+
+ $ echo '$Id: cvs.info-1,v 1.1 2009/04/26 18:37:21 pertusus Exp $' > 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
+ # For non-unix systems:
+ # Copy in a good copy of the file from outside CVS
+ $ cvs commit -m "make it binary" kotest
+
+ When you check in the file `kotest' the file is not preserved as a
+binary file, because you did not check it in as a binary file. The `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.
+If you need to cope with line endings (that is, you are using CVS on a
+non-unix system), then you need to check in a new copy of the file, as
+shown by the `cvs commit' command above. On unix, the `cvs update -A'
+command suffices. (Note that you can use `cvs log' to determine the
+default keyword substitution method for a file and `cvs status' to
+determine the keyword substitution method for a working copy.)
+
+ However, in using `cvs admin -k' to change the keyword expansion, be
+aware that the keyword expansion mode is not version controlled. This
+means that, for example, that if you have a text file in old releases,
+and a binary file with the same name in new releases, CVS provides no
+way to check out the file in text or binary mode depending on what
+version you are checking out. There is no good workaround for this
+problem.
+
+ You can also set a default for whether `cvs add' and `cvs import'
+treat a file as binary based on its name; for example you could say that
+files who names end in `.exe' are binary. *Note Wrappers::. There is
+currently no way to have CVS detect whether a file is binary based on
+its contents. The main difficulty with designing such a feature is that
+it is not clear how to distinguish between binary and non-binary files,
+and the rules to apply would vary considerably with the operating
+system.
+
+
+File: cvs.info, Node: Multiple developers, Next: Revision management, Prev:
Binary files, Up: Top
+
+10 Multiple developers
+**********************
+
+When more than one person works on a software project things often get
+complicated. Often, two people try to edit the same file
+simultaneously. One solution, known as "file locking" or "reserved
+checkouts", is to allow only one person to edit each file at a time.
+This is the only solution with some version control systems, including
+RCS and SCCS. Currently the usual way to get reserved checkouts with
+CVS is the `cvs admin -l' command (*note admin options::). This is not
+as nicely integrated into CVS as the watch features, described below,
+but it seems that most people with a need for reserved checkouts find it
+adequate. It also may be possible to use the watches features described
+below, together with suitable procedures (not enforced by software), to
+avoid having two people edit at the same time.
+
+ The default model with CVS is known as "unreserved checkouts". In
+this model, developers can edit their own "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 CVS commands to bring their working copy up to date with the
+repository revision. This process is almost automatic.
+
+ CVS also supports mechanisms which facilitate various kinds of
+communication, without actually enforcing rules like reserved checkouts
+do.
+
+ The rest of this chapter describes how these various models work, and
+some of the issues involved in choosing between them.
+
+* 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
+* Choosing a model:: Reserved or unreserved checkouts?
+
+
+File: cvs.info, Node: File status, Next: Updating a file, Up: Multiple
developers
+
+10.1 File status
+================
+
+Based on what operations you have performed on a checked out file, and
+what operations others have performed to that file in the repository,
+one can classify a file in a number of states. The states, as reported
+by the `status' command, are:
+
+Up-to-date
+ The file is identical with the latest revision in the repository
+ for the branch in use.
+
+Locally Modified
+ You have edited the file, and not yet committed your changes.
+
+Locally Added
+ You have added the file with `add', and not yet committed your
+ changes.
+
+Locally Removed
+ You have removed the file with `remove', and not yet committed your
+ changes.
+
+Needs Checkout
+ Someone else has committed a newer revision to the repository. The
+ name is slightly misleading; you will ordinarily use `update'
+ rather than `checkout' to get that newer revision.
+
+Needs Patch
+ Like Needs Checkout, but the CVS server will send a patch rather
+ than the entire file. Sending a patch or sending an entire file
+ accomplishes the same thing.
+
+Needs Merge
+ Someone else has committed a newer revision to the repository, and
+ you have also made modifications to the file.
+
+Unresolved Conflict
+ A file with the same name as this new file has been added to the
+ repository from a second workspace. This file will need to be
+ moved out of the way to allow an `update' to complete.
+
+File had conflicts on merge
+ This is like Locally Modified, except that a previous `update'
+ command gave a conflict. If you have not already done so, you need
+ to resolve the conflict as described in *note Conflicts example::.
+
+Unknown
+ CVS doesn't know anything about this file. For example, you have
+ created a new file and have not run `add'.
+
+ To help clarify the file status, `status' also reports the `Working
+revision' which is the revision that the file in the working directory
+derives from, and the `Repository revision' which is the latest revision
+in the repository for the branch in use.
+
+ The options to `status' are listed in *note Invoking CVS::. For
+information on its `Sticky tag' and `Sticky date' output, see *note
+Sticky tags::. For information on its `Sticky options' output, see the
+`-k' option in *note update options::.
+
+ You can think of the `status' and `update' commands as somewhat
+complementary. You use `update' to bring your files up to date, and you
+can use `status' to give you some idea of what an `update' would do (of
+course, the state of the repository might change before you actually run
+`update'). In fact, if you want a command to display file status in a
+more brief format than is displayed by the `status' command, you can
+invoke
+
+ $ cvs -n -q update
+
+ The `-n' option means to not actually do the update, but merely to
+display statuses; the `-q' option avoids printing the name of each
+directory. For more information on the `update' command, and these
+options, see *note Invoking CVS::.
+
+
+File: cvs.info, Node: Updating a file, Next: Conflicts example, Prev: File
status, Up: Multiple developers
+
+10.2 Bringing a file up to date
+===============================
+
+When you want to update or merge a file, use the `update' command. For
+files that are not up to date this is roughly equivalent to a `checkout'
+command: the newest revision of the file is extracted from the
+repository and put in your working directory.
+
+ Your modifications to a file are never lost when you use `update'.
+If no newer revision exists, running `update' has no effect. If you
+have edited the file, and a newer revision is available, 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 `update' on the file now,
+CVS will incorporate all changes between revision 1.4 and 1.6 into your
+file.
+
+ If any of the changes between 1.4 and 1.6 were made too close to any
+of the changes you have made, an "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. *Note update::, for a
+complete description of the `update' command.
+
+
+File: cvs.info, Node: Conflicts example, Next: Informing others, Prev:
Updating a file, Up: Multiple developers
+
+10.3 Conflicts example
+======================
+
+Suppose revision 1.4 of `driver.c' contains this:
+
+ #include <stdio.h>
+
+ void main()
+ {
+ parse();
+ if (nerr == 0)
+ gencode();
+ else
+ fprintf(stderr, "No code generated.\n");
+ exit(nerr == 0 ? 0 : 1);
+ }
+
+Revision 1.6 of `driver.c' contains this:
+
+ #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);
+ }
+
+Your working copy of `driver.c', based on revision 1.4, contains this
+before you run `cvs update':
+
+ #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);
+ }
+
+You run `cvs update':
+
+ $ 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
+
+CVS tells you that there were some conflicts. Your original working
+file is saved unmodified in `.#driver.c.1.4'. The new version of
+`driver.c' contains this:
+
+ #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
+ }
+
+Note how all non-overlapping modifications are incorporated in your
+working copy, and that the overlapping section is clearly marked with
+`<<<<<<<', `=======' and `>>>>>>>'.
+
+ You resolve the conflict by editing the file, removing the markers
+and the erroneous line. Suppose you end up with this file:
+ #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);
+ }
+
+You can now go ahead and commit this as revision 1.7.
+
+ $ 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
+
+ For your protection, CVS will refuse to check in a file if a conflict
+occurred and you have not resolved the conflict. Currently to resolve a
+conflict, you must change the timestamp on the file. In previous
+versions of CVS, you also needed to insure that the file contains no
+conflict markers. Because your file may legitimately contain conflict
+markers (that is, occurrences of `>>>>>>> ' at the start of a line that
+don't mark a conflict), the current version of CVS will print a warning
+and proceed to check in the file.
+
+ If you use release 1.04 or later of pcl-cvs (a GNU Emacs front-end
+for CVS) you can use an Emacs package called emerge to help you resolve
+conflicts. See the documentation for pcl-cvs.
+
+
+File: cvs.info, Node: Informing others, Next: Concurrency, Prev: Conflicts
example, Up: Multiple developers
+
+10.4 Informing others about commits
+===================================
+
+It is often useful to inform others when you commit a new revision of a
+file. The `-i' option of the `modules' file, or the `loginfo' file, can
+be used to automate this process. *Note modules::. *Note loginfo::.
+You can use these features of CVS to, for instance, instruct CVS to mail
+a message to all developers, or post a message to a local newsgroup.
+
+
+File: cvs.info, Node: Concurrency, Next: Watches, Prev: Informing others,
Up: Multiple developers
+
+10.5 Several developers simultaneously attempting to run CVS
+============================================================
+
+If several developers try to run CVS at the same time, one may get the
+following message:
+
+ [11:43:23] waiting for bach's lock in /usr/local/cvsroot/foo
+
+ 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 in the repository directory
+mentioned in the message and remove files which they own whose names
+start with `#cvs.rfl', `#cvs.wfl', or `#cvs.lock'.
+
+ Note that these locks are to protect CVS's internal data structures
+and have no relationship to the word "lock" in the sense used by
+RCS--which refers to reserved checkouts (*note Multiple developers::).
+
+ 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.
+
+ One might hope for the following property:
+
+ 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.
+
+but CVS does _not_ have this property. For example, given the files
+
+ a/one.c
+ a/two.c
+ b/three.c
+ b/four.c
+
+if someone runs
+
+ cvs ci a/two.c b/three.c
+
+and someone else runs `cvs update' at the same time, the person running
+`update' might get only the change to `b/three.c' and not the change to
+`a/two.c'.
+
+
+File: cvs.info, Node: Watches, Next: Choosing a model, Prev: Concurrency,
Up: Multiple developers
+
+10.6 Mechanisms to track who is editing files
+=============================================
+
+For many groups, use of 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 `cvs edit' (not `chmod') to
+make files read-write to edit them, and `cvs release' (not `rm') to
+discard a working directory which is no longer in use, but CVS is not
+able to enforce this behavior.
+
+* 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
+
+
+File: cvs.info, Node: Setting a watch, Next: Getting Notified, Up: Watches
+
+10.6.1 Telling CVS to watch certain files
+-----------------------------------------
+
+To enable the watch features, you first specify that certain files are
+to be watched.
+
+ -- Command: cvs watch on [`-lR'] [FILES]...
+ Specify that developers should run `cvs edit' before editing FILES.
+ CVS will create working copies of FILES read-only, to remind
+ developers to run the `cvs edit' command before working on them.
+
+ If 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 `-l' option
+ is given. The `-R' option can be used to force recursion if the
+ `-l' option is set in `~/.cvsrc' (*note ~/.cvsrc::).
+
+ If FILES is omitted, it defaults to the current directory.
+
+ -- Command: cvs watch off [`-lR'] [FILES]...
+ Do not create FILES read-only on checkout; thus, developers will
+ not be reminded to use `cvs edit' and `cvs unedit'.
+
+ The FILES and options are processed as for `cvs watch on'.
+
+
+File: cvs.info, Node: Getting Notified, Next: Editing files, Prev: Setting
a watch, Up: Watches
+
+10.6.2 Telling CVS to notify you
+--------------------------------
+
+You can tell CVS that you want to receive notifications about various
+actions taken on a file. You can do this without using `cvs watch on'
+for the file, but generally you will want to use `cvs watch on', to
+remind developers to use the `cvs edit' command.
+
+ -- Command: cvs watch add [`-lR'] [`-a' ACTION]... [FILES]...
+ Add the current user to the list of people to receive notification
+ of work done on FILES.
+
+ The `-a' option specifies what kinds of events CVS should notify
+ the user about. ACTION is one of the following:
+
+ `edit'
+ Another user has applied the `cvs edit' command (described
+ below) to a watched file.
+
+ `commit'
+ Another user has committed changes to one of the named FILES.
+
+ `unedit'
+ Another user has abandoned editing a file (other than by
+ committing changes). They can do this in several ways, by:
+
+ * applying the `cvs unedit' command (described below) to
+ the file
+
+ * applying the `cvs release' command (*note release::) to
+ the file's parent directory (or recursively to a
+ directory more than one level up)
+
+ * deleting the file and allowing `cvs update' to recreate
+ it
+
+ `all'
+ All of the above.
+
+ `none'
+ None of the above. (This is useful with `cvs edit', described
+ below.)
+
+ The `-a' option may appear more than once, or not at all. If
+ omitted, the action defaults to `all'.
+
+ The FILES and options are processed as for `cvs watch on'.
+
+ -- Command: cvs watch remove [`-lR'] [`-a' ACTION]... [FILES]...
+ Remove a notification request established using `cvs watch add';
+ the arguments are the same. If the `-a' option is present, only
+ watches for the specified actions are removed.
+
+ When the conditions exist for notification, CVS calls the `notify'
+administrative file. Edit `notify' as one edits the other
+administrative files (*note Intro administrative files::). This file
+follows the usual conventions for administrative files (*note syntax::),
+where each line is a regular expression followed by a command to
+execute. The command should contain a single occurrence of `%s' which
+will be replaced by the user to notify; the rest of the information
+regarding the notification will be supplied to the command on standard
+input. The standard thing to put in the `notify' file is the single
+line:
+
+ ALL mail %s -s "CVS notification"
+
+This causes users to be notified by electronic mail.
+
+ Note that if you set this up in the straightforward way, users
+receive notifications on the server machine. One could of course write
+a `notify' script which directed notifications elsewhere, but to make
+this easy, CVS allows you to associate a notification address for each
+user. To do so create a file `users' in `CVSROOT' with a line for each
+user in the format USER:VALUE. Then instead of passing the name of the
+user to be notified to `notify', CVS will pass the VALUE (normally an
+email address on some other machine).
+
+ CVS does not notify you for your own changes. Currently this check
+is done based on whether the user name of the person taking the action
+which triggers notification matches the user name of the person getting
+notification. In fact, in general, the watches features only track one
+edit by each user. It probably would be more useful if watches tracked
+each working directory separately, so this behavior might be worth
+changing.
+
+
+File: cvs.info, Node: Editing files, Next: Watch information, Prev: Getting
Notified, Up: Watches
+
+10.6.3 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 `cvs edit' command. Some systems call this
+a "checkout", but CVS uses that term for obtaining a copy of the sources
+(*note Getting the source::), an operation which those systems call a
+"get" or a "fetch".
+
+ -- Command: cvs edit [`-lR'] [`-a' ACTION]... [FILES]...
+ Prepare to edit the working files FILES. CVS makes the FILES
+ read-write, and notifies users who have requested `edit'
+ notification for any of FILES.
+
+ The `cvs edit' command accepts the same options as the `cvs watch
+ add' command, and establishes a temporary watch for the user on
+ FILES; CVS will remove the watch when FILES are `unedit'ed or
+ `commit'ted. If the user does not wish to receive notifications,
+ she should specify `-a none'.
+
+ The FILES and the options are processed as for the `cvs watch'
+ commands.
+
+ Normally when you are done with a set of changes, you use the `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 `cvs
+unedit' command.
+
+ -- Command: cvs unedit [`-lR'] [FILES]...
+ Abandon work on the working files FILES, and revert them to the
+ repository versions on which they are based. CVS makes those FILES
+ read-only for which users have requested notification using `cvs
+ watch on'. CVS notifies users who have requested `unedit'
+ notification for any of FILES.
+
+ The FILES and options are processed as for the `cvs watch'
+ commands.
+
+ If watches are not in use, the `unedit' command probably does not
+ work, and the way to revert to the repository version is with the
+ command `cvs update -C file' (*note update::). The meaning is not
+ precisely the same; the latter may also bring in some changes which
+ have been made in the repository since the last time you updated.
+
+ When using client/server CVS, you can use the `cvs edit' and `cvs
+unedit' commands even if CVS is unable to successfully communicate with
+the server; the notifications will be sent upon the next successful CVS
+command.
+
+
+File: cvs.info, Node: Watch information, Next: Watches Compatibility, Prev:
Editing files, Up: Watches
+
+10.6.4 Information about who is watching and editing
+----------------------------------------------------
+
+ -- Command: cvs watchers [`-lR'] [FILES]...
+ List the users currently watching changes to FILES. The report
+ includes the files being watched, and the mail address of each
+ watcher.
+
+ The FILES and options are processed as for the `cvs watch'
+ commands.
+
+ -- Command: cvs editors [`-lR'] [FILES]...
+ List the users currently working on 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 FILES and options are processed as for the `cvs watch'
+ commands.
+
+
+File: cvs.info, Node: Watches Compatibility, Prev: Watch information, Up:
Watches
+
+10.6.5 Using watches with old versions of CVS
+---------------------------------------------
+
+If you use the watch features on a repository, it creates `CVS'
+directories in the repository and stores the information about watches
+in that directory. If you attempt to use CVS 1.6 or earlier with the
+repository, you get an error message such as the following (all on one
+line):
+
+ cvs update: cannot open CVS/Entries for reading:
+ No such file or directory
+
+and your operation will likely be aborted. To use the watch features,
+you must upgrade all copies of CVS which use that repository in local or
+server mode. If you cannot upgrade, use the `watch off' and `watch
+remove' commands to remove all watches, and that will restore the
+repository to a state which CVS 1.6 can cope with.
+
+
+File: cvs.info, Node: Choosing a model, Prev: Watches, Up: Multiple
developers
+
+10.7 Choosing between reserved or unreserved checkouts
+======================================================
+
+Reserved and unreserved checkouts each have pros and cons. Let it be
+said that a lot of this is a matter of opinion or what works given
+different groups' working styles, but here is a brief description of
+some of the issues. There are many ways to organize a team of
+developers. CVS does not try to enforce a certain organization. It is
+a tool that can be used in several ways.
+
+ Reserved checkouts 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. Also, it is common for someone to
+take out a lock on a file, because they are planning to edit it, but
+then forget to release the lock.
+
+ People, especially people who are familiar with reserved checkouts,
+often wonder how often conflicts occur if unreserved checkouts are used,
+and how difficult they are to resolve. The experience with many groups
+is that they occur rarely and usually are relatively straightforward to
+resolve.
+
+ The rarity of serious conflicts may be surprising, until one realizes
+that they occur only when two developers disagree on the proper design
+for a given section of code; such a disagreement suggests that the team
+has not been communicating properly in the first place. In order to
+collaborate under _any_ source management regimen, developers must agree
+on the general design of the system; given this agreement, overlapping
+changes are usually straightforward to merge.
+
+ In some cases unreserved checkouts are clearly inappropriate. If no
+merge tool exists for the kind of file you are managing (for example
+word processor files or files edited by Computer Aided Design programs),
+and it is not desirable to change to a program which uses a mergeable
+data format, then resolving conflicts is going to be unpleasant enough
+that you generally will be better off to simply avoid the conflicts
+instead, by using reserved checkouts.
+
+ The watches features described above in *note Watches:: can be
+considered to be an intermediate model between reserved checkouts and
+unreserved checkouts. When you go to edit a file, it is possible to
+find out who else is editing it. And rather than having the system
+simply forbid both people editing the file, it can tell you what the
+situation is and let you figure out whether it is a problem in that
+particular case or not. Therefore, for some groups it can be considered
+the best of both the reserved checkout and unreserved checkout worlds.
+
+
+File: cvs.info, Node: Revision management, Next: Keyword substitution,
Prev: Multiple developers, Up: Top
+
+11 Revision management
+**********************
+
+If you have read this far, you probably have a pretty good grasp on what
+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 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
+
+
+File: cvs.info, Node: When to commit, Up: Revision management
+
+11.1 When to commit?
+====================
+
+Your group should decide which policy to use regarding commits. Several
+policies are possible, and as your experience with 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 (*note
+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.
+
+
+File: cvs.info, Node: Keyword substitution, Next: Tracking sources, Prev:
Revision management, Up: Top
+
+12 Keyword substitution
+***********************
+
+As long as you edit source files inside a working directory you can
+always find out the state of your files via `cvs status' and `cvs log'.
+But as soon as you export the files from your development environment it
+becomes harder to identify which revisions they are.
+
+ CVS can use a mechanism known as "keyword substitution" (or "keyword
+expansion") to help identifying the files. Embedded strings of the form
+`$KEYWORD$' and `$KEYWORD:...$' in a file are replaced with strings of
+the form `$KEYWORD:VALUE$' whenever you obtain a new revision of the
+file.
+
+* Menu:
+
+* Keyword list:: Keywords
+* Using keywords:: Using keywords
+* Avoiding substitution:: Avoiding substitution
+* Substitution modes:: Substitution modes
+* Configuring keyword expansion:: Configuring keyword expansion
+* Log keyword:: Problems with the $Log$ keyword.
+
+
+File: cvs.info, Node: Keyword list, Next: Using keywords, Up: Keyword
substitution
+
+12.1 Keyword List
+=================
+
+This is a list of the keywords:
+
+`$Author: pertusus $'
+ The login name of the user who checked in the revision.
+
+`$CVSHeader'
+ A standard header (similar to $Header:
/cvsroot/texi2html/texi2html/test/manuals/res/ccvs_info/cvs.info-1,v 1.1
2009/04/26 18:37:21 pertusus Exp $, but with the CVS root
+ stripped off). It contains the relative pathname of the RCS file to
+ the CVS root, the revision number, the date (UTC), the author, the
+ state, and the locker (if locked). Files will normally never be
+ locked when you use CVS.
+
+ Note that this keyword has only been recently introduced to CVS and
+ may cause problems with existing installations if $CVSHeader:
texi2html/test/manuals/res/ccvs_info/cvs.info-1,v 1.1 2009/04/26 18:37:21
pertusus Exp $ is
+ already in the files for a different purpose. This keyword may be
+ excluded using the `KeywordExpansion=eCVSHeader' in the
+ `CVSROOT/config' file. See *note Configuring keyword expansion::
+ for more details.
+
+`$Date: 2009/04/26 18:37:21 $'
+ The date and time (UTC) the revision was checked in.
+
+`$Header: /cvsroot/texi2html/texi2html/test/manuals/res/ccvs_info/cvs.info-1,v
1.1 2009/04/26 18:37:21 pertusus Exp $'
+ A standard header containing the full pathname of the 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 CVS.
+
+`$Id: cvs.info-1,v 1.1 2009/04/26 18:37:21 pertusus Exp $'
+ Same as `$Header:
/cvsroot/texi2html/texi2html/test/manuals/res/ccvs_info/cvs.info-1,v 1.1
2009/04/26 18:37:21 pertusus Exp $', except that the RCS filename is without a
path.
+
+`$Name: $'
+ Tag name used to check out this file. The keyword is expanded only
+ if one checks out with an explicit tag name. For example, when
+ running the command `cvs co -r first', the keyword expands to
+ `Name: first'.
+
+`$Locker: $'
+ The login name of the user who locked the revision (empty if not
+ locked, which is the normal case unless `cvs admin -l' is in use).
+
+`$Log: cvs.info-1,v $
+`Revision 1.1 2009/04/26 18:37:21 pertusus
+`minor change ini menus.texi, some files added.
+`'
+ The log message supplied during commit, preceded by a header
+ containing the RCS filename, the revision number, the author, and
+ the date (UTC). Existing log messages are _not_ replaced.
+ Instead, the new log message is inserted after `$Log:...$'. Each
+ new line is prefixed with the same string which precedes the `$Log'
+ keyword. For example, if the file contains:
+
+ /* Here is what people have been up to:
+ *
+ * $Log: cvs.info-1,v $
+ * Revision 1.1 2009/04/26 18:37:21 pertusus
+ * minor change ini menus.texi, some files added.
+ *
+ * Revision 1.1 1997/01/03 14:23:51 joe
+ * Add the superfrobnicate option
+ *
+ */
+
+ then additional lines which are added when expanding the `$Log'
+ keyword will be preceded by ` * '. Unlike previous versions of
+ CVS and RCS, the "comment leader" from the RCS file is not used.
+ The `$Log' keyword is useful for accumulating a complete change log
+ in a source file, but for several reasons it can be problematic.
+ *Note Log keyword::.
+
+`$RCSfile: cvs.info-1,v $'
+ The name of the RCS file without a path.
+
+`$Revision: 1.1 $'
+ The revision number assigned to the revision.
+
+`$Source: /cvsroot/texi2html/texi2html/test/manuals/res/ccvs_info/cvs.info-1,v
$'
+ The full pathname of the RCS file.
+
+`$State: Exp $'
+ The state assigned to the revision. States can be assigned with
+ `cvs admin -s'--see *note admin options::.
+
+`Local keyword'
+ The `LocalKeyword' option in the `CVSROOT/config' file may be used
+ to specify a local keyword which is to be used as an alias for one
+ of the other keywords. For example, if the `CVSROOT/config' file
+ contains a line with `LocalKeyword=MYBSD=CVSHeader', then a file
+ with the local keyword $MYBSD$ will be expanded as if it were a
+ $CVSHeader: texi2html/test/manuals/res/ccvs_info/cvs.info-1,v 1.1
2009/04/26 18:37:21 pertusus Exp $ keyword. If the src/frob.c file contained
this keyword,
+ it might look something like this:
+
+ /*
+ * $MYBSD: src/frob.c,v 1.1 2003/05/04 09:27:45 john Exp $
+ */
+
+ Many repositories make use of a such a "local keyword" feature. An
+ old patch to CVS provided the `LocalKeyword' feature using a `tag='
+ option and called this the "custom tag" or "local tag" feature. It
+ was used in conjunction with the what they called the `tagexpand='
+ option. In CVS this other option is known as the `KeywordExpand'
+ option. See *note Configuring keyword expansion:: for more
+ details.
+
+ Examples from popular projects include: $FreeBSD$, $NetBSD$,
+ $OpenBSD$, $XFree86$, $Xorg$.
+
+ The advantage of this is that you can include your local version
+ information in a file using this local keyword without disrupting
+ the upstream version information (which may be a different local
+ keyword or a standard keyword). Allowing bug reports and the like
+ to more properly identify the source of the original bug to the
+ third-party and reducing the number of conflicts that arise during
+ an import of a new version.
+
+ All keyword expansion except the local keyword may be disabled
+ using the `KeywordExpansion' option in the `CVSROOT/config'
+ file--see *note Configuring keyword expansion:: for more details.
+
+
+File: cvs.info, Node: Using keywords, Next: Avoiding substitution, Prev:
Keyword list, Up: Keyword substitution
+
+12.2 Using keywords
+===================
+
+To include a keyword string you simply include the relevant text string,
+such as `$Id: cvs.info-1,v 1.1 2009/04/26 18:37:21 pertusus Exp $', inside the
file, and commit the file. CVS will
+automatically expand the string as part of the commit operation.
+
+ It is common to embed the `$Id: cvs.info-1,v 1.1 2009/04/26 18:37:21
pertusus Exp $' string in the source files so that
+it gets passed through to generated files. For example, if you are
+managing computer program source code, you might include a variable
+which is initialized to contain that string. Or some C compilers may
+provide a `#pragma ident' directive. Or a document management system
+might provide a way to pass a string through to generated files.
+
+ The `ident' command (which is part of the 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.
+
+ $ ident samp.c
+ samp.c:
+ $Id: cvs.info-1,v 1.1 2009/04/26 18:37:21 pertusus Exp $
+ $ gcc samp.c
+ $ ident a.out
+ a.out:
+ $Id: cvs.info-1,v 1.1 2009/04/26 18:37:21 pertusus Exp $
+
+ SCCS is another popular revision control system. It has a command,
+`what', which is very similar to `ident' and used for the same purpose.
+Many sites without RCS have SCCS. Since `what' looks for the character
+sequence `@(#)' it is easy to include keywords that are detected by
+either command. Simply prefix the keyword with the magic SCCS phrase,
+like this:
+
+ static char *id="@(#) $Id: cvs.info-1,v 1.1 2009/04/26 18:37:21 pertusus
Exp $";
+
+
+File: cvs.info, Node: Avoiding substitution, Next: Substitution modes,
Prev: Using keywords, Up: Keyword substitution
+
+12.3 Avoiding substitution
+==========================
+
+Keyword substitution has its disadvantages. Sometimes you might want
+the literal text string `$Author: pertusus $' to appear inside a file without
CVS
+interpreting it as a keyword and expanding it into something like
+`$Author: pertusus $'.
+
+ There is unfortunately no way to selectively turn off keyword
+substitution. You can use `-ko' (*note Substitution modes::) to turn
+off keyword substitution entirely.
+
+ In many cases you can avoid using keywords in the source, even though
+they appear in the final product. For example, the source for this
+manual contains address@hidden' whenever the text `$Author: pertusus $' should
+appear. In `nroff' and `troff' you can embed the null-character `\&'
+inside the keyword for a similar effect.
+
+ It is also possible to specify an explicit list of keywords to
+include or exclude using the `KeywordExpand' option in the
+`CVSROOT/config' file-see *note Configuring keyword expansion:: for more
+details. This feature is intended primarily for use with the
+`LocalKeyword' option-see *note Keyword list::.
+
+
+File: cvs.info, Node: Substitution modes, Next: Configuring keyword
expansion, Prev: Avoiding substitution, Up: Keyword substitution
+
+12.4 Substitution modes
+=======================
+
+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 `-k' option to `cvs add' and `cvs admin'; the latter is set
+by the `-k' or `-A' options to `cvs checkout' or `cvs update'. `cvs
+diff' also has a `-k' option. For some examples, see *note Binary
+files::, and *note Merging and keywords::.
+
+ The modes available are:
+
+`-kkv'
+ Generate keyword strings using the default form, e.g. `$Revision:
+ 5.7 $' for the `Revision' keyword.
+
+`-kkvl'
+ Like `-kkv', except that a locker's name is always inserted if the
+ given revision is currently locked. The locker's name is only
+ relevant if `cvs admin -l' is in use.
+
+`-kk'
+ Generate only keyword names in keyword strings; omit their values.
+ For example, for the `Revision' keyword, generate the string
+ `$Revision: 1.1 $' instead of `$Revision: 1.1 $'. This option is useful
+ to ignore differences due to keyword substitution when comparing
+ different revisions of a file (*note Merging and keywords::).
+
+`-ko'
+ Generate the old keyword string, present in the working file just
+ before it was checked in. For example, for the `Revision' keyword,
+ generate the string `$Revision: 1.1 $' instead of `$Revision: 5.7
+ $' if that is how the string appeared when the file was checked in.
+
+`-kb'
+ Like `-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 very similar to `-ko'. For more
+ information on binary files, see *note Binary files::. In CVS
+ version 1.12.2 and later `-kb', as set by `cvs add', `cvs admin',
+ or `cvs import' may not be overridden by a `-k' option specified on
+ the command line.
+
+`-kv'
+ Generate only keyword values for keyword strings. For example, for
+ the `Revision' keyword, generate the string `5.7' instead of
+ `$Revision: 1.1 $'. This can help generate files in programming
+ languages where it is hard to strip keyword delimiters like
+ `$Revision: 1.1 $' 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 `-kv' with `cvs export'--*note
+ export::. But be aware that doesn't handle an export containing
+ binary files correctly.
+
+
+File: cvs.info, Node: Configuring keyword expansion, Next: Log keyword,
Prev: Substitution modes, Up: Keyword substitution
+
+12.5 Configuring Keyord Expansion
+=================================
+
+In a repository that includes third-party software on vendor branches,
+it is sometimes helpful to configure CVS to use a local keyword instead
+of the standard $Id: cvs.info-1,v 1.1 2009/04/26 18:37:21 pertusus Exp $ or
$Header: /cvsroot/texi2html/texi2html/test/manuals/res/ccvs_info/cvs.info-1,v
1.1 2009/04/26 18:37:21 pertusus Exp $ keywords. Examples from real projects
+includ, $Xorg$, $XFree86$, $FreeBSD$, $NetBSD$, $OpenBSD$, and even
+$dotat$. The advantage of this is that you can include your local
+version information in a file using this local keyword (sometimes called
+a "custom tag" or a "local tag") without disrupting the upstream version
+information (which may be a different local keyword or a standard
+keyword). In these cases, it is typically desirable to disable the
+expansion of all keywords except the configured local keyword.
+
+ The `KeywordExpansion' option in the `CVSROOT/config' file is
+intended to allow for the either the explicit exclusion of a keyword or
+list of keywords, or for the explicit inclusion of a keyword or a list
+of keywords. This list may include the `LocalKeyword' that has been
+configured.
+
+ The `KeywordExpansion' option is followed by `=' and the next
+character may either be `i' to start an inclusion list or `e' to start
+an exclusion list. If the following lines were added to the
+`CVSROOT/config' file:
+
+ # Add a "MyBSD" keyword and restrict keyword
+ # expansion
+ LocalKeyword=MyBSD=CVSHeader
+ KeywordExpand=iMyBSD
+
+ then only the $MyBSD$ keyword would be expanded. A list may be used.
+The this example:
+
+ # Add a "MyBSD" keyword and restrict keyword
+ # expansion to the MyBSD, Name and Date keywords.
+ LocalKeyword=MyBSD=CVSHeader
+ KeywordExpand=iMyBSD,Name,Date
+
+ would allow $MyBSD$, $Name: $, and $Date: 2009/04/26 18:37:21 $ to be
expanded.
+
+ It is also possible to configure an exclusion list using the
+following:
+
+ # Do not expand the non-RCS keyword CVSHeader
+ KeywordExpand=eCVSHeader
+
+ This allows CVS to ignore the recently introduced $CVSHeader:
texi2html/test/manuals/res/ccvs_info/cvs.info-1,v 1.1 2009/04/26 18:37:21
pertusus Exp $ keyword
+and retain all of the others. The exclusion entry could also contain the
+standard RCS keyword list, but this could be confusing to users that
+expect RCS keywords to be expanded, so ycare should be taken to properly
+set user expectations for a repository that is configured in that
+manner.
+
+ If there is a desire to not have any RCS keywords expanded and not
+use the `-ko' flags everywhere, an administrator may disable all keyword
+expansion using the `CVSROOT/config' line:
+
+ # Do not expand any RCS keywords
+ KeywordExpand=i
+
+ this could be confusing to users that expect RCS keywords like $Id:
cvs.info-1,v 1.1 2009/04/26 18:37:21 pertusus Exp $
+to be expanded properly, so care should be taken to properly set user
+expectations for a repository so configured.
+
+ It should be noted that a patch to provide both the `KeywordExpand'
+and `LocalKeyword' features has been around a long time. However, that
+patch implemented these features using `tag=' and `tagexpand=' keywords
+and those keywords are NOT recognized.
+
+
+File: cvs.info, Node: Log keyword, Prev: Configuring keyword expansion, Up:
Keyword substitution
+
+12.6 Problems with the $Log$ keyword.
+=====================================
+
+The `$Log: cvs.info-1,v $
+The `Revision 1.1 2009/04/26 18:37:21 pertusus
+The `minor change ini menus.texi, some files added.
+The `' 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 `$Log$' keyword--just do a `cvs log'. Once
+you export the file the history information might be useless anyhow.
+
+ A more serious concern is that CVS is not good at handling `$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 `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 `$Log$' keyword should be inserted
+_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.
+
+
+File: cvs.info, Node: Tracking sources, Next: Builds, Prev: Keyword
substitution, Up: Top
+
+13 Tracking third-party 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.
+ CVS can help you with this task.
+
+ In the terminology used in CVS, the supplier of the program is called
+a "vendor". The unmodified distribution from the vendor is checked in
+on its own branch, the "vendor branch". 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 `import' command to create and update the vendor branch.
+When you import a new file, 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 for the first time
+* Update imports:: Updating with the import command
+* Reverting local changes:: Reverting to the latest vendor release
+* Binary files in imports:: Binary files require special handling
+* Keywords in imports:: Keyword substitution might be undesirable
+* Multiple vendor branches:: What if you get sources from several places?
+
+
+File: cvs.info, Node: First import, Next: Update imports, Up: Tracking
sources
+
+13.1 Importing for the first time
+=================================
+
+Use the `import' command to check in the sources for the first time.
+When you use the `import' command to track third-party sources, the
+"vendor tag" and "release tags" are useful. The "vendor tag" is a
+symbolic name for the branch (which is always 1.1.1, unless you use the
+`-b BRANCH' flag--see *note Multiple vendor branches::.). The "release
+tags" are symbolic names for a particular release, such as `FSF_0_04'.
+
+ Note that `import' does _not_ change the directory in which you
+invoke it. In particular, it does not set up that directory as a CVS
+working directory; if you want to work with the sources import them
+first and then check them out into a different directory (*note Getting
+the source::).
+
+ Suppose you have the sources to a program called `wdiff' in a
+directory `wdiff-0.04', 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:
+
+ $ cd wdiff-0.04
+ $ cvs import -m "Import of FSF v. 0.04" fsf/wdiff FSF_DIST WDIFF_0_04
+
+ The vendor tag is named `FSF_DIST' in the above example, and the only
+release tag assigned is `WDIFF_0_04'.
+
+
+File: cvs.info, Node: Update imports, Next: Reverting local changes, Prev:
First import, Up: Tracking sources
+
+13.2 Updating with the import command
+=====================================
+
+When a new release of the source arrives, you import it into the
+repository with the same `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:
+
+ $ 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
+
+ For files that have not been modified locally, the newly created
+revision becomes the head revision. If you have made local changes,
+`import' will warn you that you must merge the changes into the main
+trunk, and tell you to use `checkout -j' to do so:
+
+ $ cvs checkout -jFSF_DIST:yesterday -jFSF_DIST wdiff
+
+The above command will check out the latest revision of `wdiff', merging
+the changes made on the vendor branch `FSF_DIST' since yesterday into
+the working copy. If any conflicts arise during the merge they should
+be resolved in the normal way (*note Conflicts example::). Then, the
+modified files may be committed.
+
+ However, it is much better to use the two release tags rather than
+using a date on the branch as suggested above:
+
+ $ cvs checkout -jWDIFF_0_04 -jWDIFF_0_05 wdiff
+
+The reason this is better is that using a date, as suggested above,
+assumes that you do not import more than one release of a product per
+day. More importantly, using the release tags allows CVS to detect
+files that were removed between the two vendor releases and mark them
+for removal. Since `import' has no way to detect removed files, you
+should do a merge like this even if `import' doesn't tell you to.
+
+
+File: cvs.info, Node: Reverting local changes, Next: Binary files in
imports, Prev: Update imports, Up: Tracking sources
+
+13.3 Reverting to the latest vendor release
+===========================================
+
+You can also revert local changes completely and return to the latest
+vendor release by changing the `head' revision back to the vendor branch
+on all files. For example, if you have a checked-out copy of the
+sources in `~/work.d/wdiff', and you want to revert to the vendor's
+version for all the files in that directory, you would type:
+
+ $ cd ~/work.d/wdiff
+ $ cvs admin -bWDIFF .
+
+You must specify the `-bWDIFF' without any space after the `-b'. *Note
+admin options::.
+
+
+File: cvs.info, Node: Binary files in imports, Next: Keywords in imports,
Prev: Reverting local changes, Up: Tracking sources
+
+13.4 How to handle binary files with cvs import
+===============================================
+
+Use the `-k' wrapper option to tell import which files are binary.
+*Note Wrappers::.
+
+
+File: cvs.info, Node: Keywords in imports, Next: Multiple vendor branches,
Prev: Binary files in imports, Up: Tracking sources
+
+13.5 How to handle keyword substitution with cvs import
+=======================================================
+
+The sources which you are importing may contain keywords (*note Keyword
+substitution::). For example, the vendor may use CVS or some other
+system which uses similar keyword expansion syntax. If you just import
+the files in the default fashion, then the keyword expansions supplied
+by the vendor will be replaced by keyword expansions supplied by your
+own copy of CVS. It may be more convenient to maintain the expansions
+supplied by the vendor, so that this information can supply information
+about the sources that you imported from the vendor.
+
+ To maintain the keyword expansions supplied by the vendor, supply the
+`-ko' option to `cvs import' the first time you import the file. This
+will turn off keyword expansion for that file entirely, so if you want
+to be more selective you'll have to think about what you want and use
+the `-k' option to `cvs update' or `cvs admin' as appropriate.
+
+
+File: cvs.info, Node: Multiple vendor branches, Prev: Keywords in imports,
Up: Tracking sources
+
+13.6 Multiple vendor branches
+=============================
+
+All the examples so far assume that there is only one vendor from which
+you are getting sources. In some situations you might get sources from
+a variety of places. For example, suppose that you are dealing with a
+project where many different people and teams are modifying the
+software. There are a variety of ways to handle this, but in some cases
+you have a bunch of source trees lying around and what you want to do
+more than anything else is just to all put them in CVS so that you at
+least have them in one place.
+
+ For handling situations in which there may be more than one vendor,
+you may specify the `-b' option to `cvs import'. It takes as an
+argument the vendor branch to import to. The default is `-b 1.1.1'.
+
+ For example, suppose that there are two teams, the red team and the
+blue team, that are sending you sources. You want to import the red
+team's efforts to branch 1.1.1 and use the vendor tag RED. You want to
+import the blue team's efforts to branch 1.1.3 and use the vendor tag
+BLUE. So the commands you might use are:
+
+ $ cvs import dir RED RED_1-0
+ $ cvs import -b 1.1.3 dir BLUE BLUE_1-5
+
+ Note that if your vendor tag does not match your `-b' option, CVS
+will not detect this case! For example,
+
+ $ cvs import -b 1.1.3 dir RED RED_1-0
+
+Be careful; this kind of mismatch is sure to sow confusion or worse. I
+can't think of a useful purpose for the ability to specify a mismatch
+here, but if you discover such a use, don't. CVS is likely to make this
+an error in some future release.
+
+
+File: cvs.info, Node: Builds, Next: Special Files, Prev: Tracking sources,
Up: Top
+
+14 How your build system interacts with CVS
+*******************************************
+
+As mentioned in the introduction, CVS does not contain software for
+building your software from source code. This section describes how
+various aspects of your build system might interact with CVS.
+
+ One common question, especially from people who are accustomed to
+RCS, is how to make their build get an up to date copy of the sources.
+The answer to this with CVS is two-fold. First of all, since CVS itself
+can recurse through directories, there is no need to modify your
+`Makefile' (or whatever configuration file your build tool uses) to make
+sure each file is up to date. Instead, just use two commands, first
+`cvs -q update' and then `make' or whatever the command is to invoke
+your build tool. Secondly, you do not necessarily _want_ to get a copy
+of a change someone else made until you have finished your own work.
+One suggested approach is to first update your sources, then implement,
+build and test the change you were thinking of, and then commit your
+sources (updating first if necessary). By periodically (in between
+changes, using the approach just described) updating your entire tree,
+you ensure that your sources are sufficiently up to date.
+
+ One common need is to record which versions of which source files
+went into a particular build. This kind of functionality is sometimes
+called "bill of materials" or something similar. The best way to do
+this with CVS is to use the `tag' command to record which versions went
+into a given build (*note Tags::).
+
+ Using CVS in the most straightforward manner possible, each developer
+will have a copy of the entire source tree which is used in a particular
+build. If the source tree is small, or if developers are geographically
+dispersed, this is the preferred solution. In fact one approach for
+larger projects is to break a project down into smaller
+separately-compiled subsystems, and arrange a way of releasing them
+internally so that each developer need check out only those subsystems
+which they are actively working on.
+
+ Another approach is to set up a structure which allows developers to
+have their own copies of some files, and for other files to access
+source files from a central location. Many people have come up with
+some such a system using features such as the symbolic link feature
+found in many operating systems, or the `VPATH' feature found in many
+versions of `make'. One build tool which is designed to help with this
+kind of thing is Odin (see
+`ftp://ftp.cs.colorado.edu/pub/distribs/odin').
+
+
+File: cvs.info, Node: Special Files, Next: CVS commands, Prev: Builds, Up:
Top
+
+15 Special Files
+****************
+
+In normal circumstances, CVS works only with regular files. Every file
+in a project is assumed to be persistent; it must be possible to open,
+read and close them; and so on. CVS also ignores file permissions and
+ownerships, leaving such issues to be resolved by the developer at
+installation time. In other words, it is not possible to "check in" a
+device into a repository; if the device file cannot be opened, CVS will
+refuse to handle it. Files also lose their ownerships and permissions
+during repository transactions.
+
+
+File: cvs.info, Node: CVS commands, Next: Invoking CVS, Prev: Special
Files, Up: Top
+
+Annexe A Guide to CVS commands
+******************************
+
+This appendix describes the overall structure of CVS commands, and
+describes some commands in detail (others are described elsewhere; for a
+quick reference to CVS commands, *note Invoking CVS::).
+
+* Menu:
+
+* Structure:: Overall structure of CVS commands
+* Exit status:: Indicating CVS's success or failure
+* ~/.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
+* admin:: Administration
+* checkout:: Checkout sources for editing
+* commit:: Check files into the repository
+* diff:: Show differences 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:: Show log messages for files
+* rdiff:: 'patch' format diffs between releases
+* release:: Indicate that a directory is no longer in use
+* update:: Bring work tree in sync with repository
+
+
+File: cvs.info, Node: Structure, Next: Exit status, Up: CVS commands
+
+A.1 Overall structure of CVS commands
+=====================================
+
+The overall format of all CVS commands is:
+
+ cvs [ cvs_options ] cvs_command [ command_options ] [ command_args ]
+
+`cvs'
+ The name of the CVS program.
+
+`cvs_options'
+ Some options that affect all sub-commands of CVS. These are
+ described below.
+
+`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 `cvs_command': `cvs -H' elicits a list of
+ available commands, and `cvs -v' displays version information on
+ CVS itself.
+
+`command_options'
+ Options that are specific for the command.
+
+`command_args'
+ Arguments to the commands.
+
+ There is unfortunately some confusion between `cvs_options' and
+`command_options'. `-l', when given as a `cvs_option', only affects
+some of the commands. When it is given as a `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.
+
+
+File: cvs.info, Node: Exit status, Next: ~/.cvsrc, Prev: Structure, Up:
CVS commands
+
+A.2 CVS's exit status
+=====================
+
+CVS can indicate to the calling environment whether it succeeded or
+failed by setting its "exit status". The exact way of testing the exit
+status will vary from one operating system to another. For example in a
+unix shell script the `$?' variable will be 0 if the last command
+returned a successful exit status, or greater than 0 if the exit status
+indicated failure.
+
+ If CVS is successful, it returns a successful status; if there is an
+error, it prints an error message and returns a failure status. The one
+exception to this is the `cvs diff' command. It will return a
+successful status if it found no differences, or a failure status if
+there were differences or if there was an error. Because this behavior
+provides no good way to detect errors, in the future it is possible that
+`cvs diff' will be changed to behave like the other CVS commands.
+
+
+File: cvs.info, Node: ~/.cvsrc, Next: Global options, Prev: Exit status,
Up: CVS commands
+
+A.3 Default options and the ~/.cvsrc file
+=========================================
+
+There are some `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 `diff' command to be very hard to read, and that either context
+diffs or unidiffs are much easier to understand.
+
+ The `~/.cvsrc' file is a way that you can add default options to
+`cvs_commands' within cvs, instead of relying on aliases or other shell
+scripts.
+
+ The format of the `~/.cvsrc' file is simple. The file is searched
+for a line that begins with the same name as the `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 _before_ any options from the command line.
+
+ If a command has two names (e.g., `checkout' and `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
+`~/.cvsrc' file:
+
+ log -N
+ diff -uN
+ rdiff -u
+ update -Pd
+ checkout -P
+ release -d
+
+the command `cvs checkout foo' would have the `-P' option added to the
+arguments, as well as `cvs co foo'.
+
+ With the example file above, the output from `cvs diff foobar' will
+be in unidiff format. `cvs diff -c foobar' will provide context diffs,
+as usual. Getting "old" format diffs would be slightly more
+complicated, because `diff' doesn't have an option to specify use of the
+"old" format, so you would need `cvs -f diff foobar'.
+
+ In place of the command name you can use `cvs' to specify global
+options (*note Global options::). For example the following line in
+`.cvsrc'
+
+ cvs -z6
+
+causes CVS to use compression level 6.
+
+
+File: cvs.info, Node: Global options, Next: Common options, Prev: ~/.cvsrc,
Up: CVS commands
+
+A.4 Global options
+==================
+
+The available `cvs_options' (that are given to the left of
+`cvs_command') are:
+
+`--allow-root=ROOTDIR'
+ Specify legal CVSROOT directory. See *note Password authentication
+ server::.
+
+`-a'
+ Authenticate all communication between the client and the server.
+ Only has an effect on the CVS client. As of this writing, this is
+ only implemented when using a GSSAPI connection (*note GSSAPI
+ authenticated::). Authentication prevents certain sorts of attacks
+ involving hijacking the active TCP connection. Enabling
+ authentication does not enable encryption.
+
+`-b BINDIR'
+ In CVS 1.9.18 and older, this specified that RCS programs are in
+ the BINDIR directory. Current versions of CVS do not run RCS
+ programs; for compatibility this option is accepted, but it does
+ nothing.
+
+`-T TEMPDIR'
+ Use TEMPDIR as the directory where temporary files are located.
+ Overrides the setting of the `$TMPDIR' environment variable and any
+ precompiled directory. This parameter should be specified as an
+ absolute pathname. (When running client/server, `-T' affects only
+ the local process; specifying `-T' for the client has no effect on
+ the server and vice versa.)
+
+`-d CVS_ROOT_DIRECTORY'
+ Use CVS_ROOT_DIRECTORY as the root directory pathname of the
+ repository. Overrides the setting of the `$CVSROOT' environment
+ variable. *Note Repository::.
+
+`-e EDITOR'
+ Use EDITOR to enter revision log information. Overrides the
+ setting of the `$CVSEDITOR' and `$EDITOR' environment variables.
+ For more information, see *note Committing your changes::.
+
+`-f'
+ Do not read the `~/.cvsrc' file. This option is most often used
+ because of the non-orthogonality of the CVS option set. For
+ example, the `cvs log' option `-N' (turn off display of tag names)
+ does not have a corresponding option to turn the display on. So if
+ you have `-N' in the `~/.cvsrc' entry for `log', you may need to
+ use `-f' to show the tag names.
+
+`-H'
+`--help'
+ Display usage information about the specified `cvs_command' (but do
+ not actually execute the command). If you don't specify a command
+ name, `cvs -H' displays overall help for CVS, including a list of
+ other help options.
+
+`-l'
+ Do not log the `cvs_command' in the command history (but execute it
+ anyway). *Note history::, for information on command history.
+
+`-R'
+ Turns on read-only repository mode. This allows one to check out
+ from a read-only repository, such as within an anoncvs server, or
+ from a CDROM repository.
+
+ Same effect as if the `CVSREADONLYFS' environment variable is set.
+ Using `-R' can also considerably speed up checkout's over NFS.
+
+`-n'
+ Do not change any files. Attempt to execute the `cvs_command', but
+ only to issue reports; do not remove, update, or merge any existing
+ files, or create any new files.
+
+ Note that CVS will not necessarily produce exactly the same output
+ as without `-n'. In some cases the output will be the same, but in
+ other cases CVS will skip some of the processing that would have
+ been required to produce the exact same output.
+
+`-Q'
+ Cause the command to be really quiet; the command will only
+ generate output for serious problems.
+
+`-q'
+ Cause the command to be somewhat quiet; informational messages,
+ such as reports of recursion through subdirectories, are
+ suppressed.
+
+`-r'
+ Make new working files read-only. Same effect as if the `$CVSREAD'
+ environment variable is set (*note Environment variables::). The
+ default is to make working files writable, unless watches are on
+ (*note Watches::).
+
+`-s VARIABLE=VALUE'
+ Set a user variable (*note Variables::).
+
+`-t'
+ Trace program execution; display messages showing the steps of CVS
+ activity. Particularly useful with `-n' to explore the potential
+ impact of an unfamiliar command.
+
+`-v'
+
+`--version'
+ Display version and copyright information for CVS.
+
+`-w'
+ Make new working files read-write. Overrides the setting of the
+ `$CVSREAD' environment variable. Files are created read-write by
+ default, unless `$CVSREAD' is set or `-r' is given.
+
+`-x'
+ Encrypt all communication between the client and the server. Only
+ has an effect on the CVS client. As of this writing, this is only
+ implemented when using a GSSAPI connection (*note GSSAPI
+ authenticated::) or a Kerberos connection (*note Kerberos
+ authenticated::). Enabling encryption implies that message traffic
+ is also authenticated. Encryption support is not available by
+ default; it must be enabled using a special configure option,
+ `--enable-encryption', when you build CVS.
+
+`-z GZIP-LEVEL'
+ Set the compression level. Valid levels are 1 (high speed, low
+ compression) to 9 (low speed, high compression), or 0 to disable
+ compression (the default). Only has an effect on the CVS client.
+
+
+File: cvs.info, Node: Common options, Next: admin, Prev: Global options,
Up: CVS commands
+
+A.5 Common command options
+==========================
+
+This section describes the `command_options' that are available across
+several CVS commands. These options are always given to the right of
+`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 CVS command to the other).
+
+ *Note: the `history' command is an exception; it supports many
+options that conflict even with these standard options.*
+
+`-D DATE_SPEC'
+ Use the most recent revision no later than DATE_SPEC. DATE_SPEC is
+ a single argument, a date description specifying a date in the
+ past.
+
+ The specification is "sticky" when you use it to make a private
+ copy of a source file; that is, when you get a working file using
+ `-D', 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, *note Sticky tags::).
+
+ `-D' is available with the `annotate', `checkout', `diff',
+ `export', `history', `rdiff', `rtag', `tag', and `update' commands.
+ (The `history' command uses this option in a slightly different
+ way; *note history options::).
+
+ A wide variety of date formats are supported by CVS. The most
+ standard ones are ISO8601 (from the International Standards
+ Organization) and the Internet e-mail standard (specified in RFC822
+ as amended by RFC1123).
+
+ ISO8601 dates have many variants but a few examples are:
+
+ 1972-09-24
+ 1972-09-24 20:05
+
+ There are a lot more ISO8601 date formats, and CVS accepts many of
+ them, but you probably don't want to hear the _whole_ long story
+ :-).
+
+ In addition to the dates allowed in Internet e-mail itself, CVS
+ also allows some of the fields to be omitted. For example:
+
+ 24 Sep 1972 20:05
+ 24 Sep
+
+ The date is interpreted as being in the local timezone, unless a
+ specific timezone is specified.
+
+ These two date formats are preferred. However, CVS currently
+ accepts a wide variety of other date formats. They are
+ intentionally not documented here in any detail, and future
+ versions of CVS might not accept all of them.
+
+ One such format is `MONTH/DAY/YEAR'. This may confuse people who
+ are accustomed to having the month and day in the other order;
+ `1/4/96' is January 4, not April 1.
+
+ Remember to quote the argument to the `-D' flag so that your shell
+ doesn't interpret spaces as argument separators. A command using
+ the `-D' flag can look like this:
+
+ $ cvs diff -D "1 hour ago" cvs.texinfo
+
+`-f'
+ When you specify a particular date or tag to 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 `-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).
+
+ Note that even with `-f', a tag that you specify must exist (that
+ is, in some file, not necessary in every file). This is so that
+ CVS will continue to give an error if you mistype a tag name.
+
+ `-f' is available with these commands: `annotate', `checkout',
+ `export', `rdiff', `rtag', and `update'.
+
+ *WARNING: The `commit' and `remove' commands also have a `-f'
+ option, but it has a different behavior for those commands. See
+ *note commit options::, and *note Removing files::.*
+
+`-k KFLAG'
+ Override the default processing of RCS keywords other than `-kb'.
+ *Note Keyword substitution::, for the meaning of KFLAG. Used with
+ the `checkout' and `update' commands, your KFLAG specification is
+ "sticky"; that is, when you use this option with a `checkout' or
+ `update' command, CVS associates your selected KFLAG with any files
+ it operates on, and continues to use that KFLAG with future
+ commands on the same files until you specify otherwise.
+
+ The `-k' option is available with the `add', `checkout', `diff',
+ `export', `import' and `update' commands.
+
+ *WARNING: Prior to CVS version 1.12.2, the `-k' flag overrode the
+ `-kb' indication for a binary file. This could sometimes corrupt
+ binary files. *Note Merging and keywords::, for more.*
+
+`-l'
+ Local; run only in current working directory, rather than recursing
+ through subdirectories.
+
+ Available with the following commands: `annotate', `checkout',
+ `commit', `diff', `edit', `editors', `export', `log', `rdiff',
+ `remove', `rtag', `status', `tag', `unedit', `update', `watch', and
+ `watchers'.
+
+`-m MESSAGE'
+ Use MESSAGE as log information, instead of invoking an editor.
+
+ Available with the following commands: `add', `commit' and
+ `import'.
+
+`-n'
+ Do not run any tag program. (A program can be specified to run in
+ the modules database (*note modules::); this option bypasses it).
+
+ *Note: this is not the same as the `cvs -n' program option, which
+ you can specify to the left of a cvs command!*
+
+ Available with the `checkout', `commit', `export', and `rtag'
+ commands.
+
+`-P'
+ Prune empty directories. See *note Removing directories::.
+
+`-p'
+ Pipe the files retrieved from the repository to standard output,
+ rather than writing them in the current directory. Available with
+ the `checkout' and `update' commands.
+
+`-R'
+ Process directories recursively. This is on by default.
+
+ Available with the following commands: `annotate', `checkout',
+ `commit', `diff', `edit', `editors', `export', `rdiff', `remove',
+ `rtag', `status', `tag', `unedit', `update', `watch', and
+ `watchers'.
+
+`-r TAG'
+ Use the revision specified by the TAG argument instead of the
+ default "head" revision. As well as arbitrary tags defined with
+ the `tag' or `rtag' command, two special tags are always available:
+ `HEAD' refers to the most recent version available in the
+ repository, and `BASE' refers to the revision you last checked out
+ into the current working directory.
+
+ The tag specification is sticky when you use this with `checkout'
+ or `update' to make your own copy of a file: CVS remembers the tag
+ and continues to use it on future update commands, until you
+ specify otherwise (for more information on sticky tags/dates, *note
+ Sticky tags::).
+
+ The tag can be either a symbolic or numeric tag, as described in
+ *note Tags::, or the name of a branch, as described in *note
+ Branching and merging::.
+
+ Specifying the `-q' global option along with the `-r' command
+ option is often useful, to suppress the warning messages when the
+ RCS file does not contain the specified tag.
+
+ *Note: this is not the same as the overall `cvs -r' option, which
+ you can specify to the left of a CVS command!*
+
+ `-r' is available with the `checkout', `commit', `diff', `history',
+ `export', `rdiff', `rtag', and `update' commands.
+
+`-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 `.cvswrappers' file. Available
+ with the following commands: `import', and `update'.
+
+
+File: cvs.info, Node: admin, Next: checkout, Prev: Common options, Up: CVS
commands
+
+A.6 admin--Administration
+=========================
+
+ * Requires: repository, working directory.
+
+ * Changes: repository.
+
+ * Synonym: rcs
+
+ This is the CVS interface to assorted administrative facilities.
+Some of them have questionable usefulness for CVS but exist for
+historical purposes. Some of the questionable options are likely to
+disappear in the future. This command _does_ work recursively, so
+extreme care should be used.
+
+ On unix, if there is a group named `cvsadmin', only members of that
+group can run `cvs admin' commands, except for those specified using the
+`UserAdminOptions' configuration option in the `CVSROOT/config' file.
+Options specified using `UserAdminOptions' can be run by any user. See
+*note config:: for more on `UserAdminOptions'.
+
+ The `cvsadmin' group should exist on the server, or any system
+running the non-client/server CVS. To disallow `cvs admin' for all
+users, create a group with no users in it. On NT, the `cvsadmin'
+feature does not exist and all users can run `cvs admin'.
+
+* Menu:
+
+* admin options:: admin options
+
+
+File: cvs.info, Node: admin options, Up: admin
+
+A.6.1 admin options
+-------------------
+
+Some of these options have questionable usefulness for CVS but exist for
+historical purposes. Some even make it impossible to use CVS until you
+undo the effect!
+
+`-AOLDFILE'
+ Might not work together with CVS. Append the access list of
+ OLDFILE to the access list of the RCS file.
+
+`-aLOGINS'
+ Might not work together with CVS. Append the login names appearing
+ in the comma-separated list LOGINS to the access list of the RCS
+ file.
+
+`-b[REV]'
+ Set the default branch to REV. In CVS, you normally do not
+ manipulate default branches; sticky tags (*note Sticky tags::) are
+ a better way to decide which branch you want to work on. There is
+ one reason to run `cvs admin -b': to revert to the vendor's version
+ when using vendor branches (*note Reverting local changes::).
+ There can be no space between `-b' and its argument.
+
+`-cSTRING'
+ Sets the comment leader to STRING. The comment leader is not used
+ by current versions of CVS or RCS 5.7. Therefore, you can almost
+ surely not worry about it. *Note Keyword substitution::.
+
+`-e[LOGINS]'
+ Might not work together with CVS. Erase the login names appearing
+ in the comma-separated list LOGINS from the access list of the RCS
+ file. If LOGINS is omitted, erase the entire access list. There
+ can be no space between `-e' and its argument.
+
+`-I'
+ Run interactively, even if the standard input is not a terminal.
+ This option does not work with the client/server CVS and is likely
+ to disappear in a future release of CVS.
+
+`-i'
+ Useless with CVS. This creates and initializes a new RCS file,
+ without depositing a revision. With CVS, add files with the `cvs
+ add' command (*note Adding files::).
+
+`-kSUBST'
+ Set the default keyword substitution to SUBST. *Note Keyword
+ substitution::. Giving an explicit `-k' option to `cvs update',
+ `cvs export', or `cvs checkout' overrides this default.
+
+`-l[REV]'
+ Lock the revision with number REV. If a branch is given, lock the
+ latest revision on that branch. If REV is omitted, lock the latest
+ revision on the default branch. There can be no space between `-l'
+ and its argument.
+
+ This can be used in conjunction with the `rcslock.pl' script in the
+ `contrib' directory of the 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
+ `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).
+
+`-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 CVS,
+ strict locking must be set; see the discussion under the `-l'
+ option above.
+
+`-mREV:MSG'
+ Replace the log message of revision REV with MSG.
+
+`-NNAME[:[REV]]'
+ Act like `-n', except override any previous assignment of NAME.
+ For use with magic branches, see *note Magic branch numbers::.
+
+`-nNAME[:[REV]]'
+ Associate the symbolic name NAME with the branch or revision REV.
+ It is normally better to use `cvs tag' or `cvs rtag' instead.
+ Delete the symbolic name if both `:' and REV are omitted;
+ otherwise, print an error message if NAME is already associated
+ with another number. If REV is symbolic, it is expanded before
+ association. A REV consisting of a branch number followed by a `.'
+ stands for the current latest revision in the branch. A `:' with
+ an empty REV stands for the current latest revision on the default
+ branch, normally the trunk. For example, `cvs admin -nNAME:'
+ associates NAME with the current latest revision of all the RCS
+ files; this contrasts with `cvs admin -nNAME:$' which associates
+ NAME with the revision numbers extracted from keyword strings in
+ the corresponding working files.
+
+`-oRANGE'
+ Deletes ("outdates") the revisions given by RANGE.
+
+ Note that this command can be quite dangerous unless you know
+ _exactly_ what you are doing (for example see the warnings below
+ about how the REV1:REV2 syntax is confusing).
+
+ 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! If you delete different
+ revisions than you planned, either due to carelessness or (heaven
+ forbid) a CVS bug, there is no opportunity to correct the error
+ before the revisions are deleted. It probably would be a good idea
+ to experiment on a copy of the repository first.
+
+ Specify RANGE in one of the following ways:
+
+ `REV1::REV2'
+ Collapse all revisions between rev1 and rev2, so that CVS only
+ stores the differences associated with going from rev1 to
+ rev2, not intermediate steps. For example, after `-o
+ 1.3::1.5' one can retrieve revision 1.3, revision 1.5, or the
+ differences to get from 1.3 to 1.5, but not the revision 1.4,
+ or the differences between 1.3 and 1.4. Other examples: `-o
+ 1.3::1.4' and `-o 1.3::1.3' have no effect, because there are
+ no intermediate revisions to remove.
+
+ `::REV'
+ Collapse revisions between the beginning of the branch
+ containing REV and REV itself. The branchpoint and REV are
+ left intact. For example, `-o ::1.3.2.6' deletes revision
+ 1.3.2.1, revision 1.3.2.5, and everything in between, but
+ leaves 1.3 and 1.3.2.6 intact.
+
+ `REV::'
+ Collapse revisions between REV and the end of the branch
+ containing REV. Revision REV is left intact but the head
+ revision is deleted.
+
+ `REV'
+ Delete the revision REV. For example, `-o 1.3' is equivalent
+ to `-o 1.2::1.4'.
+
+ `REV1:REV2'
+ Delete the revisions from REV1 to REV2, inclusive, on the same
+ branch. One will not be able to retrieve REV1 or REV2 or any
+ of the revisions in between. For example, the command `cvs
+ admin -oR_1_01:R_1_02 .' is rarely useful. It means to delete
+ revisions up to, and including, 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 _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! In most cases you want to specify
+ REV1::REV2 instead.
+
+ `:REV'
+ Delete revisions from the beginning of the branch containing
+ REV up to and including REV.
+
+ `REV:'
+ Delete revisions from revision REV, including REV itself, to
+ the end of the branch containing REV.
+
+ None of the revisions to be deleted may have branches or locks.
+
+ If any of the revisions to be deleted have symbolic names, and one
+ specifies one of the `::' syntaxes, then CVS will give an error and
+ not delete any revisions. If you really want to delete both the
+ symbolic names and the revisions, first delete the symbolic names
+ with `cvs tag -d', then run `cvs admin -o'. If one specifies the
+ non-`::' syntaxes, then CVS will delete the revisions but leave the
+ symbolic names pointing to nonexistent revisions. This behavior is
+ preserved for compatibility with previous versions of CVS, but
+ because it isn't very useful, in the future it may change to be
+ like the `::' case.
+
+ Due to the way CVS handles branches REV cannot be specified
+ symbolically if it is a branch. *Note 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 (*note Merging two revisions::).
+
+`-q'
+ Run quietly; do not print diagnostics.
+
+`-sSTATE[:REV]'
+ Useful with CVS. Set the state attribute of the revision REV to
+ STATE. If REV is a branch number, assume the latest revision on
+ that branch. If REV is omitted, assume the latest revision on the
+ default branch. Any identifier is acceptable for STATE. A useful
+ set of states is `Exp' (for experimental), `Stab' (for stable), and
+ `Rel' (for released). By default, the state of a new revision is
+ set to `Exp' when it is created. The state is visible in the
+ output from CVS LOG (*note log::), and in the `$Log$' and `$State: Exp $'
+ keywords (*note Keyword substitution::). Note that CVS uses the
+ `dead' state for its own purposes; to take a file to or from the
+ `dead' state use commands like `cvs remove' and `cvs add', not `cvs
+ admin -s'.
+
+`-t[FILE]'
+ Useful with CVS. Write descriptive text from the contents of the
+ named FILE into the RCS file, deleting the existing text. The FILE
+ pathname may not begin with `-'. The descriptive text can be seen
+ in the output from `cvs log' (*note log::). There can be no space
+ between `-t' and its argument.
+
+ If FILE is omitted, obtain the text from standard input, terminated
+ by end-of-file or by a line containing `.' by itself. Prompt for
+ the text if interaction is possible; see `-I'.
+
+`-t-STRING'
+ Similar to `-tFILE'. Write descriptive text from the STRING into
+ the RCS file, deleting the existing text. There can be no space
+ between `-t' and its argument.
+
+`-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 CVS,
+ strict locking must be set; see the discussion under the `-l'
+ option above.
+
+`-u[REV]'
+ See the option `-l' above, for a discussion of using this option
+ with CVS. Unlock the revision with number REV. If a branch is
+ given, unlock the latest revision on that branch. If 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 the original locker to be
+ sent a `commit' notification (*note Getting Notified::). There can
+ be no space between `-u' and its argument.
+
+`-VN'
+ In previous versions of CVS, this option meant to write an RCS file
+ which would be acceptable to RCS version N, but it is now obsolete
+ and specifying it will produce an error.
+
+`-xSUFFIXES'
+ In previous versions of CVS, this was documented as a way of
+ specifying the names of the RCS files. However, CVS has always
+ required that the RCS files used by CVS end in `,v', so this option
+ has never done anything useful.
+
+
+File: cvs.info, Node: checkout, Next: commit, Prev: admin, Up: CVS commands
+
+A.7 checkout--Check out sources for editing
+===========================================
+
+ * Synopsis: checkout [options] modules...
+
+ * Requires: repository.
+
+ * Changes: working directory.
+
+ * Synonyms: co, get
+
+ Create or update a working directory containing copies of the source
+files specified by MODULES. You must execute `checkout' before using
+most of the other CVS commands, since most of them operate on your
+working directory.
+
+ The MODULES 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 `modules' file.
+*Note modules::.
+
+ Depending on the modules you specify, `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 `checkout' is used to create directories. The top-level
+directory created is always added to the directory where `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
+`checkout' will show the relative path leading to each file as it is
+extracted into your private work area (unless you specify the `-Q'
+global option).
+
+ The files created by `checkout' are created read-write, unless the
+`-r' option to CVS (*note Global options::) is specified, the `CVSREAD'
+environment variable is specified (*note Environment variables::), or a
+watch is in effect for that file (*note Watches::).
+
+ Note that running `checkout' on a directory that was already built by
+a prior `checkout' is also permitted. This is similar to specifying the
+`-d' option to the `update' command in the sense that new directories
+that have been created in the repository will appear in your work area.
+However, `checkout' takes a module name whereas `update' takes a
+directory name. Also to use `checkout' this way it must be run from the
+top level directory (where you originally ran `checkout' from), so
+before you run `checkout' to update an existing directory, don't forget
+to change your directory to the top level directory.
+
+ For the output produced by the `checkout' command see *note update
+output::.
+
+* Menu:
+
+* checkout options:: checkout options
+* checkout examples:: checkout examples
+
+
+File: cvs.info, Node: checkout options, Next: checkout examples, Up:
checkout
+
+A.7.1 checkout options
+----------------------
+
+These standard options are supported by `checkout' (*note Common
+options::, for a complete description of them):
+
+`-D DATE'
+ Use the most recent revision no later than DATE. This option is
+ sticky, and implies `-P'. See *note Sticky tags::, for more
+ information on sticky tags/dates.
+
+`-f'
+ Only useful with the `-D DATE' or `-r TAG' flags. If no matching
+ revision is found, retrieve the most recent revision (instead of
+ ignoring the file).
+
+`-k KFLAG'
+ Process keywords according to KFLAG. See *note Keyword
+ substitution::. This option is sticky; future updates of this file
+ in this working directory will use the same KFLAG. The `status'
+ command can be viewed to see the sticky options. See *note
+ Invoking CVS::, for more information on the `status' command.
+
+`-l'
+ Local; run only in current working directory.
+
+`-n'
+ Do not run any checkout program (as specified with the `-o' option
+ in the modules file; *note modules::).
+
+`-P'
+ Prune empty directories. See *note Moving directories::.
+
+`-p'
+ Pipe files to the standard output.
+
+`-R'
+ Checkout directories recursively. This option is on by default.
+
+`-r TAG'
+ Use revision TAG. This option is sticky, and implies `-P'. See
+ *note Sticky tags::, for more information on sticky tags/dates.
+
+ In addition to those, you can use these special command options with
+`checkout':
+
+`-A'
+ Reset any sticky tags, dates, or `-k' options. See *note Sticky
+ tags::, for more information on sticky tags/dates.
+
+`-c'
+ Copy the module file, sorted, to the standard output, instead of
+ creating or modifying any files or directories in your working
+ directory.
+
+`-d DIR'
+ Create a directory called DIR for the working files, instead of
+ using the module name. In general, using this flag is equivalent
+ to using `mkdir DIR; cd DIR' followed by the checkout command
+ without the `-d' flag.
+
+ There is an important exception, however. It is very convenient
+ when checking out a single item to have the output appear in a
+ directory that doesn't contain empty intermediate directories. In
+ this case _only_, CVS tries to "shorten" pathnames to avoid those
+ empty directories.
+
+ For example, given a module `foo' that contains the file `bar.c',
+ the command `cvs co -d dir foo' will create directory `dir' and
+ place `bar.c' inside. Similarly, given a module `bar' which has
+ subdirectory `baz' wherein there is a file `quux.c', the command
+ `cvs co -d dir bar/baz' will create directory `dir' and place
+ `quux.c' inside.
+
+ Using the `-N' flag will defeat this behavior. Given the same
+ module definitions above, `cvs co -N -d dir foo' will create
+ directories `dir/foo' and place `bar.c' inside, while `cvs co -N -d
+ dir bar/baz' will create directories `dir/bar/baz' and place
+ `quux.c' inside.
+
+`-j TAG'
+ With two `-j' options, merge changes from the revision specified
+ with the first `-j' option to the revision specified with the
+ second `j' option, into the working directory.
+
+ With one `-j' option, merge changes from the ancestor revision to
+ the revision specified with the `-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 `-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:
+ `-jSYMBOLIC_TAG:DATE_SPECIFIER'.
+
+ *Note Branching and merging::.
+
+`-N'
+ Only useful together with `-d DIR'. With this option, CVS will not
+ "shorten" module paths in your working directory when you check out
+ a single module. See the `-d' flag for examples and a discussion.
+
+`-s'
+ Like `-c', but include the status of all modules, and sort it by
+ the status string. *Note modules::, for info about the `-s' option
+ that is used inside the modules file to set the module status.
+
+
+File: cvs.info, Node: checkout examples, Prev: checkout options, Up:
checkout
+
+A.7.2 checkout examples
+-----------------------
+
+Get a copy of the module `tc':
+
+ $ cvs checkout tc
+
+ Get a copy of the module `tc' as it looked one day ago:
+
+ $ cvs checkout -D yesterday tc
+
+
+File: cvs.info, Node: commit, Next: diff, Prev: checkout, Up: CVS commands
+
+A.8 commit--Check files into the repository
+===========================================
+
+ * Synopsis: commit [-lnRf] [-m 'log_message' | -F file] [-r revision]
+ [files...]
+
+ * Requires: working directory, repository.
+
+ * Changes: repository.
+
+ * Synonym: ci
+
+ Use `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. `commit' is careful to
+change in the repository only those files that you have really changed.
+By default (or if you explicitly specify the `-R' option), files in
+subdirectories are also examined and committed if they have changed; you
+can use the `-l' option to limit `commit' to the current directory only.
+
+ `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 `update' (*note update::). `commit' does not call the
+`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 (*note
+modules::, and *note loginfo::) and placed in the RCS file inside the
+repository. This log message can be retrieved with the `log' command;
+see *note log::. You can specify the log message on the command line
+with the `-m MESSAGE' option, and thus avoid the editor invocation, or
+use the `-F FILE' option to specify that the argument file contains the
+log message.
+
+* Menu:
+
+* commit options:: commit options
+* commit examples:: commit examples
+
+
+File: cvs.info, Node: commit options, Next: commit examples, Up: commit
+
+A.8.1 commit options
+--------------------
+
+These standard options are supported by `commit' (*note Common
+options::, for a complete description of them):
+
+`-l'
+ Local; run only in current working directory.
+
+`-R'
+ Commit directories recursively. This is on by default.
+
+`-r REVISION'
+ Commit to REVISION. REVISION must be either a branch, or a
+ revision on the main trunk that is higher than any existing
+ revision number (*note Assigning revisions::). You cannot commit
+ to a specific revision on a branch.
+
+ `commit' also supports these options:
+
+`-F FILE'
+ Read the log message from FILE, instead of invoking an editor.
+
+`-f'
+ Note that this is not the standard behavior of the `-f' option as
+ defined in *note Common options::.
+
+ Force CVS to commit a new revision even if you haven't made any
+ changes to the file. If the current revision of FILE is 1.7, then
+ the following two commands are equivalent:
+
+ $ cvs commit -f FILE
+ $ cvs commit -r 1.8 FILE
+
+ The `-f' option disables recursion (i.e., it implies `-l'). To
+ force CVS to commit a new revision for all files in all
+ subdirectories, you must use `-f -R'.
+
+`-m MESSAGE'
+ Use MESSAGE as the log message, instead of invoking an editor.
+
+
+File: cvs.info, Node: commit examples, Prev: commit options, Up: commit
+
+A.8.2 commit examples
+---------------------
+
+A.8.2.1 Committing to a branch
+..............................
+
+You can commit to a branch revision (one that has an even number of
+dots) with the `-r' option. To create a branch revision, use the `-b'
+option of the `rtag' or `tag' commands (*note Branching and merging::).
+Then, either `checkout' or `update' can be used to base your sources on
+the newly created branch. From that point on, all `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:
+
+ $ 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
+
+This works automatically since the `-r' option is sticky.
+
+A.8.2.2 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 CVS conflict resolution. The scenario might look
+like:
+
+ [[ hacked sources are present ]]
+ $ cvs tag -b EXPR1
+ $ cvs update -r EXPR1
+ $ cvs commit
+
+ The `update' command will make the `-r EXPR1' option sticky on all
+files. Note that your changes to the files will never be removed by the
+`update' command. The `commit' will automatically commit to the correct
+branch, because the `-r' is sticky. You could also do like this:
+
+ [[ hacked sources are present ]]
+ $ cvs tag -b EXPR1
+ $ cvs commit -r EXPR1
+
+but then, only those files that were changed by you will have the `-r
+EXPR1' sticky flag. If you hack away, and commit without specifying the
+`-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
+
+ $ cvs checkout -r EXPR1 whatever_module
+
+
+File: cvs.info, Node: diff, Next: export, Prev: commit, Up: CVS commands
+
+A.9 diff--Show differences between revisions
+============================================
+
+ * Synopsis: diff [-lR] [-k kflag] [format_options] [[-r rev1 | -D
+ date1] [-r rev2 | -D date2]] [files...]
+
+ * Requires: working directory, repository.
+
+ * Changes: nothing.
+
+ The `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 for diff is different than for other CVS commands;
+for details *note Exit status::.
+
+* Menu:
+
+* diff options:: diff options
+* diff examples:: diff examples
+
+
+File: cvs.info, Node: diff options, Next: diff examples, Up: diff
+
+A.9.1 diff options
+------------------
+
+These standard options are supported by `diff' (*note Common options::,
+for a complete description of them):
+
+`-D DATE'
+ Use the most recent revision no later than DATE. See `-r' for how
+ this affects the comparison.
+
+`-k KFLAG'
+ Process keywords according to KFLAG. See *note Keyword
+ substitution::.
+
+`-l'
+ Local; run only in current working directory.
+
+`-R'
+ Examine directories recursively. This option is on by default.
+
+`-r TAG'
+ Compare with revision TAG. Zero, one or two `-r' options can be
+ present. With no `-r' option, the working file will be compared
+ with the revision it was based on. With one `-r', that revision
+ will be compared to your current working file. With two `-r'
+ options those two revisions will be compared (and your working file
+ will not affect the outcome in any way).
+
+ One or both `-r' options can be replaced by a `-D DATE' option,
+ described above.
+
+ The following options specify the format of the output. They have
+the same meaning as in GNU diff. Most options have two equivalent
+names, one of which is a single letter preceded by `-', and the other of
+which is a long name preceded by `--'.
+
+`-LINES'
+ Show LINES (an integer) lines of context. This option does not
+ specify an output format by itself; it has no effect unless it is
+ combined with `-c' or `-u'. This option is obsolete. For proper
+ operation, `patch' typically needs at least two lines of context.
+
+`-a'
+ Treat all files as text and compare them line-by-line, even if they
+ do not seem to be text.
+
+`-b'
+ Ignore trailing white space and consider all other sequences of one
+ or more white space characters to be equivalent.
+
+`-B'
+ Ignore changes that just insert or delete blank lines.
+
+`--binary'
+ Read and write data in binary mode.
+
+`--brief'
+ Report only whether the files differ, not the details of the
+ differences.
+
+`-c'
+ Use the context output format.
+
+`-C LINES'
+`--context[=LINES]'
+ Use the context output format, showing LINES (an integer) lines of
+ context, or three if LINES is not given. For proper operation,
+ `patch' typically needs at least two lines of context.
+
+`--changed-group-format=FORMAT'
+ Use FORMAT to output a line group containing differing lines from
+ both files in if-then-else format. *Note Line group formats::.
+
+`-d'
+ Change the algorithm to perhaps find a smaller set of changes.
+ This makes `diff' slower (sometimes much slower).
+
+`-e'
+`--ed'
+ Make output that is a valid `ed' script.
+
+`--expand-tabs'
+ Expand tabs to spaces in the output, to preserve the alignment of
+ tabs in the input files.
+
+`-f'
+ Make output that looks vaguely like an `ed' script but has changes
+ in the order they appear in the file.
+
+`-F REGEXP'
+ In context and unified format, for each hunk of differences, show
+ some of the last preceding line that matches REGEXP.
+
+`--forward-ed'
+ Make output that looks vaguely like an `ed' script but has changes
+ in the order they appear in the file.
+
+`-H'
+ Use heuristics to speed handling of large files that have numerous
+ scattered small changes.
+
+`--horizon-lines=LINES'
+ Do not discard the last LINES lines of the common prefix and the
+ first LINES lines of the common suffix.
+
+`-i'
+ Ignore changes in case; consider upper- and lower-case letters
+ equivalent.
+
+`-I REGEXP'
+ Ignore changes that just insert or delete lines that match REGEXP.
+
+`--ifdef=NAME'
+ Make merged if-then-else output using NAME.
+
+`--ignore-all-space'
+ Ignore white space when comparing lines.
+
+`--ignore-blank-lines'
+ Ignore changes that just insert or delete blank lines.
+
+`--ignore-case'
+ Ignore changes in case; consider upper- and lower-case to be the
+ same.
+
+`--ignore-matching-lines=REGEXP'
+ Ignore changes that just insert or delete lines that match REGEXP.
+
+`--ignore-space-change'
+ Ignore trailing white space and consider all other sequences of one
+ or more white space characters to be equivalent.
+
+`--initial-tab'
+ Output a tab rather than a space before the text of a line in
+ normal or context format. This causes the alignment of tabs in the
+ line to look normal.
+
+`-L LABEL'
+ Use LABEL instead of the file name in the context format and
+ unified format headers.
+
+`--label=LABEL'
+ Use LABEL instead of the file name in the context format and
+ unified format headers.
+
+`--left-column'
+ Print only the left column of two common lines in side by side
+ format.
+
+`--line-format=FORMAT'
+ Use FORMAT to output all input lines in if-then-else format. *Note
+ Line formats::.
+
+`--minimal'
+ Change the algorithm to perhaps find a smaller set of changes.
+ This makes `diff' slower (sometimes much slower).
+
+`-n'
+ Output RCS-format diffs; like `-f' except that each command
+ specifies the number of lines affected.
+
+`-N'
+`--new-file'
+ In directory comparison, if a file is found in only one directory,
+ treat it as present but empty in the other directory.
+
+`--new-group-format=FORMAT'
+ Use FORMAT to output a group of lines taken from just the second
+ file in if-then-else format. *Note Line group formats::.
+
+`--new-line-format=FORMAT'
+ Use FORMAT to output a line taken from just the second file in
+ if-then-else format. *Note Line formats::.
+
+`--old-group-format=FORMAT'
+ Use FORMAT to output a group of lines taken from just the first
+ file in if-then-else format. *Note Line group formats::.
+
+`--old-line-format=FORMAT'
+ Use FORMAT to output a line taken from just the first file in
+ if-then-else format. *Note Line formats::.
+
+`-p'
+ Show which C function each change is in.
+
+`--rcs'
+ Output RCS-format diffs; like `-f' except that each command
+ specifies the number of lines affected.
+
+`--report-identical-files'
+`-s'
+ Report when two files are the same.
+
+`--show-c-function'
+ Show which C function each change is in.
+
+`--show-function-line=REGEXP'
+ In context and unified format, for each hunk of differences, show
+ some of the last preceding line that matches REGEXP.
+
+`--side-by-side'
+ Use the side by side output format.
+
+`--speed-large-files'
+ Use heuristics to speed handling of large files that have numerous
+ scattered small changes.
+
+`--suppress-common-lines'
+ Do not print common lines in side by side format.
+
+`-t'
+ Expand tabs to spaces in the output, to preserve the alignment of
+ tabs in the input files.
+
+`-T'
+ Output a tab rather than a space before the text of a line in
+ normal or context format. This causes the alignment of tabs in the
+ line to look normal.
+
+`--text'
+ Treat all files as text and compare them line-by-line, even if they
+ do not appear to be text.
+
+`-u'
+ Use the unified output format.
+
+`--unchanged-group-format=FORMAT'
+ Use FORMAT to output a group of common lines taken from both files
+ in if-then-else format. *Note Line group formats::.
+
+`--unchanged-line-format=FORMAT'
+ Use FORMAT to output a line common to both files in if-then-else
+ format. *Note Line formats::.
+
+`-U LINES'
+`--unified[=LINES]'
+ Use the unified output format, showing LINES (an integer) lines of
+ context, or three if LINES is not given. For proper operation,
+ `patch' typically needs at least two lines of context.
+
+`-w'
+ Ignore white space when comparing lines.
+
+`-W COLUMNS'
+`--width=COLUMNS'
+ Use an output width of COLUMNS in side by side format.
+
+`-y'
+ Use the side by side output format.
+
+* Menu:
+
+* Line group formats:: Line group formats
+* Line formats:: Line formats
+
+
+File: cvs.info, Node: Line group formats, Next: Line formats, Up: diff
options
+
+A.9.1.1 Line group formats
+..........................
+
+Line group formats let you specify formats suitable for many
+applications that allow if-then-else input, including programming
+languages and text formatting languages. A line group format specifies
+the output format for a contiguous group of similar lines.
+
+ For example, the following command compares the TeX file `myfile'
+with the original version from the repository, and outputs a merged file
+in which old regions are surrounded by `\begin{em}'-`\end{em}' lines,
+and new regions are surrounded by `\begin{bf}'-`\end{bf}' lines.
+
+ cvs diff \
+ --old-group-format='\begin{em}
+ %<\end{em}
+ ' \
+ --new-group-format='\begin{bf}
+ %>\end{bf}
+ ' \
+ myfile
+
+ The following command is equivalent to the above example, but it is a
+little more verbose, because it spells out the default line group
+formats.
+
+ cvs diff \
+ --old-group-format='\begin{em}
+ %<\end{em}
+ ' \
+ --new-group-format='\begin{bf}
+ %>\end{bf}
+ ' \
+ --unchanged-group-format='%=' \
+ --changed-group-format='\begin{em}
+ %<\end{em}
+ \begin{bf}
+ %>\end{bf}
+ ' \
+ myfile
+
+ Here is a more advanced example, which outputs a diff listing with
+headers containing line numbers in a "plain English" style.
+
+ cvs diff \
+ --unchanged-group-format='' \
+ --old-group-format='-------- %dn line%(n=1?:s) deleted at %df:
+ %<' \
+ --new-group-format='-------- %dN line%(N=1?:s) added after %de:
+ %>' \
+ --changed-group-format='-------- %dn line%(n=1?:s) changed at %df:
+ %<-------- to:
+ %>' \
+ myfile
+
+ To specify a line group format, use one of the options listed below.
+You can specify up to four line group formats, one for each kind of line
+group. You should quote FORMAT, because it typically contains shell
+metacharacters.
+
+`--old-group-format=FORMAT'
+ These line groups are hunks containing only lines from the first
+ file. The default old group format is the same as the changed
+ group format if it is specified; otherwise it is a format that
+ outputs the line group as-is.
+
+`--new-group-format=FORMAT'
+ These line groups are hunks containing only lines from the second
+ file. The default new group format is same as the changed group
+ format if it is specified; otherwise it is a format that outputs
+ the line group as-is.
+
+`--changed-group-format=FORMAT'
+ These line groups are hunks containing lines from both files. The
+ default changed group format is the concatenation of the old and
+ new group formats.
+
+`--unchanged-group-format=FORMAT'
+ These line groups contain lines common to both files. The default
+ unchanged group format is a format that outputs the line group
+ as-is.
+
+ In a line group format, ordinary characters represent themselves;
+conversion specifications start with `%' and have one of the following
+forms.
+
+`%<'
+ stands for the lines from the first file, including the trailing
+ newline. Each line is formatted according to the old line format
+ (*note Line formats::).
+
+`%>'
+ stands for the lines from the second file, including the trailing
+ newline. Each line is formatted according to the new line format.
+
+`%='
+ stands for the lines common to both files, including the trailing
+ newline. Each line is formatted according to the unchanged line
+ format.
+
+`%%'
+ stands for `%'.
+
+`%c'C''
+ where C is a single character, stands for C. C may not be a
+ backslash or an apostrophe. For example, `%c':'' stands for a
+ colon, even inside the then-part of an if-then-else format, which a
+ colon would normally terminate.
+
+`%c'\O''
+ where O is a string of 1, 2, or 3 octal digits, stands for the
+ character with octal code O. For example, `%c'\0'' stands for a
+ null character.
+
+`FN'
+ where F is a `printf' conversion specification and N is one of the
+ following letters, stands for N's value formatted with F.
+
+ `e'
+ The line number of the line just before the group in the old
+ file.
+
+ `f'
+ The line number of the first line in the group in the old
+ file; equals E + 1.
+
+ `l'
+ The line number of the last line in the group in the old file.
+
+ `m'
+ The line number of the line just after the group in the old
+ file; equals L + 1.
+
+ `n'
+ The number of lines in the group in the old file; equals L - F
+ + 1.
+
+ `E, F, L, M, N'
+ Likewise, for lines in the new file.
+
+ The `printf' conversion specification can be `%d', `%o', `%x', or
+ `%X', specifying decimal, octal, lower case hexadecimal, or upper
+ case hexadecimal output respectively. After the `%' the following
+ options can appear in sequence: a `-' specifying
+ left-justification; an integer specifying the minimum field width;
+ and a period followed by an optional integer specifying the minimum
+ number of digits. For example, `%5dN' prints the number of new
+ lines in the group in a field of width 5 characters, using the
+ `printf' format `"%5d"'.
+
+`(A=B?T:E)'
+ If A equals B then T else E. A and B are each either a decimal
+ constant or a single letter interpreted as above. This format spec
+ is equivalent to T if A's value equals B's; otherwise it is
+ equivalent to E.
+
+ For example, `%(N=0?no:%dN) line%(N=1?:s)' is equivalent to `no
+ lines' if N (the number of lines in the group in the new file) is
+ 0, to `1 line' if N is 1, and to `%dN lines' otherwise.
+
+
+File: cvs.info, Node: Line formats, Prev: Line group formats, Up: diff
options
+
+A.9.1.2 Line formats
+....................
+
+Line formats control how each line taken from an input file is output as
+part of a line group in if-then-else format.
+
+ For example, the following command outputs text with a one-column
+change indicator to the left of the text. The first column of output is
+`-' for deleted lines, `|' for added lines, and a space for unchanged
+lines. The formats contain newline characters where newlines are
+desired on output.
+
+ cvs diff \
+ --old-line-format='-%l
+ ' \
+ --new-line-format='|%l
+ ' \
+ --unchanged-line-format=' %l
+ ' \
+ myfile
+
+ To specify a line format, use one of the following options. You
+should quote FORMAT, since it often contains shell metacharacters.
+
+`--old-line-format=FORMAT'
+ formats lines just from the first file.
+
+`--new-line-format=FORMAT'
+ formats lines just from the second file.
+
+`--unchanged-line-format=FORMAT'
+ formats lines common to both files.
+
+`--line-format=FORMAT'
+ formats all lines; in effect, it sets all three above options
+ simultaneously.
+
+ In a line format, ordinary characters represent themselves;
+conversion specifications start with `%' and have one of the following
+forms.
+
+`%l'
+ stands for the contents of the line, not counting its trailing
+ newline (if any). This format ignores whether the line is
+ incomplete.
+
+`%L'
+ stands for the contents of the line, including its trailing newline
+ (if any). If a line is incomplete, this format preserves its
+ incompleteness.
+
+`%%'
+ stands for `%'.
+
+`%c'C''
+ where C is a single character, stands for C. C may not be a
+ backslash or an apostrophe. For example, `%c':'' stands for a
+ colon.
+
+`%c'\O''
+ where O is a string of 1, 2, or 3 octal digits, stands for the
+ character with octal code O. For example, `%c'\0'' stands for a
+ null character.
+
+`Fn'
+ where F is a `printf' conversion specification, stands for the line
+ number formatted with F. For example, `%.5dn' prints the line
+ number using the `printf' format `"%.5d"'. *Note Line group
+ formats::, for more about printf conversion specifications.
+
+ The default line format is `%l' followed by a newline character.
+
+ If the input contains tab characters and it is important that they
+line up on output, you should ensure that `%l' or `%L' in a line format
+is just after a tab stop (e.g. by preceding `%l' or `%L' with a tab
+character), or you should use the `-t' or `--expand-tabs' option.
+
+ Taken together, the line and line group formats let you specify many
+different formats. For example, the following command uses a format
+similar to `diff''s normal format. You can tailor this command to get
+fine control over `diff''s output.
+
+ cvs diff \
+ --old-line-format='< %l
+ ' \
+ --new-line-format='> %l
+ ' \
+ --old-group-format='%df%(f=l?:,%dl)d%dE
+ %<' \
+ --new-group-format='%dea%dF%(F=L?:,%dL)
+ %>' \
+ --changed-group-format='%df%(f=l?:,%dl)c%dF%(F=L?:,%dL)
+ %<---
+ %>' \
+ --unchanged-group-format='' \
+ myfile
+
+
+File: cvs.info, Node: diff examples, Prev: diff options, Up: diff
+
+A.9.2 diff examples
+-------------------
+
+The following line produces a Unidiff (`-u' flag) between revision 1.14
+and 1.19 of `backend.c'. Due to the `-kk' flag no keywords are
+substituted, so differences that only depend on keyword substitution are
+ignored.
+
+ $ cvs diff -kk -u -r 1.14 -r 1.19 backend.c
+
+ 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:
+
+ $ cvs diff -r RELEASE_1_0 -r EXPR1
+
+ A command like this can be used to produce a context diff between two
+releases:
+
+ $ cvs diff -c -r RELEASE_1_0 -r RELEASE_1_1 > diffs
+
+ 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.
+
+ $ cvs diff -u | less
+
+
+File: cvs.info, Node: export, Next: history, Prev: diff, Up: CVS commands
+
+A.10 export--Export sources from CVS, similar to checkout
+=========================================================
+
+ * Synopsis: export [-flNnR] [-r rev|-D date] [-k subst] [-d dir]
+ module...
+
+ * Requires: repository.
+
+ * Changes: current directory.
+
+ This command is a variant of `checkout'; use it when you want a copy
+of the source for module without the CVS administrative directories.
+For example, you might use `export' to prepare source for shipment
+off-site. This command requires that you specify a date or tag (with
+`-D' or `-r'), so that you can count on reproducing the source you ship
+to others (and thus it always prunes empty directories).
+
+ One often would like to use `-kv' with `cvs export'. This causes any
+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 `-kv', one can no longer use the `ident' command
+(which is part of the RCS suite--see ident(1)) which looks for keyword
+strings. If you want to be able to use `ident' you must not use `-kv'.
+
+* Menu:
+
+* export options:: export options
+
+
+File: cvs.info, Node: export options, Up: export
+
+A.10.1 export options
+---------------------
+
+These standard options are supported by `export' (*note Common
+options::, for a complete description of them):
+
+`-D DATE'
+ Use the most recent revision no later than DATE.
+
+`-f'
+ If no matching revision is found, retrieve the most recent revision
+ (instead of ignoring the file).
+
+`-l'
+ Local; run only in current working directory.
+
+`-n'
+ Do not run any checkout program.
+
+`-R'
+ Export directories recursively. This is on by default.
+
+`-r TAG'
+ Use revision TAG.
+
+ In addition, these options (that are common to `checkout' and
+`export') are also supported:
+
+`-d DIR'
+ Create a directory called DIR for the working files, instead of
+ using the module name. *Note checkout options::, for complete
+ details on how CVS handles this flag.
+
+`-k SUBST'
+ Set keyword expansion mode (*note Substitution modes::).
+
+`-N'
+ Only useful together with `-d DIR'. *Note checkout options::, for
+ complete details on how CVS handles this flag.
+
+
+File: cvs.info, Node: history, Next: import, Prev: export, Up: CVS commands
+
+A.11 history--Show status of files and users
+============================================
+
+ * Synopsis: history [-report] [-flags] [-options args] [files...]
+
+ * Requires: the file `$CVSROOT/CVSROOT/history'
+
+ * Changes: nothing.
+
+ CVS can keep a history file that tracks each use of the `checkout',
+`commit', `rtag', `update', and `release' commands. You can use
+`history' to display this information in various formats.
+
+ Logging must be enabled by creating the file
+`$CVSROOT/CVSROOT/history'.
+
+ *Note: `history' uses `-f', `-l', `-n', and `-p' in ways that
+conflict with the normal use inside CVS (*note Common options::).*
+
+* Menu:
+
+* history options:: history options
+
+
+File: cvs.info, Node: history options, Up: history
+
+A.11.1 history options
+----------------------
+
+Several options (shown above as `-report') control what kind of report
+is generated:
+
+`-c'
+ Report on each time commit was used (i.e., each time the repository
+ was modified).
+
+`-e'
+ Everything (all record types). Equivalent to specifying `-x' with
+ all record types. Of course, `-e' will also include record types
+ which are added in a future version of CVS; if you are writing a
+ script which can only handle certain record types, you'll want to
+ specify `-x'.
+
+`-m MODULE'
+ Report on a particular module. (You can meaningfully use `-m' more
+ than once on the command line.)
+
+`-o'
+ Report on checked-out modules. This is the default report type.
+
+`-T'
+ Report on all tags.
+
+`-x TYPE'
+ Extract a particular set of record types TYPE from the CVS history.
+ The types are indicated by single letters, which you may specify
+ in combination.
+
+ Certain commands have a single record type:
+
+ `F'
+ release
+
+ `O'
+ checkout
+
+ `E'
+ export
+
+ `T'
+ rtag
+
+ One of four record types may result from an update:
+
+ `C'
+ A merge was necessary but collisions were detected (requiring
+ manual merging).
+
+ `G'
+ A merge was necessary and it succeeded.
+
+ `U'
+ A working file was copied from the repository.
+
+ `W'
+ The working copy of a file was deleted during update (because
+ it was gone from the repository).
+
+ One of three record types results from commit:
+
+ `A'
+ A file was added for the first time.
+
+ `M'
+ A file was modified.
+
+ `R'
+ A file was removed.
+
+ The options shown as `-flags' constrain or expand the report without
+requiring option arguments:
+
+`-a'
+ Show data for all users (the default is to show data only for the
+ user executing `history').
+
+`-l'
+ Show last modification only.
+
+`-w'
+ Show only the records for modifications done from the same working
+ directory where `history' is executing.
+
+ The options shown as `-options ARGS' constrain the report based on an
+argument:
+
+`-b STR'
+ Show data back to a record containing the string STR in either
+ the module name, the file name, or the repository path.
+
+`-D DATE'
+ Show data since DATE. This is slightly different from the normal
+ use of `-D DATE', which selects the newest revision older than
+ DATE.
+
+`-f FILE'
+ Show data for a particular file (you can specify several `-f'
+ options on the same command line). This is equivalent to
+ specifying the file on the command line.
+
+`-n MODULE'
+ Show data for a particular module (you can specify several `-n'
+ options on the same command line).
+
+`-p REPOSITORY'
+ Show data for a particular source repository (you can specify
+ several `-p' options on the same command line).
+
+`-r REV'
+ Show records referring to revisions since the revision or tag named
+ REV appears in individual RCS files. Each RCS file is searched for
+ the revision or tag.
+
+`-t TAG'
+ Show records since tag TAG was last added to the history file.
+ This differs from the `-r' flag above in that it reads only the
+ history file, not the RCS files, and is much faster.
+
+`-u NAME'
+ Show records for user NAME.
+
+`-z TIMEZONE'
+ Show times in the selected records using the specified time zone
+ instead of UTC.
+
+
+File: cvs.info, Node: import, Next: log, Prev: history, Up: CVS commands
+
+A.12 import--Import sources into CVS, using vendor branches
+===========================================================
+
+ * Synopsis: import [-options] repository vendortag releasetag...
+
+ * Requires: Repository, source distribution directory.
+
+ * Changes: repository.
+
+ Use `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. *Note Tracking sources::, for a discussion on this subject.
+
+ The REPOSITORY argument gives a directory name (or a path to a
+directory) under the 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 `checkout
+-j' to reconcile the differences, as import instructs you to do.
+
+ If CVS decides a file should be ignored (*note cvsignore::), it does
+not import it and prints `I ' followed by the filename (*note import
+output::, for a complete description of the output).
+
+ If the 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. *Note Wrappers::.
+
+ The outside source is saved in a first-level 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. REPOSITORY is needed to
+identify the collection of source. VENDORTAG is a tag for the entire
+branch (e.g., for 1.1.1). You must also specify at least one RELEASETAG
+to identify the files at the leaves created each time you execute
+`import'.
+
+ Note that `import' does _not_ change the directory in which you
+invoke it. In particular, it does not set up that directory as a CVS
+working directory; if you want to work with the sources import them
+first and then check them out into a different directory (*note Getting
+the source::).
+
+* Menu:
+
+* import options:: import options
+* import output:: import output
+* import examples:: import examples
+
+
+File: cvs.info, Node: import options, Next: import output, Up: import
+
+A.12.1 import options
+---------------------
+
+This standard option is supported by `import' (*note Common options::,
+for a complete description):
+
+`-m MESSAGE'
+ Use MESSAGE as log information, instead of invoking an editor.
+
+ There are the following additional special options.
+
+`-b BRANCH'
+ See *note Multiple vendor branches::.
+
+`-k SUBST'
+ Indicate the 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 *note Substitution
+ modes::, for a list of valid `-k' settings.
+
+`-I 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 !'.
+
+ NAME can be a file name pattern of the same type that you can
+ specify in the `.cvsignore' file. *Note cvsignore::.
+
+`-W SPEC'
+ Specify file names that should be filtered during import. You can
+ use this option repeatedly.
+
+ SPEC can be a file name pattern of the same type that you can
+ specify in the `.cvswrappers' file. *Note Wrappers::.
+
+
+File: cvs.info, Node: import output, Next: import examples, Prev: import
options, Up: import
+
+A.12.2 import output
+--------------------
+
+`import' keeps you informed of its progress by printing a line for each
+file, preceded by one character indicating the status of the file:
+
+`U FILE'
+ The file already exists in the repository and has not been locally
+ modified; a new revision has been created (if necessary).
+
+`N FILE'
+ The file is a new file which has been added to the repository.
+
+`C FILE'
+ The file already exists in the repository but has been locally
+ modified; you will have to merge the changes.
+
+`I FILE'
+ The file is being ignored (*note cvsignore::).
+
+`L FILE'
+ The file is a symbolic link; `cvs import' ignores symbolic links.
+ People periodically suggest that this behavior should be changed,
+ but if there is a consensus on what it should be changed to, it is
+ not apparent. (Various options in the `modules' file can be used
+ to recreate symbolic links on checkout, update, etc.; *note
+ modules::.)
+
+
+File: cvs.info, Node: import examples, Prev: import output, Up: import
+
+A.12.3 import examples
+----------------------
+
+See *note Tracking sources::, and *note From files::.
+
+
+File: cvs.info, Node: log, Next: rdiff, Prev: import, Up: CVS commands
+
+A.13 log--Print out log information for files
+=============================================
+
+ * Synopsis: log [options] [files...]
+
+ * Requires: repository, working directory.
+
+ * Changes: nothing.
+
+ Display log information for files. `log' used to call the RCS
+utility `rlog'. Although this is no longer true in the current sources,
+this history determines the format of the output and the options, which
+are not quite in the style of the other CVS commands.
+
+ The output includes the location of the RCS file, the "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 CVS print times in the local timezone).
+
+ *Note: `log' uses `-R' in a way that conflicts with the normal use
+inside CVS (*note Common options::).*
+
+* Menu:
+
+* log options:: log options
+* log examples:: log examples
+
+
+File: cvs.info, Node: log options, Next: log examples, Up: log
+
+A.13.1 log options
+------------------
+
+By default, `log' prints all information that is available. All other
+options restrict the output.
+
+`-b'
+ Print information about the revisions on the default branch,
+ normally the highest branch on the trunk.
+
+`-d DATES'
+ Print information about revisions with a checkin date/time in the
+ range given by the semicolon-separated list of dates. The date
+ formats accepted are those accepted by the `-D' option to many
+ other CVS commands (*note Common options::). Dates can be combined
+ into ranges as follows:
+
+ `D1<D2'
+ `D2>D1'
+ Select the revisions that were deposited between D1 and D2.
+
+ `<D'
+ `D>'
+ Select all revisions dated D or earlier.
+
+ `D<'
+ `>D'
+ Select all revisions dated D or later.
+
+ `D'
+ Select the single, latest revision dated D or earlier.
+
+ The `>' or `<' characters may be followed by `=' to indicate an
+ inclusive range rather than an exclusive one.
+
+ Note that the separator is a semicolon (;).
+
+`-h'
+ Print only the name of the RCS file, name of the file in the
+ working directory, head, default branch, access list, locks,
+ symbolic names, and suffix.
+
+`-l'
+ Local; run only in current working directory. (Default is to run
+ recursively).
+
+`-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.
+
+`-R'
+ Print only the name of the RCS file.
+
+`-rREVISIONS'
+ Print information about revisions given in the comma-separated list
+ REVISIONS of revisions and ranges. The following table explains
+ the available range formats:
+
+ `REV1:REV2'
+ Revisions REV1 to REV2 (which must be on the same branch).
+
+ `REV1::REV2'
+ The same, but excluding REV1.
+
+ `:REV'
+ `::REV'
+ Revisions from the beginning of the branch up to and including
+ REV.
+
+ `REV:'
+ Revisions starting with REV to the end of the branch
+ containing REV.
+
+ `REV::'
+ Revisions starting just after REV to the end of the branch
+ containing REV.
+
+ `BRANCH'
+ An argument that is a branch means all revisions on that
+ branch.
+
+ `BRANCH1:BRANCH2'
+ `BRANCH1::BRANCH2'
+ A range of branches means all revisions on the branches in
+ that range.
+
+ `BRANCH.'
+ The latest revision in BRANCH.
+
+ A bare `-r' with no revisions means the latest revision on the
+ default branch, normally the trunk. There can be no space between
+ the `-r' option and its argument.
+
+`-S'
+ Suppress the header if no revisions are selected.
+
+`-s STATES'
+ Print information about revisions whose state attributes match one
+ of the states given in the comma-separated list STATES.
+
+`-t'
+ Print the same as `-h', plus the descriptive text.
+
+`-wLOGINS'
+ Print information about revisions checked in by users with login
+ names appearing in the comma-separated list LOGINS. If LOGINS is
+ omitted, the user's login is assumed. There can be no space
+ between the `-w' option and its argument.
+
+ `log' prints the intersection of the revisions selected with the
+options `-d', `-s', and `-w', intersected with the union of the
+revisions selected by `-b' and `-r'.
+
Index: manuals/res/ccvs_info/cvs.info-2
===================================================================
RCS file: manuals/res/ccvs_info/cvs.info-2
diff -N manuals/res/ccvs_info/cvs.info-2
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ manuals/res/ccvs_info/cvs.info-2 26 Apr 2009 18:37:22 -0000 1.1
@@ -0,0 +1,3909 @@
+This is cvs.info, produced by makeinfo version 4.13 from cvs.texi.
+
+INFO-DIR-SECTION GNU Packages
+START-INFO-DIR-ENTRY
+* CVS: (cvs). Concurrent Versions System
+END-INFO-DIR-ENTRY
+INFO-DIR-SECTION Individual utilities
+START-INFO-DIR-ENTRY
+* cvs: (cvs)CVS commands. Concurrent Versions System
+END-INFO-DIR-ENTRY
+
+
+File: cvs.info, Node: log examples, Prev: log options, Up: log
+
+A.13.2 log examples
+-------------------
+
+Contributed examples are gratefully accepted.
+
+
+File: cvs.info, Node: rdiff, Next: release, Prev: log, Up: CVS commands
+
+A.14 rdiff--'patch' format diffs between releases
+=================================================
+
+ * rdiff [-flags] [-V vn] [-r t|-D d [-r t2|-D d2]] modules...
+
+ * Requires: repository.
+
+ * Changes: nothing.
+
+ * Synonym: patch
+
+ 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 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 `-r' and `-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 RCS file.
+
+ Note that if the software release affected is contained in more than
+one directory, then it may be necessary to specify the `-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
+
+
+File: cvs.info, Node: rdiff options, Next: rdiff examples, Up: rdiff
+
+A.14.1 rdiff options
+--------------------
+
+These standard options are supported by `rdiff' (*note Common options::,
+for a complete description of them):
+
+`-D DATE'
+ Use the most recent revision no later than DATE.
+
+`-f'
+ If no matching revision is found, retrieve the most recent revision
+ (instead of ignoring the file).
+
+`-l'
+ Local; don't descend subdirectories.
+
+`-R'
+ Examine directories recursively. This option is on by default.
+
+`-r TAG'
+ Use revision TAG.
+
+ In addition to the above, these options are available:
+
+`-c'
+ Use the context diff format. This is the default format.
+
+`-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.
+
+`-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.
+
+`-u'
+ Use the unidiff format for the context diffs. Remember that old
+ versions of the `patch' program can't handle the unidiff format, so
+ if you plan to post this patch to the net you should probably not
+ use `-u'.
+
+`-V VN'
+ Expand keywords according to the rules current in RCS version VN
+ (the expansion format changed with RCS version 5). Note that this
+ option is no longer accepted. CVS will always expand keywords the
+ way that RCS version 5 does.
+
+
+File: cvs.info, Node: rdiff examples, Prev: rdiff options, Up: rdiff
+
+A.14.2 rdiff examples
+---------------------
+
+Suppose you receive mail from address@hidden asking for an update from
+release 1.2 to 1.4 of the tc compiler. You have no such patches on
+hand, but with CVS that can easily be fixed with a command such as this:
+
+ $ cvs rdiff -c -r FOO1_2 -r FOO1_4 tc | \
+ $$ Mail -s 'The patches you asked for' address@hidden
+
+ Suppose you have made release 1.3, and forked a branch called
+`R_1_3fix' for bugfixes. `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:
+
+ $ 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
+
+
+File: cvs.info, Node: release, Next: update, Prev: rdiff, Up: CVS commands
+
+A.15 release--Indicate that a Module is no longer in use
+========================================================
+
+ * release [-d] directories...
+
+ * Requires: Working directory.
+
+ * Changes: Working directory, history log.
+
+ This command is meant to safely cancel the effect of `cvs checkout'.
+Since 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 CVS history file (*note history file::) that you've
+abandoned your checkout.
+
+ Use `cvs release' to avoid these problems. This command checks that
+no uncommitted changes are present; that you are executing it from
+immediately above a 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, `cvs release' leaves a record of
+its execution (attesting to your intentionally abandoning your checkout)
+in the CVS history log.
+
+* Menu:
+
+* release options:: release options
+* release output:: release output
+* release examples:: release examples
+
+
+File: cvs.info, Node: release options, Next: release output, Up: release
+
+A.15.1 release options
+----------------------
+
+The `release' command supports one command option:
+
+`-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.
+
+ *WARNING: The `release' command deletes all directories and files
+ recursively. 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 `add' command; *note
+ Adding files::) will be silently deleted--even if it is non-empty!*
+
+
+File: cvs.info, Node: release output, Next: release examples, Prev: release
options, Up: release
+
+A.15.2 release output
+---------------------
+
+Before `release' releases your sources it will print a one-line message
+for any file that is not up-to-date.
+
+`U FILE'
+`P FILE'
+ There exists a newer revision of this file in the repository, and
+ you have not modified your local copy of the file (`U' and `P' mean
+ the same thing).
+
+`A 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.
+
+`R 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. *Note commit::.
+
+`M FILE'
+ The file is modified in your working directory. There might also
+ be a newer revision inside the repository.
+
+`? FILE'
+ 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 CVS to ignore (see the description of the `-I' option, and
+ *note cvsignore::). If you remove your working sources, this file
+ will be lost.
+
+
+File: cvs.info, Node: release examples, Prev: release output, Up: release
+
+A.15.3 release examples
+-----------------------
+
+Release the `tc' directory, and delete your local working copy of the
+files.
+
+ $ cd .. # You must stand immediately above the
+ # sources when you issue `cvs release'.
+ $ cvs release -d tc
+ You have [0] altered files in this repository.
+ Are you sure you want to release (and delete) directory `tc': y
+ $
+
+
+File: cvs.info, Node: update, Prev: release, Up: CVS commands
+
+A.16 update--Bring work tree in sync with repository
+====================================================
+
+ * update [-ACdflPpR] [-I name] [-j rev [-j rev]] [-k kflag] [-r
+ tag|-D date] [-W spec] files...
+
+ * Requires: repository, working directory.
+
+ * Changes: working directory.
+
+ 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 `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. Without the
+`-C' option, `update' will also merge any differences between the local
+copy of files and their base revisions into any destination revisions
+specified with `-r', `-D', or `-A'.
+
+* Menu:
+
+* update options:: update options
+* update output:: update output
+
+
+File: cvs.info, Node: update options, Next: update output, Up: update
+
+A.16.1 update options
+---------------------
+
+These standard options are available with `update' (*note Common
+options::, for a complete description of them):
+
+`-D date'
+ Use the most recent revision no later than DATE. This option is
+ sticky, and implies `-P'. See *note Sticky tags::, for more
+ information on sticky tags/dates.
+
+`-f'
+ Only useful with the `-D DATE' or `-r TAG' flags. If no matching
+ revision is found, retrieve the most recent revision (instead of
+ ignoring the file).
+
+`-k KFLAG'
+ Process keywords according to KFLAG. See *note Keyword
+ substitution::. This option is sticky; future updates of this file
+ in this working directory will use the same KFLAG. The `status'
+ command can be viewed to see the sticky options. See *note
+ Invoking CVS::, for more information on the `status' command.
+
+`-l'
+ Local; run only in current working directory. *Note Recursive
+ behavior::.
+
+`-P'
+ Prune empty directories. See *note Moving directories::.
+
+`-p'
+ Pipe files to the standard output.
+
+`-R'
+ Update directories recursively (default). *Note Recursive
+ behavior::.
+
+`-r rev'
+ Retrieve revision/tag REV. This option is sticky, and implies
+ `-P'. See *note Sticky tags::, for more information on sticky
+ tags/dates.
+
+ These special options are also available with `update'.
+
+`-A'
+ Reset any sticky tags, dates, or `-k' options. See *note Sticky
+ tags::, for more information on sticky tags/dates.
+
+`-C'
+ Overwrite locally modified files with clean copies from the
+ repository (the modified file is saved in `.#FILE.REVISION',
+ however).
+
+`-d'
+ Create any directories that exist in the repository if they're
+ missing from the working directory. Normally, `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
+ `-d' will create those directories, which may not be what you want.
+
+`-I NAME'
+ Ignore files whose names match NAME (in your working directory)
+ during the update. You can specify `-I' more than once on the
+ command line to specify several files to ignore. Use `-I !' to
+ avoid ignoring any files at all. *Note cvsignore::, for other ways
+ to make CVS ignore some files.
+
+`-WSPEC'
+ Specify file names that should be filtered during update. You can
+ use this option repeatedly.
+
+ SPEC can be a file name pattern of the same type that you can
+ specify in the `.cvswrappers' file. *Note Wrappers::.
+
+`-jREVISION'
+ With two `-j' options, merge changes from the revision specified
+ with the first `-j' option to the revision specified with the
+ second `j' option, into the working directory.
+
+ With one `-j' option, merge changes from the ancestor revision to
+ the revision specified with the `-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 `-j' option.
+
+ Note that using a single `-j TAGNAME' option rather than `-j
+ BRANCHNAME' to merge changes from a branch will often not remove
+ files which were removed on the branch. *Note Merging adds and
+ removals::, for more.
+
+ 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:
+ `-jSYMBOLIC_TAG:DATE_SPECIFIER'.
+
+ *Note Branching and merging::.
+
+
+File: cvs.info, Node: update output, Prev: update options, Up: update
+
+A.16.2 update output
+--------------------
+
+`update' and `checkout' keep you informed of their progress by printing
+a line for each file, preceded by one character indicating the status of
+the file:
+
+`U 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.
+
+`P FILE'
+ Like `U', but the CVS server sends a patch instead of an entire
+ file. This accomplishes the same thing as `U' using less
+ bandwidth.
+
+`A FILE'
+ The file has been added to your private copy of the sources, and
+ will be added to the source repository when you run `commit' on the
+ file. This is a reminder to you that the file needs to be
+ committed.
+
+`R FILE'
+ The file has been removed from your private copy of the sources,
+ and will be removed from the source repository when you run
+ `commit' on the file. This is a reminder to you that the file
+ needs to be committed.
+
+`M FILE'
+ The file is modified in your working directory.
+
+ `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.
+
+ CVS will print some messages if it merges your work, and a backup
+ copy of your working file (as it looked before you ran `update')
+ will be made. The exact name of that file is printed while
+ `update' runs.
+
+`C FILE'
+ A conflict was detected while trying to merge your changes to FILE
+ with changes from the source repository. FILE (the copy in your
+ working directory) is now the result of attempting to merge the two
+ revisions; an unmodified copy of your file is also in your working
+ directory, with the name `.#FILE.REVISION' where REVISION is the
+ revision that your modified file started from. Resolve the
+ conflict as described in *note Conflicts example::. (Note that
+ some systems automatically purge files that begin with `.#' 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.)
+ Under VMS, the file name starts with `__' rather than `.#'.
+
+`? FILE'
+ 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 CVS to ignore (see the description of the `-I' option, and
+ *note cvsignore::).
+
+
+File: cvs.info, Node: Invoking CVS, Next: Administrative files, Prev: CVS
commands, Up: Top
+
+Annexe B Quick reference to CVS commands
+****************************************
+
+This appendix describes how to invoke CVS, with references to where each
+command or feature is described in detail. For other references run the
+`cvs --help' command, or see *note Index::.
+
+ A CVS command looks like:
+
+ cvs [ GLOBAL_OPTIONS ] COMMAND [ COMMAND_OPTIONS ] [ COMMAND_ARGS ]
+
+ Global options:
+
+`--allow-root=ROOTDIR'
+ Specify legal CVSROOT directory (server only) (not in CVS 1.9 and
+ older). See *note Password authentication server::.
+
+`-a'
+ Authenticate all communication (client only) (not in CVS 1.9 and
+ older). See *note Global options::.
+
+`-b'
+ Specify RCS location (CVS 1.9 and older). See *note Global
+ options::.
+
+`-d ROOT'
+ Specify the CVSROOT. See *note Repository::.
+
+`-e EDITOR'
+ Edit messages with EDITOR. See *note Committing your changes::.
+
+`-f'
+ Do not read the `~/.cvsrc' file. See *note Global options::.
+
+`-H'
+`--help'
+ Print a help message. See *note Global options::.
+
+`-l'
+ Do not log in `$CVSROOT/CVSROOT/history' file. See *note Global
+ options::.
+
+`-n'
+ Do not change any files. See *note Global options::.
+
+`-Q'
+ Be really quiet. See *note Global options::.
+
+`-q'
+ Be somewhat quiet. See *note Global options::.
+
+`-r'
+ Make new working files read-only. See *note Global options::.
+
+`-s VARIABLE=VALUE'
+ Set a user variable. See *note Variables::.
+
+`-T TEMPDIR'
+ Put temporary files in TEMPDIR. See *note Global options::.
+
+`-t'
+ Trace CVS execution. See *note Global options::.
+
+`-v'
+
+`--version'
+ Display version and copyright information for CVS.
+
+`-w'
+ Make new working files read-write. See *note Global options::.
+
+`-x'
+ Encrypt all communication (client only). See *note Global
+ options::.
+
+`-z GZIP-LEVEL'
+ Set the compression level (client only). See *note Global
+ options::.
+
+ Keyword expansion modes (*note Substitution modes::):
+
+ -kkv $Id: cvs.info-2,v 1.1 2009/04/26 18:37:22 pertusus Exp $
+ -kkvl $Id: cvs.info-2,v 1.1 2009/04/26 18:37:22 pertusus Exp $
+ -kk $Id: cvs.info-2,v 1.1 2009/04/26 18:37:22 pertusus Exp $
+ -kv file1,v 1.1 1993/12/09 03:21:13 joe Exp
+ -ko no expansion
+ -kb no expansion, file is binary
+
+ Keywords (*note Keyword list::):
+
+ $Author: pertusus $
+ $Date: 2009/04/26 18:37:22 $
+ $CVSHeader: texi2html/test/manuals/res/ccvs_info/cvs.info-2,v 1.1
2009/04/26 18:37:22 pertusus Exp $
+ $Header:
/cvsroot/texi2html/texi2html/test/manuals/res/ccvs_info/cvs.info-2,v 1.1
2009/04/26 18:37:22 pertusus Exp $
+ $Id: cvs.info-2,v 1.1 2009/04/26 18:37:22 pertusus Exp $
+ $Locker: $
+ $Name: $
+ $RCSfile: cvs.info-2,v $
+ $Revision: 1.1 $
+ $Source:
/cvsroot/texi2html/texi2html/test/manuals/res/ccvs_info/cvs.info-2,v $
+ $State: Exp $
+ $Log: cvs.info-2,v $
+ Revision 1.1 2009/04/26 18:37:22 pertusus
+ minor change ini menus.texi, some files added.
+
+ Revision 1.1 1993/12/09 03:30:17 joe
+ Initial revision
+
+ Commands, command options, and command arguments:
+
+`add [OPTIONS] [FILES...]'
+ Add a new file/directory. See *note Adding files::.
+
+ `-k KFLAG'
+ Set keyword expansion.
+
+ `-m MSG'
+ Set file description.
+
+`admin [OPTIONS] [FILES...]'
+ Administration of history files in the repository. See *note
+ admin::.
+
+ `-b[REV]'
+ Set default branch. See *note Reverting local changes::.
+
+ `-cSTRING'
+ Set comment leader.
+
+ `-kSUBST'
+ Set keyword substitution. See *note Keyword substitution::.
+
+ `-l[REV]'
+ Lock revision REV, or latest revision.
+
+ `-mREV:MSG'
+ Replace the log message of revision REV with MSG.
+
+ `-oRANGE'
+ Delete revisions from the repository. See *note admin
+ options::.
+
+ `-q'
+ Run quietly; do not print diagnostics.
+
+ `-sSTATE[:REV]'
+ Set the state.
+
+ `-t'
+ Set file description from standard input.
+
+ `-tFILE'
+ Set file description from FILE.
+
+ `-t-STRING'
+ Set file description to STRING.
+
+ `-u[REV]'
+ Unlock revision REV, or latest revision.
+
+`annotate [OPTIONS] [FILES...]'
+ Show last revision where each line was modified. See *note
+ annotate::.
+
+ `-D DATE'
+ Annotate the most recent revision no later than DATE. See
+ *note Common options::.
+
+ `-F'
+ Force annotation of binary files. (Without this option,
+ binary files are skipped with a message.)
+
+ `-f'
+ Use head revision if tag/date not found. See *note Common
+ options::.
+
+ `-l'
+ Local; run only in current working directory. *Note Recursive
+ behavior::.
+
+ `-R'
+ Operate recursively (default). *Note Recursive behavior::.
+
+ `-r TAG'
+ Annotate revision TAG. See *note Common options::.
+
+`checkout [OPTIONS] MODULES...'
+ Get a copy of the sources. See *note checkout::.
+
+ `-A'
+ Reset any sticky tags/date/options. See *note Sticky tags::
+ and *note Keyword substitution::.
+
+ `-c'
+ Output the module database. See *note checkout options::.
+
+ `-D DATE'
+ Check out revisions as of DATE (is sticky). See *note Common
+ options::.
+
+ `-d DIR'
+ Check out into DIR. See *note checkout options::.
+
+ `-f'
+ Use head revision if tag/date not found. See *note Common
+ options::.
+
+ `-j REV'
+ Merge in changes. See *note checkout options::.
+
+ `-k KFLAG'
+ Use KFLAG keyword expansion. See *note Substitution modes::.
+
+ `-l'
+ Local; run only in current working directory. *Note Recursive
+ behavior::.
+
+ `-N'
+ Don't "shorten" module paths if -d specified. See *note
+ checkout options::.
+
+ `-n'
+ Do not run module program (if any). See *note checkout
+ options::.
+
+ `-P'
+ Prune empty directories. See *note Moving directories::.
+
+ `-p'
+ Check out files to standard output (avoids stickiness). See
+ *note checkout options::.
+
+ `-R'
+ Operate recursively (default). *Note Recursive behavior::.
+
+ `-r TAG'
+ Checkout revision TAG (is sticky). See *note Common
+ options::.
+
+ `-s'
+ Like -c, but include module status. See *note checkout
+ options::.
+
+`commit [OPTIONS] [FILES...]'
+ Check changes into the repository. See *note commit::.
+
+ `-F FILE'
+ Read log message from FILE. See *note commit options::.
+
+ `-f'
+ Force the file to be committed; disables recursion. See *note
+ commit options::.
+
+ `-l'
+ Local; run only in current working directory. See *note
+ Recursive behavior::.
+
+ `-m MSG'
+ Use MSG as log message. See *note commit options::.
+
+ `-n'
+ Do not run module program (if any). See *note commit
+ options::.
+
+ `-R'
+ Operate recursively (default). *Note Recursive behavior::.
+
+ `-r REV'
+ Commit to REV. See *note commit options::.
+
+`diff [OPTIONS] [FILES...]'
+ Show differences between revisions. See *note diff::. In addition
+ to the options shown below, accepts a wide variety of options to
+ control output style, for example `-c' for context diffs.
+
+ `-D DATE1'
+ Diff revision for date against working file. See *note diff
+ options::.
+
+ `-D DATE2'
+ Diff REV1/DATE1 against DATE2. See *note diff options::.
+
+ `-l'
+ Local; run only in current working directory. See *note
+ Recursive behavior::.
+
+ `-N'
+ Include diffs for added and removed files. See *note diff
+ options::.
+
+ `-R'
+ Operate recursively (default). *Note Recursive behavior::.
+
+ `-r REV1'
+ Diff revision for REV1 against working file. See *note diff
+ options::.
+
+ `-r REV2'
+ Diff REV1/DATE1 against REV2. See *note diff options::.
+
+`edit [OPTIONS] [FILES...]'
+ Get ready to edit a watched file. See *note Editing files::.
+
+ `-a ACTIONS'
+ Specify actions for temporary watch, where ACTIONS is `edit',
+ `unedit', `commit', `all', or `none'. See *note Editing
+ files::.
+
+ `-l'
+ Local; run only in current working directory. See *note
+ Recursive behavior::.
+
+ `-R'
+ Operate recursively (default). *Note Recursive behavior::.
+
+`editors [OPTIONS] [FILES...]'
+ See who is editing a watched file. See *note Watch information::.
+
+ `-l'
+ Local; run only in current working directory. See *note
+ Recursive behavior::.
+
+ `-R'
+ Operate recursively (default). *Note Recursive behavior::.
+
+`export [OPTIONS] MODULES...'
+ Export files from CVS. See *note export::.
+
+ `-D DATE'
+ Check out revisions as of DATE. See *note Common options::.
+
+ `-d DIR'
+ Check out into DIR. See *note export options::.
+
+ `-f'
+ Use head revision if tag/date not found. See *note Common
+ options::.
+
+ `-k KFLAG'
+ Use KFLAG keyword expansion. See *note Substitution modes::.
+
+ `-l'
+ Local; run only in current working directory. *Note Recursive
+ behavior::.
+
+ `-N'
+ Don't "shorten" module paths if -d specified. See *note
+ export options::.
+
+ `-n'
+ Do not run module program (if any). See *note export
+ options::.
+
+ `-R'
+ Operate recursively (default). *Note Recursive behavior::.
+
+ `-r TAG'
+ Checkout revision TAG. See *note Common options::.
+
+`history [OPTIONS] [FILES...]'
+ Show repository access history. See *note history::.
+
+ `-a'
+ All users (default is self). See *note history options::.
+
+ `-b STR'
+ Back to record with STR in module/file/repos field. See *note
+ history options::.
+
+ `-c'
+ Report on committed (modified) files. See *note history
+ options::.
+
+ `-D DATE'
+ Since DATE. See *note history options::.
+
+ `-e'
+ Report on all record types. See *note history options::.
+
+ `-l'
+ Last modified (committed or modified report). See *note
+ history options::.
+
+ `-m MODULE'
+ Report on MODULE (repeatable). See *note history options::.
+
+ `-n MODULE'
+ In MODULE. See *note history options::.
+
+ `-o'
+ Report on checked out modules. See *note history options::.
+
+ `-p REPOSITORY'
+ In REPOSITORY. See *note history options::.
+
+ `-r REV'
+ Since revision REV. See *note history options::.
+
+ `-T'
+ Produce report on all TAGs. See *note history options::.
+
+ `-t TAG'
+ Since tag record placed in history file (by anyone). See
+ *note history options::.
+
+ `-u USER'
+ For user USER (repeatable). See *note history options::.
+
+ `-w'
+ Working directory must match. See *note history options::.
+
+ `-x TYPES'
+ Report on TYPES, one or more of `TOEFWUCGMAR'. See *note
+ history options::.
+
+ `-z ZONE'
+ Output for time zone ZONE. See *note history options::.
+
+`import [OPTIONS] REPOSITORY VENDOR-TAG RELEASE-TAGS...'
+ Import files into CVS, using vendor branches. See *note import::.
+
+ `-b BRA'
+ Import to vendor branch BRA. See *note Multiple vendor
+ branches::.
+
+ `-d'
+ Use the file's modification time as the time of import. See
+ *note import options::.
+
+ `-k KFLAG'
+ Set default keyword substitution mode. See *note import
+ options::.
+
+ `-m MSG'
+ Use MSG for log message. See *note import options::.
+
+ `-I IGN'
+ More files to ignore (! to reset). See *note import
+ options::.
+
+ `-W SPEC'
+ More wrappers. See *note import options::.
+
+`init'
+ Create a CVS repository if it doesn't exist. See *note Creating a
+ repository::.
+
+`kserver'
+ Kerberos authenticated server. See *note Kerberos authenticated::.
+
+`log [OPTIONS] [FILES...]'
+ Print out history information for files. See *note log::.
+
+ `-b'
+ Only list revisions on the default branch. See *note log
+ options::.
+
+ `-d DATES'
+ Specify dates (D1<D2 for range, D for latest before). See
+ *note log options::.
+
+ `-h'
+ Only print header. See *note log options::.
+
+ `-l'
+ Local; run only in current working directory. See *note
+ Recursive behavior::.
+
+ `-N'
+ Do not list tags. See *note log options::.
+
+ `-R'
+ Only print name of RCS file. See *note log options::.
+
+ `-rREVS'
+ Only list revisions REVS. See *note log options::.
+
+ `-s STATES'
+ Only list revisions with specified states. See *note log
+ options::.
+
+ `-t'
+ Only print header and descriptive text. See *note log
+ options::.
+
+ `-wLOGINS'
+ Only list revisions checked in by specified logins. See *note
+ log options::.
+
+`login'
+ Prompt for password for authenticating server. See *note Password
+ authentication client::.
+
+`logout'
+ Remove stored password for authenticating server. See *note
+ Password authentication client::.
+
+`pserver'
+ Password authenticated server. See *note Password authentication
+ server::.
+
+`rannotate [OPTIONS] [MODULES...]'
+ Show last revision where each line was modified. See *note
+ annotate::.
+
+ `-D DATE'
+ Annotate the most recent revision no later than DATE. See
+ *note Common options::.
+
+ `-F'
+ Force annotation of binary files. (Without this option,
+ binary files are skipped with a message.)
+
+ `-f'
+ Use head revision if tag/date not found. See *note Common
+ options::.
+
+ `-l'
+ Local; run only in current working directory. *Note Recursive
+ behavior::.
+
+ `-R'
+ Operate recursively (default). *Note Recursive behavior::.
+
+ `-r TAG'
+ Annotate revision TAG. See *note Common options::.
+
+`rdiff [OPTIONS] MODULES...'
+ Show differences between releases. See *note rdiff::.
+
+ `-c'
+ Context diff output format (default). See *note rdiff
+ options::.
+
+ `-D DATE'
+ Select revisions based on DATE. See *note Common options::.
+
+ `-f'
+ Use head revision if tag/date not found. See *note Common
+ options::.
+
+ `-l'
+ Local; run only in current working directory. See *note
+ Recursive behavior::.
+
+ `-R'
+ Operate recursively (default). *Note Recursive behavior::.
+
+ `-r REV'
+ Select revisions based on REV. See *note Common options::.
+
+ `-s'
+ Short patch - one liner per file. See *note rdiff options::.
+
+ `-t'
+ Top two diffs - last change made to the file. See *note diff
+ options::.
+
+ `-u'
+ Unidiff output format. See *note rdiff options::.
+
+ `-V VERS'
+ Use RCS Version VERS for keyword expansion (obsolete). See
+ *note rdiff options::.
+
+`release [OPTIONS] DIRECTORY'
+ Indicate that a directory is no longer in use. See *note
+ release::.
+
+ `-d'
+ Delete the given directory. See *note release options::.
+
+`remove [OPTIONS] [FILES...]'
+ Remove an entry from the repository. See *note Removing files::.
+
+ `-f'
+ Delete the file before removing it. See *note Removing
+ files::.
+
+ `-l'
+ Local; run only in current working directory. See *note
+ Recursive behavior::.
+
+ `-R'
+ Operate recursively (default). *Note Recursive behavior::.
+
+`rlog [OPTIONS] [FILES...]'
+ Print out history information for modules. See *note log::.
+
+ `-b'
+ Only list revisions on the default branch. See *note log
+ options::.
+
+ `-d DATES'
+ Specify dates (D1<D2 for range, D for latest before). See
+ *note log options::.
+
+ `-h'
+ Only print header. See *note log options::.
+
+ `-l'
+ Local; run only in current working directory. See *note
+ Recursive behavior::.
+
+ `-N'
+ Do not list tags. See *note log options::.
+
+ `-R'
+ Only print name of RCS file. See *note log options::.
+
+ `-rREVS'
+ Only list revisions REVS. See *note log options::.
+
+ `-s STATES'
+ Only list revisions with specified states. See *note log
+ options::.
+
+ `-t'
+ Only print header and descriptive text. See *note log
+ options::.
+
+ `-wLOGINS'
+ Only list revisions checked in by specified logins. See *note
+ log options::.
+
+`rtag [OPTIONS] TAG MODULES...'
+ Add a symbolic tag to a module. See *note Revisions:: and *note
+ Branching and merging::.
+
+ `-a'
+ Clear tag from removed files that would not otherwise be
+ tagged. See *note Tagging add/remove::.
+
+ `-b'
+ Create a branch named TAG. See *note Branching and merging::.
+
+ `-B'
+ Used in conjunction with -F or -d, enables movement and
+ deletion of branch tags. Use with extreme caution.
+
+ `-D DATE'
+ Tag revisions as of DATE. See *note Tagging by date/tag::.
+
+ `-d'
+ Delete TAG. See *note Modifying tags::.
+
+ `-F'
+ Move TAG if it already exists. See *note Modifying tags::.
+
+ `-f'
+ Force a head revision match if tag/date not found. See *note
+ Tagging by date/tag::.
+
+ `-l'
+ Local; run only in current working directory. See *note
+ Recursive behavior::.
+
+ `-n'
+ No execution of tag program. See *note Common options::.
+
+ `-R'
+ Operate recursively (default). *Note Recursive behavior::.
+
+ `-r REV'
+ Tag existing tag REV. See *note Tagging by date/tag::.
+
+`server'
+ Rsh server. See *note Connecting via rsh::.
+
+`status [OPTIONS] FILES...'
+ Display status information in a working directory. See *note File
+ status::.
+
+ `-l'
+ Local; run only in current working directory. See *note
+ Recursive behavior::.
+
+ `-R'
+ Operate recursively (default). *Note Recursive behavior::.
+
+ `-v'
+ Include tag information for file. See *note Tags::.
+
+`tag [OPTIONS] TAG [FILES...]'
+ Add a symbolic tag to checked out version of files. See *note
+ Revisions:: and *note Branching and merging::.
+
+ `-b'
+ Create a branch named TAG. See *note Branching and merging::.
+
+ `-c'
+ Check that working files are unmodified. See *note Tagging
+ the working directory::.
+
+ `-D DATE'
+ Tag revisions as of DATE. See *note Tagging by date/tag::.
+
+ `-d'
+ Delete TAG. See *note Modifying tags::.
+
+ `-F'
+ Move TAG if it already exists. See *note Modifying tags::.
+
+ `-f'
+ Force a head revision match if tag/date not found. See *note
+ Tagging by date/tag::.
+
+ `-l'
+ Local; run only in current working directory. See *note
+ Recursive behavior::.
+
+ `-R'
+ Operate recursively (default). *Note Recursive behavior::.
+
+ `-r REV'
+ Tag existing tag REV. See *note Tagging by date/tag::.
+
+`unedit [OPTIONS] [FILES...]'
+ Undo an edit command. See *note Editing files::.
+
+ `-l'
+ Local; run only in current working directory. See *note
+ Recursive behavior::.
+
+ `-R'
+ Operate recursively (default). *Note Recursive behavior::.
+
+`update [OPTIONS] [FILES...]'
+ Bring work tree in sync with repository. See *note update::.
+
+ `-A'
+ Reset any sticky tags/date/options. See *note Sticky tags::
+ and *note Keyword substitution::.
+
+ `-C'
+ Overwrite locally modified files with clean copies from the
+ repository (the modified file is saved in `.#FILE.REVISION',
+ however).
+
+ `-D DATE'
+ Check out revisions as of DATE (is sticky). See *note Common
+ options::.
+
+ `-d'
+ Create directories. See *note update options::.
+
+ `-f'
+ Use head revision if tag/date not found. See *note Common
+ options::.
+
+ `-I IGN'
+ More files to ignore (! to reset). See *note import
+ options::.
+
+ `-j REV'
+ Merge in changes. See *note update options::.
+
+ `-k KFLAG'
+ Use KFLAG keyword expansion. See *note Substitution modes::.
+
+ `-l'
+ Local; run only in current working directory. *Note Recursive
+ behavior::.
+
+ `-P'
+ Prune empty directories. See *note Moving directories::.
+
+ `-p'
+ Check out files to standard output (avoids stickiness). See
+ *note update options::.
+
+ `-R'
+ Operate recursively (default). *Note Recursive behavior::.
+
+ `-r TAG'
+ Checkout revision TAG (is sticky). See *note Common
+ options::.
+
+ `-W SPEC'
+ More wrappers. See *note import options::.
+
+`version'
+ Display the version of CVS being used. If the repository is
+ remote, display both the client and server versions.
+
+`watch [on|off|add|remove] [OPTIONS] [FILES...]'
+ on/off: turn on/off read-only checkouts of files. See *note
+ Setting a watch::.
+
+ add/remove: add or remove notification on actions. See *note
+ Getting Notified::.
+
+ `-a ACTIONS'
+ Specify actions for temporary watch, where ACTIONS is `edit',
+ `unedit', `commit', `all', or `none'. See *note Editing
+ files::.
+
+ `-l'
+ Local; run only in current working directory. See *note
+ Recursive behavior::.
+
+ `-R'
+ Operate recursively (default). *Note Recursive behavior::.
+
+`watchers [OPTIONS] [FILES...]'
+ See who is watching a file. See *note Watch information::.
+
+ `-l'
+ Local; run only in current working directory. See *note
+ Recursive behavior::.
+
+ `-R'
+ Operate recursively (default). *Note Recursive behavior::.
+
+
+File: cvs.info, Node: Administrative files, Next: Environment variables,
Prev: Invoking CVS, Up: Top
+
+Annexe C Reference manual for Administrative files
+**************************************************
+
+Inside the repository, in the directory `$CVSROOT/CVSROOT', there are a
+number of supportive files for CVS. You can use CVS in a limited
+fashion without any of them, but if they are set up properly they can
+help make life easier. For a discussion of how to edit them, see *note
+Intro administrative files::.
+
+ The most important of these files is the `modules' file, which
+defines the modules inside the repository.
+
+* Menu:
+
+* modules:: Defining modules
+* Wrappers:: Specify binary-ness based on file name
+* commit files:: The commit support files (commitinfo,
+ verifymsg, editinfo, loginfo)
+* rcsinfo:: Templates for the log messages
+* cvsignore:: Ignoring files via cvsignore
+* checkoutlist:: Adding your own administrative files
+* history file:: History information
+* Variables:: Various variables are expanded
+* config:: Miscellaneous CVS configuration
+
+
+File: cvs.info, Node: modules, Next: Wrappers, Up: Administrative files
+
+C.1 The modules file
+====================
+
+The `modules' file records your definitions of names for collections of
+source code. CVS will use these definitions if you use CVS to update
+the modules file (use normal commands like `add', `commit', etc).
+
+ The `modules' file may contain blank lines and comments (lines
+beginning with `#') as well as module definitions. Long lines can be
+continued on the next line by specifying a backslash (`\') as the last
+character on the line.
+
+ There are three basic types of modules: alias modules, regular
+modules, and ampersand modules. The difference between them is the way
+that they map files in the repository to files in the working directory.
+ In all of the following examples, the top-level repository contains a
+directory called `first-dir', which contains two files, `file1' and
+`file2', and a directory `sdir'. `first-dir/sdir' contains a file
+`sfile'.
+
+* Menu:
+
+* Alias modules:: The simplest kind of module
+* Regular modules::
+* Ampersand modules::
+* Excluding directories:: Excluding directories from a module
+* Module options:: Regular and ampersand modules can take options
+* Module program options:: How the modules "program options" programs
+ are run.
+
+
+File: cvs.info, Node: Alias modules, Next: Regular modules, Up: modules
+
+C.1.1 Alias modules
+-------------------
+
+Alias modules are the simplest kind of module:
+
+`MNAME -a ALIASES...'
+ This represents the simplest way of defining a module MNAME. The
+ `-a' flags the definition as a simple alias: CVS will treat any use
+ of MNAME (as a command argument) as if the list of names ALIASES
+ had been specified instead. ALIASES may contain either other
+ module names or paths. When you use paths in aliases, `checkout'
+ creates all intermediate directories in the working directory, just
+ as if the path had been specified explicitly in the CVS arguments.
+
+ For example, if the modules file contains:
+
+ amodule -a first-dir
+
+then the following two commands are equivalent:
+
+ $ cvs co amodule
+ $ cvs co first-dir
+
+and they each would provide output such as:
+
+ cvs checkout: Updating first-dir
+ U first-dir/file1
+ U first-dir/file2
+ cvs checkout: Updating first-dir/sdir
+ U first-dir/sdir/sfile
+
+
+File: cvs.info, Node: Regular modules, Next: Ampersand modules, Prev: Alias
modules, Up: modules
+
+C.1.2 Regular modules
+---------------------
+
+`MNAME [ options ] DIR [ FILES... ]'
+ In the simplest case, this form of module definition reduces to
+ `MNAME DIR'. This defines all the files in directory DIR as module
+ mname. DIR is a relative path (from `$CVSROOT') to a directory of
+ source in the source repository. In this case, on checkout, a
+ single directory called MNAME is created as a working directory; no
+ intermediate directory levels are used by default, even if DIR was
+ a path involving several directory levels.
+
+ For example, if a module is defined by:
+
+ regmodule first-dir
+
+then regmodule will contain the files from first-dir:
+
+ $ cvs co regmodule
+ cvs checkout: Updating regmodule
+ U regmodule/file1
+ U regmodule/file2
+ cvs checkout: Updating regmodule/sdir
+ U regmodule/sdir/sfile
+ $
+
+ By explicitly specifying files in the module definition after DIR,
+you can select particular files from directory DIR. Here is an example:
+
+ regfiles first-dir/sdir sfile
+
+With this definition, getting the regfiles module will create a single
+working directory `regfiles' containing the file listed, which comes
+from a directory deeper in the CVS source repository:
+
+ $ cvs co regfiles
+ U regfiles/sfile
+ $
+
+
+File: cvs.info, Node: Ampersand modules, Next: Excluding directories, Prev:
Regular modules, Up: modules
+
+C.1.3 Ampersand modules
+-----------------------
+
+A module definition can refer to other modules by including `&MODULE' in
+its definition.
+ MNAME [ options ] &MODULE...
+
+ Then getting the module creates a subdirectory for each such module,
+in the directory containing the module. For example, if modules
+contains
+
+ ampermod &first-dir
+
+then a checkout will create an `ampermod' directory which contains a
+directory called `first-dir', which in turns contains all the
+directories and files which live there. For example, the command
+
+ $ cvs co ampermod
+
+will create the following files:
+
+ ampermod/first-dir/file1
+ ampermod/first-dir/file2
+ ampermod/first-dir/sdir/sfile
+
+ There is one quirk/bug: the messages that CVS prints omit the
+`ampermod', and thus do not correctly display the location to which it
+is checking out the files:
+
+ $ cvs co ampermod
+ cvs checkout: Updating first-dir
+ U first-dir/file1
+ U first-dir/file2
+ cvs checkout: Updating first-dir/sdir
+ U first-dir/sdir/sfile
+ $
+
+ Do not rely on this buggy behavior; it may get fixed in a future
+release of CVS.
+
+
+File: cvs.info, Node: Excluding directories, Next: Module options, Prev:
Ampersand modules, Up: modules
+
+C.1.4 Excluding directories
+---------------------------
+
+An alias module may exclude particular directories from other modules by
+using an exclamation mark (`!') before the name of each directory to be
+excluded.
+
+ For example, if the modules file contains:
+
+ exmodule -a !first-dir/sdir first-dir
+
+then checking out the module `exmodule' will check out everything in
+`first-dir' except any files in the subdirectory `first-dir/sdir'.
+
+
+File: cvs.info, Node: Module options, Next: Module program options, Prev:
Excluding directories, Up: modules
+
+C.1.5 Module options
+--------------------
+
+Either regular modules or ampersand modules can contain options, which
+supply additional information concerning the module.
+
+`-d NAME'
+ Name the working directory something other than the module name.
+
+`-e PROG'
+ Specify a program PROG to run whenever files in a module are
+ exported. PROG runs with a single argument, the module name.
+
+`-o PROG'
+ Specify a program PROG to run whenever files in a module are
+ checked out. PROG runs with a single argument, the module name.
+ See *note Module program options:: for information on how PROG is
+ called.
+
+`-s STATUS'
+ Assign a status to the module. When the module file is printed
+ with `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.
+
+`-t PROG'
+ Specify a program PROG to run whenever files in a module are tagged
+ with `rtag'. PROG runs with two arguments: the module name and the
+ symbolic tag specified to `rtag'. It is not run when `tag' is
+ executed. Generally you will find that taginfo is a better
+ solution (*note user-defined logging::).
+
+ You should also see *note Module program options:: about how the
+"program options" programs are run.
+
+
+File: cvs.info, Node: Module program options, Prev: Module options, Up:
modules
+
+C.1.6 How the modules file "program options" programs are run
+-------------------------------------------------------------
+
+For checkout, rtag, and export, the program is server-based, and as such
+the following applies:-
+
+ If using remote access methods (pserver, ext, etc.), CVS will execute
+this program on the server from a temporary directory. The path is
+searched for this program.
+
+ If using "local access" (on a local or remote NFS file system, i.e.
+repository set just to a path), the program will be executed from the
+newly checked-out tree, if found there, or alternatively searched for in
+the path if not.
+
+ The programs are all run after the operation has effectively
+completed.
+
+
+File: cvs.info, Node: Wrappers, Next: commit files, Prev: modules, Up:
Administrative files
+
+C.2 The cvswrappers file
+========================
+
+Wrappers refers to a CVS feature which lets you control certain settings
+based on the name of the file which is being operated on. The settings
+are `-k' for binary files, and `-m' for nonmergeable text files.
+
+ The `-m' option specifies the merge methodology that should be used
+when a non-binary file is updated. `MERGE' means the usual CVS
+behavior: try to merge the files. `COPY' means that `cvs update' will
+refuse to merge files, as it also does for files specified as binary
+with `-kb' (but if the file is specified as binary, there is no need to
+specify `-m 'COPY''). CVS will provide the user with the two versions
+of the files, and require the user using mechanisms outside CVS, to
+insert any necessary changes.
+
+ *WARNING: do not use `COPY' with CVS 1.9 or earlier - such versions
+of CVS will copy one version of your file over the other, wiping out the
+previous contents.* The `-m' wrapper option only affects behavior when
+merging is done on update; it does not affect how files are stored. See
+*note Binary files::, for more on binary files.
+
+ The basic format of the file `cvswrappers' is:
+
+ wildcard [option value][option value]...
+
+ where option is one of
+ -m update methodology value: MERGE or COPY
+ -k keyword expansion value: expansion mode
+
+ and value is a single-quote delimited value.
+
+ For example, the following command imports a directory, treating
+files whose name ends in `.exe' as binary:
+
+ cvs import -I ! -W "*.exe -k 'b'" first-dir vendortag reltag
+
+
+File: cvs.info, Node: commit files, Next: rcsinfo, Prev: Wrappers, Up:
Administrative files
+
+C.3 The commit support files
+============================
+
+The `-i' flag in the `modules' file can be used to run a certain program
+whenever files are committed (*note 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.
+
+`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.
+
+`verifymsg'
+ The specified program is used to evaluate the log message, and
+ possibly verify that it contains all required fields. This is most
+ useful in combination with the `rcsinfo' file, which can hold a log
+ message template (*note rcsinfo::).
+
+`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 `rcsinfo' file, which can hold a log
+ message template (*note rcsinfo::). (obsolete)
+
+`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... Your imagination is
+ the limit!
+
+* Menu:
+
+* syntax:: The common syntax
+* commitinfo:: Pre-commit checking
+* verifymsg:: How are log messages evaluated?
+* editinfo:: Specifying how log messages are created
+ (obsolete)
+* loginfo:: Where should log messages be sent?
+
+
+File: cvs.info, Node: syntax, Next: commitinfo, Up: commit files
+
+C.3.1 The common syntax
+-----------------------
+
+The administrative files such as `commitinfo', `loginfo', `rcsinfo',
+`verifymsg', etc., 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:
+ * A regular expression. This is a basic regular expression in the
+ syntax used by GNU emacs.
+
+ * A whitespace separator--one or more spaces and/or tabs.
+
+ * A file name or command-line template.
+
+Blank lines are ignored. Lines that start with the character `#' are
+treated as comments. Long lines unfortunately can _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.
+
+
+File: cvs.info, Node: commitinfo, Next: verifymsg, Prev: syntax, Up:
commit files
+
+C.3.2 Commitinfo
+----------------
+
+The `commitinfo' file defines programs to execute whenever `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 `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 directory
+within the repository will be used. If the command returns a non-zero
+exit status the commit will be aborted.
+
+ If the repository name does not match any of the regular expressions
+in this file, the `DEFAULT' line is used, if it is specified.
+
+ All occurrences of the name `ALL' appearing as a regular expression
+are used in addition to the first matching regular expression or the
+name `DEFAULT'.
+
+ The command will be run in the root of the workspace containing the
+new versions of any files the user would like to modify (commit), _or in
+a copy of the workspace on the server (*note Remote repositories::)_.
+If a file is being removed, there will be no copy of the file under the
+current directory. If a file is being added, there will be no
+corresponding archive file in the repository unless the file is being
+resurrected.
+
+ Note that both the repository directory and the corresponding Attic
+(*note Attic::) directory may need to be checked to locate the archive
+file corresponding to any given file being committed. Much of the
+information about the specific commit request being made, including the
+destination branch, commit message, and command line options specified,
+is not available to the command.
+
+
+File: cvs.info, Node: verifymsg, Next: editinfo, Prev: commitinfo, Up:
commit files
+
+C.3.3 Verifying log messages
+----------------------------
+
+Once you have entered a log message, you can evaluate that message to
+check for specific content, such as a bug ID. Use the `verifymsg' file
+to specify a program that is used to verify the log message. This
+program could be a simple script that checks that the entered message
+contains the required fields.
+
+ The `verifymsg' file is often most useful together with the `rcsinfo'
+file, which can be used to specify a log message template.
+
+ Each line in the `verifymsg' 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 `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 verification script
+in a directory, and then overriding it in a subdirectory.
+
+ If the repository name does not match any of the regular expressions
+in this file, the `DEFAULT' line is used, if it is specified.
+
+ If the verification script exits with a non-zero exit status, the
+commit is aborted.
+
+ In the default configuration, CVS allows the verification script to
+change the log message. This is controlled via the RereadLogAfterVerify
+CVSROOT/config option.
+
+ When `RereadLogAfterVerify=always' or `RereadLogAfterVerify=stat',
+the log message will either always be reread after the verification
+script is run or reread only if the log message file status has changed.
+
+ *Note config::, for more on CVSROOT/config options.
+
+ It is NOT a good idea for a `verifymsg' script to interact directly
+with the user in the various client/server methods. For the `pserver'
+method, there is no protocol support for communicating between
+`verifymsg' and the client on the remote end. For the `ext' and `server'
+methods, it is possible for CVS to become confused by the characters
+going along the same channel as the CVS protocol messages. See *note
+Remote repositories::, for more information on client/server setups. In
+addition, at the time the `verifymsg' script runs, the CVS server has
+locks in place in the repository. If control is returned to the user
+here then other users may be stuck waiting for access to the repository.
+
+ This option can be useful if you find yourself using an rcstemplate
+that needs to be modified to remove empty elements or to fill in default
+values. It can also be useful if the rcstemplate has changed in the
+repository and the CVS/Template was not updated, but is able to be
+adapted to the new format by the verification script that is run by
+`verifymsg'.
+
+ An example of an update might be to change all occurrences of
+'BugId:' to be 'DefectId:' (which can be useful if the rcstemplate has
+recently been changed and there are still checked-out user trees with
+cached copies in the CVS/Template file of the older version).
+
+ Another example of an update might be to delete a line that contains
+'BugID: none' from the log message after validation of that value as
+being allowed is made.
+
+ The following is a little silly example of a `verifymsg' file,
+together with the corresponding `rcsinfo' file, the log message template
+and an verification 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 `/usr/cvssupport/tc.template'.
+
+ BugId:
+
+ The script `/usr/cvssupport/bugid.verify' is used to evaluate the log
+message.
+
+ #!/bin/sh
+ #
+ # bugid.verify filename
+ #
+ # Verify that the log message contains a valid bugid
+ # on the first line.
+ #
+ if head -1 < $1 | grep '^BugId:[ ]*[0-9][0-9]*$' > /dev/null; then
+ exit 0
+ elif head -1 < $1 | grep '^BugId:[ ]*none$' > /dev/null; then
+ # It is okay to allow commits with 'BugId: none',
+ # but do not put that text into the real log message.
+ grep -v '^BugId:[ ]*none$' > $1.rewrite
+ mv $1.rewrite $1
+ exit 0
+ else
+ echo "No BugId found."
+ exit 1
+ fi
+
+ The `verifymsg' file contains this line:
+
+ ^tc /usr/cvssupport/bugid.verify
+
+ The `rcsinfo' file contains this line:
+
+ ^tc /usr/cvssupport/tc.template
+
+ The `config' file contains this line:
+
+ RereadLogAfterVerify=always
+
+
+File: cvs.info, Node: editinfo, Next: loginfo, Prev: verifymsg, Up: commit
files
+
+C.3.4 Editinfo
+--------------
+
+*Note: The `editinfo' feature has been rendered obsolete. To set a
+default editor for log messages use the `CVSEDITOR', `EDITOR'
+environment variables (*note Environment variables::) or the `-e' global
+option (*note Global options::). See *note verifymsg::, for information
+on the use of the `verifymsg' feature for evaluating log messages.*
+
+ If you want to make sure that all log messages look the same way, you
+can use the `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 `editinfo' file, the editor
+specified in the environment variable `$CVSEDITOR' is used instead. If
+that variable is not set, then the environment variable `$EDITOR' is
+used instead. If that variable is not set a default will be used. See
+*note Committing your changes::.
+
+ The `editinfo' file is often most useful together with the `rcsinfo'
+file, which can be used to specify a log message template.
+
+ Each line in the `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 `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.
+
+ If the repository name does not match any of the regular expressions
+in this file, the `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 CVS is accessing a remote repository, or when the `-m' or
+`-F' options to `cvs commit' are used, `editinfo' will not be consulted.
+ There is no good workaround for this; use `verifymsg' instead.
+
+* Menu:
+
+* editinfo example:: Editinfo example
+
+
+File: cvs.info, Node: editinfo example, Up: editinfo
+
+C.3.4.1 Editinfo example
+........................
+
+The following is a little silly example of a `editinfo' file, together
+with the corresponding `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 `/usr/cvssupport/tc.template'.
+
+ BugId:
+
+ The script `/usr/cvssupport/bugid.edit' is used to edit the log
+message.
+
+ #!/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
+
+ The `editinfo' file contains this line:
+
+ ^tc /usr/cvssupport/bugid.edit
+
+ The `rcsinfo' file contains this line:
+
+ ^tc /usr/cvssupport/tc.template
+
+
+File: cvs.info, Node: loginfo, Prev: editinfo, Up: commit files
+
+C.3.5 Loginfo
+-------------
+
+The `loginfo' file is used to control where `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 `$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.
+
+ If the repository name does not match any of the regular expressions
+in this file, the `DEFAULT' line is used, if it is specified.
+
+ All occurrences of the name `ALL' appearing as a regular expression
+are used in addition to the first matching regular expression or
+`DEFAULT'.
+
+ The first matching regular expression is used.
+
+ *Note commit files::, for a description of the syntax of the
+`loginfo' file.
+
+ The user may specify a format string as part of the filter. The
+string is composed of a `%' followed by a space, or followed by a single
+format character, or followed by a set of format characters surrounded
+by `{' and `}' as separators. The format characters are:
+
+s
+ file name
+
+V
+ old version number (pre-checkin)
+
+v
+ new version number (post-checkin)
+
+ All other characters that appear in a format string expand to an
+empty field (commas separating fields are still provided).
+
+ For example, some valid format strings are `%', `%s', `%{s}', and
+`%{sVv}'.
+
+ The output will be a space separated string of tokens enclosed in
+quotation marks ("). Any embedded dollar signs ($), backticks (`),
+backslashes (\), or quotation marks will be preceded by a backslash
+(this allows the shell to correctly parse it as a single string,
+regardless of the characters it contains). For backwards compatibility,
+the first token will be the repository subdirectory. The rest of the
+tokens will be comma-delimited lists of the information requested in the
+format string. For example, if `/u/src/master/yoyodyne/tc' is the
+repository, `%{sVv}' is the format string, and three files (ChangeLog,
+Makefile, foo.c) were modified, the output might be:
+
+ "yoyodyne/tc ChangeLog,1.1,1.2 Makefile,1.3,1.4 foo.c,1.12,1.13"
+
+ As another example, `%{}' means that only the name of the repository
+will be generated.
+
+ Note: when CVS is accessing a remote repository, `loginfo' will be
+run on the _remote_ (i.e., server) side, not the client side (*note
+Remote repositories::).
+
+* Menu:
+
+* loginfo example:: Loginfo example
+* Keeping a checked out copy:: Updating a tree on every checkin
+
+
+File: cvs.info, Node: loginfo example, Next: Keeping a checked out copy,
Up: loginfo
+
+C.3.5.1 Loginfo example
+.......................
+
+The following `loginfo' file, together with the tiny shell-script below,
+appends all log messages to the file `$CVSROOT/CVSROOT/commitlog', and
+any commits to the administrative files (inside the `CVSROOT' directory)
+are also logged in `/usr/adm/cvsroot-log'. Commits to the `prog1'
+directory are mailed to ceder.
+
+ ALL /usr/local/bin/cvs-log $CVSROOT/CVSROOT/commitlog $USER
+ ^CVSROOT /usr/local/bin/cvs-log /usr/adm/cvsroot-log
+ ^prog1 Mail -s %s ceder
+
+ The shell-script `/usr/local/bin/cvs-log' looks like this:
+
+ #!/bin/sh
+ (echo "------------------------------------------------------";
+ echo -n $2" ";
+ date;
+ echo;
+ cat) >> $1
+
+
+File: cvs.info, Node: Keeping a checked out copy, Prev: loginfo example,
Up: loginfo
+
+C.3.5.2 Keeping a checked out copy
+..................................
+
+It is often useful to maintain a directory tree which contains files
+which correspond to the latest version in the repository. For example,
+other developers might want to refer to the latest sources without
+having to check them out, or you might be maintaining a web site with
+CVS and want every checkin to cause the files used by the web server to
+be updated.
+
+ The way to do this is by having loginfo invoke `cvs update'. Doing
+so in the naive way will cause a problem with locks, so the `cvs update'
+must be run in the background. Here is an example for unix (this should
+all be on one line):
+
+ ^cyclic-pages (date; cat; (sleep 2; cd /u/www/local-docs;
+ cvs -q update -d) &) >> $CVSROOT/CVSROOT/updatelog 2>&1
+
+ This will cause checkins to repository directories starting with
+`cyclic-pages' to update the checked out tree in `/u/www/local-docs'.
+
+
+File: cvs.info, Node: rcsinfo, Next: cvsignore, Prev: commit files, Up:
Administrative files
+
+C.4 Rcsinfo
+===========
+
+The `rcsinfo' file can be used to specify a form to edit when filling
+out the commit log. The `rcsinfo' file has a syntax similar to the
+`verifymsg', `commitinfo' and `loginfo' files. *Note syntax::. Unlike
+the other files the second part is _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 `DEFAULT' line is used, if it is specified.
+
+ All occurrences of the name `ALL' appearing as a regular expression
+are used in addition to the first matching regular expression or
+`DEFAULT'.
+
+ The log message template will be used as a default log message. If
+you specify a log message with `cvs commit -m MESSAGE' or `cvs commit -f
+FILE' that log message will override the template.
+
+ *Note verifymsg::, for an example `rcsinfo' file.
+
+ When CVS is accessing a remote repository, the contents of `rcsinfo'
+at the time a directory is first checked out will specify a template.
+This template will be updated on all `cvs update' commands. It will also
+be added to new directories added with a `cvs add new-directry' command.
+ In versions of CVS prior to version 1.12, the `CVS/Template' file was
+not updated. If the CVS server is at version 1.12 or higher an older
+client may be used and the `CVS/Template' will be updated from the
+server.
+
+
+File: cvs.info, Node: cvsignore, Next: checkoutlist, Prev: rcsinfo, Up:
Administrative files
+
+C.5 Ignoring files via cvsignore
+================================
+
+There are certain file names that frequently occur inside your working
+copy, but that you don't want to put under CVS control. Examples are
+all the object files that you get while you compile your sources.
+Normally, when you run `cvs update', it prints a line for each file it
+encounters that it doesn't know about (*note update output::).
+
+ CVS has a list of files (or sh(1) file name patterns) that it should
+ignore while running `update', `import' and `release'. This list is
+constructed in the following way.
+
+ * The list is initialized to include certain file name patterns:
+ names associated with 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:
+
+ 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
+
+ * The per-repository list in `$CVSROOT/CVSROOT/cvsignore' is appended
+ to the list, if that file exists.
+
+ * The per-user list in `.cvsignore' in your home directory is
+ appended to the list, if it exists.
+
+ * Any entries in the environment variable `$CVSIGNORE' is appended to
+ the list.
+
+ * Any `-I' options given to CVS is appended.
+
+ * As CVS traverses through your directories, the contents of any
+ `.cvsignore' will be appended to the list. The patterns found in
+ `.cvsignore' are only valid for the directory that contains them,
+ not for any sub-directories.
+
+ In any of the 5 places listed above, a single exclamation mark (`!')
+clears the ignore list. This can be used if you want to store any file
+which normally is ignored by CVS.
+
+ Specifying `-I !' to `cvs import' will import everything, which is
+generally what you want to do if you are importing files from a pristine
+distribution or any other source which is known to not contain any
+extraneous files. However, looking at the rules above you will see
+there is a fly in the ointment; if the distribution contains any
+`.cvsignore' files, then the patterns from those files will be processed
+even if `-I !' is specified. The only workaround is to remove the
+`.cvsignore' files in order to do the import. Because this is awkward,
+in the future `-I !' might be modified to override `.cvsignore' files in
+each directory.
+
+ Note that the syntax of the ignore files consists of a series of
+lines, each of which contains a space separated list of filenames. This
+offers no clean way to specify filenames which contain spaces, but you
+can use a workaround like `foo?bar' to match a file named `foo bar' (it
+also matches `fooxbar' and the like). Also note that there is currently
+no way to specify comments.
+
+
+File: cvs.info, Node: checkoutlist, Next: history file, Prev: cvsignore,
Up: Administrative files
+
+C.6 The checkoutlist file
+=========================
+
+It may be helpful to use CVS to maintain your own files in the `CVSROOT'
+directory. For example, suppose that you have a script `logcommit.pl'
+which you run by including the following line in the `commitinfo'
+administrative file:
+
+ ALL $CVSROOT/CVSROOT/logcommit.pl
+
+ To maintain `logcommit.pl' with CVS you would add the following line
+to the `checkoutlist' administrative file:
+
+ logcommit.pl
+
+ The format of `checkoutlist' is one line for each file that you want
+to maintain using CVS, giving the name of the file.
+
+ After setting up `checkoutlist' in this fashion, the files listed
+there will function just like CVS's built-in administrative files. For
+example, when checking in one of the files you should get a message such
+as:
+
+ cvs commit: Rebuilding administrative file database
+
+and the checked out copy in the `CVSROOT' directory should be updated.
+
+ Note that listing `passwd' (*note Password authentication server::)
+in `checkoutlist' is not recommended for security reasons.
+
+ For information about keeping a checkout out copy in a more general
+context than the one provided by `checkoutlist', see *note Keeping a
+checked out copy::.
+
+
+File: cvs.info, Node: history file, Next: Variables, Prev: checkoutlist,
Up: Administrative files
+
+C.7 The history file
+====================
+
+The file `$CVSROOT/CVSROOT/history' is used to log information for the
+`history' command (*note history::). This file must be created to turn
+on logging. This is done automatically if the `cvs init' command is
+used to set up the repository (*note Creating a repository::).
+
+ The file format of the `history' file is documented only in comments
+in the CVS source code, but generally programs should use the `cvs
+history' command to access it anyway, in case the format changes with
+future releases of CVS.
+
+
+File: cvs.info, Node: Variables, Next: config, Prev: history file, Up:
Administrative files
+
+C.8 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 CVS is running in.
+There are several mechanisms to do that.
+
+ To find the home directory of the user running CVS (from the `HOME'
+environment variable), use `~' followed by `/' or the end of the line.
+Likewise for the home directory of USER, use `~USER'. These variables
+are expanded on the server machine, and don't get any reasonable
+expansion if pserver (*note Password authenticated::) is in use;
+therefore user variables (see below) may be a better choice to customize
+behavior based on the user running CVS.
+
+ One may want to know about various pieces of information internal to
+CVS. A CVS internal variable has the syntax `${VARIABLE}', where
+VARIABLE starts with a letter and consists of alphanumeric characters
+and `_'. If the character following VARIABLE is a non-alphanumeric
+character other than `_', the `{' and `}' can be omitted. The CVS
+internal variables are:
+
+`CVSROOT'
+ This is the absolute path to the current CVS root directory. *Note
+ Repository::, for a description of the various ways to specify
+ this, but note that the internal variable contains just the
+ directory and not any of the access method information.
+
+`RCSBIN'
+ In CVS 1.9.18 and older, this specified the directory where CVS was
+ looking for RCS programs. Because CVS no longer runs RCS programs,
+ specifying this internal variable is now an error.
+
+`CVSEDITOR'
+`EDITOR'
+`VISUAL'
+ These all expand to the same value, which is the editor that CVS is
+ using. *Note Global options::, for how to specify this.
+
+`USER'
+ Username of the user running CVS (on the CVS server machine). When
+ using pserver, this is the user specified in the repository
+ specification which need not be the same as the username the server
+ is running as (*note Password authentication server::). Do not
+ confuse this with the environment variable of the same name.
+
+ If you want to pass a value to the administrative files which the
+user who is running CVS can specify, use a user variable. To expand a
+user variable, the administrative file contains `${=VARIABLE}'. To set
+a user variable, specify the global option `-s' to CVS, with argument
+`VARIABLE=VALUE'. It may be particularly useful to specify this option
+via `.cvsrc' (*note ~/.cvsrc::).
+
+ For example, if you want the administrative file to refer to a test
+directory you might create a user variable `TESTDIR'. Then if CVS is
+invoked as
+
+ cvs -s TESTDIR=/work/local/tests
+
+and the administrative file contains `sh ${=TESTDIR}/runtests', then
+that string is expanded to `sh /work/local/tests/runtests'.
+
+ All other strings containing `$' are reserved; there is no way to
+quote a `$' character so that `$' represents itself.
+
+ Environment variables passed to administrative files are:
+
+`CVS_USER'
+ The CVS-specific username provided by the user, if it can be
+ provided (currently just for the pserver access method), and to the
+ empty string otherwise. (`CVS_USER' and `USER' may differ when
+ `$CVSROOT/CVSROOT/passwd' is used to map CVS usernames to system
+ usernames.)
+
+`LOGNAME'
+ The username of the system user.
+
+`USER'
+ Same as `LOGNAME'. Do not confuse this with the internal variable
+ of the same name.
+
+
+File: cvs.info, Node: config, Prev: Variables, Up: Administrative files
+
+C.9 The CVSROOT/config configuration file
+=========================================
+
+The administrative file `config' contains various miscellaneous settings
+which affect the behavior of CVS. The syntax is slightly different from
+the other administrative files. Variables are not expanded. Lines
+which start with `#' are considered comments. Other lines consist of a
+keyword, `=', and a value. Note that this syntax is very strict.
+Extraneous spaces or tabs are not permitted.
+
+ Currently defined keywords are:
+
+`RCSBIN=BINDIR'
+ For CVS 1.9.12 through 1.9.18, this setting told CVS to look for
+ RCS programs in the BINDIR directory. Current versions of CVS do
+ not run RCS programs; for compatibility this setting is accepted,
+ but it does nothing.
+
+`SystemAuth=VALUE'
+ If VALUE is `yes', then pserver should check for users in the
+ system's user database if not found in `CVSROOT/passwd'. If it is
+ `no', then all pserver users must exist in `CVSROOT/passwd'. The
+ default is `yes'. For more on pserver, see *note Password
+ authenticated::.
+
+`TopLevelAdmin=VALUE'
+ Modify the `checkout' command to create a `CVS' directory at the
+ top level of the new working directory, in addition to `CVS'
+ directories created within checked-out directories. The default
+ value is `no'.
+
+ This option is useful if you find yourself performing many commands
+ at the top level of your working directory, rather than in one of
+ the checked out subdirectories. The `CVS' directory created there
+ will mean you don't have to specify `CVSROOT' for each command. It
+ also provides a place for the `CVS/Template' file (*note Working
+ directory storage::).
+
+`LockDir=DIRECTORY'
+ Put CVS lock files in DIRECTORY rather than directly in the
+ repository. This is useful if you want to let users read from the
+ repository while giving them write access only to DIRECTORY, not to
+ the repository. It can also be used to put the locks on a very
+ fast in-memory file system to speed up locking and unlocking the
+ repository. You need to create DIRECTORY, but CVS will create
+ subdirectories of DIRECTORY as it needs them. For information on
+ CVS locks, see *note Concurrency::.
+
+ Before enabling the LockDir option, make sure that you have tracked
+ down and removed any copies of CVS 1.9 or older. Such versions
+ neither support LockDir, nor will give an error indicating that
+ they don't support it. The result, if this is allowed to happen,
+ is that some CVS users will put the locks one place, and others
+ will put them another place, and therefore the repository could
+ become corrupted. CVS 1.10 does not support LockDir but it will
+ print a warning if run on a repository with LockDir enabled.
+
+`LogHistory=VALUE'
+ Control what is logged to the `CVSROOT/history' file (*note
+ history::). Default of `TOEFWUCGMAR' (or simply `all') will log
+ all transactions. Any subset of the default is legal. (For
+ example, to only log transactions that modify the `*,v' files, use
+ `LogHistory=TMAR'.)
+
+`RereadLogAfterVerify=VALUE'
+ Modify the `commit' command such that CVS will reread the log
+ message after running the program specified by `verifymsg'. VALUE
+ may be one of `yes' or `always', indicating that the log message
+ should always be reread; `no' or `never', indicating that it should
+ never be reread; or VALUE may be `stat', indicating that the file
+ should be checked with the filesystem `stat()' function to see if
+ it has changed (see warning below) before rereading. The default
+ value is `always'.
+
+ *Note: the `stat' mode can cause CVS to pause for up to one extra
+ second per directory committed. This can be less IO and CPU
+ intensive but is not recommended for use with large repositories*
+
+ *Note verifymsg::, for more information on how verifymsg may be
+ used.
+
+`UserAdminOptions=VALUE'
+ Control what options will be allowed with the `cvs admin' command
+ (*note admin::) for users not in the `cvsadmin' group. The VALUE
+ string is a list of single character options which should be
+ allowed. If a user who is not a member of the `cvsadmin' group
+ tries to execute any `cvs admin' option which is not listed they
+ will will receive an error message reporting that the option is
+ restricted.
+
+ If no `cvsadmin' group exists on the server, CVS will ignore the
+ `UserAdminOptions' keyword (*note admin::).
+
+ When not specified, `UserAdminOptions' defaults to `k'. In other
+ words, it defaults to allowing users outside of the `cvsadmin'
+ group to use the `cvs admin' command only to change the default
+ keyword expansion mode for files.
+
+ As an example, to restrict users not in the `cvsadmin' group to
+ using `cvs admin' to change the default keyword substitution mode,
+ lock revisions, unlock revisions, and replace the log message, use
+ `UserAdminOptions=klum'.
+
+
+File: cvs.info, Node: Environment variables, Next: Compatibility, Prev:
Administrative files, Up: Top
+
+Annexe D All environment variables which affect CVS
+***************************************************
+
+This is a complete list of all environment variables that affect CVS.
+
+`$CVSIGNORE'
+ A whitespace-separated list of file name patterns that CVS should
+ ignore. *Note cvsignore::.
+
+`$CVSWRAPPERS'
+ A whitespace-separated list of file name patterns that CVS should
+ treat as wrappers. *Note Wrappers::.
+
+`$CVSREAD'
+ If this is set, `checkout' and `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.
+
+`$CVSREADONLYFS'
+ Turns on read-only repository mode. This allows one to check out
+ from a read-only repository, such as within an anoncvs server, or
+ from a CDROM repository.
+
+ It has the same effect as if the `-R' command-line option is used.
+ This can also allow the use of read-only NFS repositories.
+
+`$CVSUMASK'
+ Controls permissions of files in the repository. See *note File
+ permissions::.
+
+`$CVSROOT'
+ Should contain the full pathname to the root of the CVS source
+ repository (where the RCS files are kept). This information must
+ be available to CVS for most commands to execute; if `$CVSROOT' is
+ not set, or if you wish to override it for one invocation, you can
+ supply it on the command line: `cvs -d cvsroot cvs_command...' Once
+ you have checked out a working directory, CVS stores the
+ appropriate root (in the file `CVS/Root'), so normally you only
+ need to worry about this when initially checking out a working
+ directory.
+
+`$CVSEDITOR'
+`$EDITOR'
+`$VISUAL'
+ Specifies the program to use for recording log messages during
+ commit. `$CVSEDITOR' overrides `$EDITOR', which overrides
+ `$VISUAL'. See *note Committing your changes:: for more or *note
+ Global options:: for alternative ways of specifying a log editor.
+
+`$PATH'
+ If `$RCSBIN' is not set, and no path is compiled into CVS, it will
+ use `$PATH' to try to find all programs it uses.
+
+`$HOME'
+
+`$HOMEPATH'
+
+`$HOMEDRIVE'
+ Used to locate the directory where the `.cvsrc' file, and other
+ such files, are searched. On Unix, CVS just checks for `HOME'. On
+ Windows NT, the system will set `HOMEDRIVE', for example to `d:'
+ and `HOMEPATH', for example to `\joe'. On Windows 95, you'll
+ probably need to set `HOMEDRIVE' and `HOMEPATH' yourself.
+
+`$CVS_RSH'
+ Specifies the external program which CVS connects with, when
+ `:ext:' access method is specified. *note Connecting via rsh::.
+
+`$CVS_SERVER'
+ Used in client-server mode when accessing a remote repository using
+ RSH. It specifies the name of the program to start on the server
+ side (and any necessary arguments) when accessing a remote
+ repository using the `:ext:', `:fork:', or `:server:' access
+ methods. The default value for `:ext:' and `:server:' is `cvs';
+ the default value for `:fork:' is the name used to run the client.
+ *note Connecting via rsh::
+
+`$CVS_PASSFILE'
+ Used in client-server mode when accessing the `cvs login server'.
+ Default value is `$HOME/.cvspass'. *note Password authentication
+ client::
+
+`$CVS_CLIENT_PORT'
+ Used in client-server mode to set the port to use when accessing
+ the server via Kerberos, GSSAPI, or CVS's password authentication
+ protocol if the port is not specified in the CVSROOT. *note Remote
+ repositories::
+
+`$CVS_RCMD_PORT'
+ Used in client-server mode. If set, specifies the port number to
+ be used when accessing the RCMD demon on the server side.
+ (Currently not used for Unix clients).
+
+`$CVS_CLIENT_LOG'
+ Used for debugging only in client-server mode. If set, everything
+ sent to the server is logged into ``$CVS_CLIENT_LOG'.in' and
+ everything sent from the server is logged into
+ ``$CVS_CLIENT_LOG'.out'.
+
+`$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 specified
+ amount of seconds so that you can attach to it with a debugger.
+
+`$CVS_IGNORE_REMOTE_ROOT'
+ For CVS 1.10 and older, setting this variable prevents CVS from
+ overwriting the `CVS/Root' file when the `-d' global option is
+ specified. Later versions of CVS do not rewrite `CVS/Root', so
+ `CVS_IGNORE_REMOTE_ROOT' has no effect.
+
+`$CVS_LOCAL_BRANCH_NUM'
+ Setting this variable allows some control over the branch number
+ that is assigned. This is specifically to support the local commit
+ feature of CVSup. If one sets `CVS_LOCAL_BRANCH_NUM' to (say) 1000
+ then branches the local repository, the revision numbers will look
+ like 1.66.1000.xx. There is almost a dead-set certainty that there
+ will be no conflicts with version numbers.
+
+`$COMSPEC'
+ Used under OS/2 only. It specifies the name of the command
+ interpreter and defaults to CMD.EXE.
+
+`$TMPDIR'
+`$TMP'
+`$TEMP'
+ Directory in which temporary files are located. The CVS server
+ uses `TMPDIR'. *Note Global options::, for a description of how to
+ specify this. Some parts of CVS will always use `/tmp' (via the
+ `tmpnam' function provided by the system).
+
+ On Windows NT, `TMP' is used (via the `_tempnam' function provided
+ by the system).
+
+ The `patch' program which is used by the CVS client uses `TMPDIR',
+ and if it is not set, uses `/tmp' (at least with GNU patch 2.1).
+ Note that if your server and client are both running CVS 1.9.10 or
+ later, CVS will not invoke an external `patch' program.
+
+`$CVS_PID'
+ This is the process identification (aka pid) number of the CVS
+ process. It is often useful in the programs and/or scripts
+ specified by the `commitinfo', `verifymsg', `loginfo' files.
+
+
+File: cvs.info, Node: Compatibility, Next: Troubleshooting, Prev:
Environment variables, Up: Top
+
+Annexe E Compatibility between CVS Versions
+*******************************************
+
+The repository format is compatible going back to CVS 1.3. But see
+*note Watches Compatibility::, if you have copies of CVS 1.6 or older
+and you want to use the optional developer communication features.
+
+ The working directory format is compatible going back to CVS 1.5. It
+did change between CVS 1.3 and CVS 1.5. If you run CVS 1.5 or newer on
+a working directory checked out with CVS 1.3, CVS will convert it, but
+to go back to CVS 1.3 you need to check out a new working directory with
+CVS 1.3.
+
+ The remote protocol is interoperable going back to CVS 1.5, but no
+further (1.5 was the first official release with the remote protocol,
+but some older versions might still be floating around). In many cases
+you need to upgrade both the client and the server to take advantage of
+new features and bugfixes, however.
+
+
+File: cvs.info, Node: Troubleshooting, Next: Credits, Prev: Compatibility,
Up: Top
+
+Annexe F Troubleshooting
+************************
+
+If you are having trouble with CVS, this appendix may help. If there is
+a particular error message which you are seeing, then you can look up
+the message alphabetically. If not, you can look through the section on
+other problems to see if your problem is mentioned there.
+
+* Menu:
+
+* Error messages:: Partial list of CVS errors
+* Connection:: Trouble making a connection to a CVS server
+* Other problems:: Problems not readily listed by error message
+
+
+File: cvs.info, Node: Error messages, Next: Connection, Up: Troubleshooting
+
+F.1 Partial list of error messages
+==================================
+
+Here is a partial list of error messages that you may see from CVS. It
+is not a complete list--CVS is capable of printing many, many error
+messages, often with parts of them supplied by the operating system, but
+the intention is to list the common and/or potentially confusing error
+messages.
+
+ The messages are alphabetical, but introductory text such as `cvs
+update: ' is not considered in ordering them.
+
+ In some cases the list includes messages printed by old versions of
+CVS (partly because users may not be sure which version of CVS they are
+using at any particular moment).
+
+`FILE:LINE: Assertion 'TEXT' failed'
+ The exact format of this message may vary depending on your system.
+ It indicates a bug in CVS, which can be handled as described in
+ *note BUGS::.
+
+`cvs COMMAND: authorization failed: server HOST rejected access'
+ This is a generic response when trying to connect to a pserver
+ server which chooses not to provide a specific reason for denying
+ authorization. Check that the username and password specified are
+ correct and that the `CVSROOT' specified is allowed by
+ `--allow-root' in `inetd.conf'. See *note Password
+ authenticated::.
+
+`cvs COMMAND: conflict: removed FILE was modified by second party'
+ This message indicates that you removed a file, and someone else
+ modified it. To resolve the conflict, first run `cvs add FILE'.
+ If desired, look at the other party's modification to decide
+ whether you still want to remove it. If you don't want to remove
+ it, stop here. If you do want to remove it, proceed with `cvs
+ remove FILE' and commit your removal.
+
+`cannot change permissions on temporary directory'
+
+ Operation not permitted
+
+ This message has been happening in a non-reproducible, occasional
+ way when we run the client/server testsuite, both on Red Hat Linux
+ 3.0.3 and 4.1. We haven't been able to figure out what causes it,
+ nor is it known whether it is specific to linux (or even to this
+ particular machine!). If the problem does occur on other unices,
+ `Operation not permitted' would be likely to read `Not owner' or
+ whatever the system in question uses for the unix `EPERM' error.
+ If you have any information to add, please let us know as described
+ in *note BUGS::. If you experience this error while using CVS,
+ retrying the operation which produced it should work fine.
+
+`cvs [server aborted]: Cannot check out files into the repository itself'
+ The obvious cause for this message (especially for
+ non-client/server CVS) is that the CVS root is, for example,
+ `/usr/local/cvsroot' and you try to check out files when you are in
+ a subdirectory, such as `/usr/local/cvsroot/test'. However, there
+ is a more subtle cause, which is that the temporary directory on
+ the server is set to a subdirectory of the root (which is also not
+ allowed). If this is the problem, set the temporary directory to
+ somewhere else, for example `/var/tmp'; see `TMPDIR' in *note
+ Environment variables::, for how to set the temporary directory.
+
+`cannot commit files as 'root''
+ See `'root' is not allowed to commit files'.
+
+`cannot open CVS/Entries for reading: No such file or directory'
+ This generally indicates a CVS internal error, and can be handled
+ as with other CVS bugs (*note BUGS::). Usually there is a
+ workaround--the exact nature of which would depend on the situation
+ but which hopefully could be figured out.
+
+`cvs [init aborted]: cannot open CVS/Root: No such file or directory'
+ This message is harmless. Provided it is not accompanied by other
+ errors, the operation has completed successfully. This message
+ should not occur with current versions of CVS, but it is documented
+ here for the benefit of CVS 1.9 and older.
+
+`cvs server: cannot open /root/.cvsignore: Permission denied'
+`cvs [server aborted]: can't chdir(/root): Permission denied'
+ See *note Connection::.
+
+`cvs [checkout aborted]: cannot rename file FILE to CVS/,,FILE: Invalid
argument'
+ This message has been reported as intermittently happening with CVS
+ 1.9 on Solaris 2.5. The cause is unknown; if you know more about
+ what causes it, let us know as described in *note BUGS::.
+
+`cvs [COMMAND aborted]: cannot start server via rcmd'
+ This, unfortunately, is a rather nonspecific error message which
+ CVS 1.9 will print if you are running the CVS client and it is
+ having trouble connecting to the server. Current versions of CVS
+ should print a much more specific error message. If you get this
+ message when you didn't mean to run the client at all, you probably
+ forgot to specify `:local:', as described in *note Repository::.
+
+`ci: FILE,v: bad diff output line: Binary files - and /tmp/T2a22651 differ'
+ CVS 1.9 and older will print this message when trying to check in a
+ binary file if RCS is not correctly installed. Re-read the
+ instructions that came with your RCS distribution and the INSTALL
+ file in the CVS distribution. Alternately, upgrade to a current
+ version of CVS, which checks in files itself rather than via RCS.
+
+`cvs checkout: could not check out FILE'
+ With CVS 1.9, this can mean that the `co' program (part of RCS)
+ returned a failure. It should be preceded by another error
+ message, however it has been observed without another error message
+ and the cause is not well-understood. With the current version of
+ CVS, which does not run `co', if this message occurs without
+ another error message, it is definitely a CVS bug (*note BUGS::).
+
+`cvs [login aborted]: could not find out home directory'
+ This means that you need to set the environment variables that CVS
+ uses to locate your home directory. See the discussion of `HOME',
+ `HOMEDRIVE', and `HOMEPATH' in *note Environment variables::.
+
+`cvs update: could not merge revision REV of FILE: No such file or directory'
+ CVS 1.9 and older will print this message if there was a problem
+ finding the `rcsmerge' program. Make sure that it is in your
+ `PATH', or upgrade to a current version of CVS, which does not
+ require an external `rcsmerge' program.
+
+`cvs [update aborted]: could not patch FILE: No such file or directory'
+ This means that there was a problem finding the `patch' program.
+ Make sure that it is in your `PATH'. Note that despite appearances
+ the message is _not_ referring to whether it can find FILE. If
+ both the client and the server are running a current version of
+ CVS, then there is no need for an external patch program and you
+ should not see this message. But if either client or server is
+ running CVS 1.9, then you need `patch'.
+
+`cvs update: could not patch FILE; will refetch'
+ This means that for whatever reason the client was unable to apply
+ a patch that the server sent. The message is nothing to be
+ concerned about, because inability to apply the patch only slows
+ things down and has no effect on what CVS does.
+
+`dying gasps from SERVER unexpected'
+ There is a known bug in the server for CVS 1.9.18 and older which
+ can cause this. For me, this was reproducible if I used the `-t'
+ global option. It was fixed by Andy Piper's 14 Nov 1997 change to
+ src/filesubr.c, if anyone is curious. If you see the message, you
+ probably can just retry the operation which failed, or if you have
+ discovered information concerning its cause, please let us know as
+ described in *note BUGS::.
+
+`end of file from server (consult above messages if any)'
+ The most common cause for this message is if you are using an
+ external `rsh' program and it exited with an error. In this case
+ the `rsh' program should have printed a message, which will appear
+ before the above message. For more information on setting up a CVS
+ client and server, see *note Remote repositories::.
+
+`cvs [update aborted]: EOF in key in RCS file FILE,v'
+`cvs [checkout aborted]: EOF while looking for end of string in RCS file
FILE,v'
+ This means that there is a syntax error in the given RCS file.
+ Note that this might be true even if RCS can read the file OK; CVS
+ does more error checking of errors in the RCS file. That is why
+ you may see this message when upgrading from CVS 1.9 to CVS 1.10.
+ The likely cause for the original corruption is hardware, the
+ operating system, or the like. Of course, if you find a case in
+ which CVS seems to corrupting the file, by all means report it,
+ (*note BUGS::). There are quite a few variations of this error
+ message, depending on exactly where in the RCS file CVS finds the
+ syntax error.
+
+`cvs commit: Executing 'mkmodules''
+ This means that your repository is set up for a version of CVS
+ prior to CVS 1.8. When using CVS 1.8 or later, the above message
+ will be preceded by
+
+ cvs commit: Rebuilding administrative file database
+
+ If you see both messages, the database is being rebuilt twice,
+ which is unnecessary but harmless. If you wish to avoid the
+ duplication, and you have no versions of CVS 1.7 or earlier in use,
+ remove `-i mkmodules' every place it appears in your `modules'
+ file. For more information on the `modules' file, see *note
+ modules::.
+
+`missing author'
+ Typically this can happen if you created an RCS file with your
+ username set to empty. CVS will, bogusly, create an illegal RCS
+ file with no value for the author field. The solution is to make
+ sure your username is set to a non-empty value and re-create the
+ RCS file.
+
+`cvs [checkout aborted]: no such tag TAG'
+ This message means that CVS isn't familiar with the tag TAG.
+ Usually this means that you have mistyped a tag name; however there
+ are (relatively obscure) cases in which CVS will require you to try
+ a few other CVS commands involving that tag, before you find one
+ which will cause CVS to update the `val-tags' file; see discussion
+ of val-tags in *note File permissions::. You only need to worry
+ about this once for a given tag; when a tag is listed in
+ `val-tags', it stays there. Note that using `-f' to not require
+ tag matches does not override this check; see *note Common
+ options::.
+
+`*PANIC* administration files missing'
+ This typically means that there is a directory named CVS but it
+ does not contain the administrative files which CVS puts in a CVS
+ directory. If the problem is that you created a CVS directory via
+ some mechanism other than CVS, then the answer is simple, use a
+ name other than CVS. If not, it indicates a CVS bug (*note
+ BUGS::).
+
+`rcs error: Unknown option: -x,v/'
+ This message will be followed by a usage message for RCS. It means
+ that you have an old version of RCS (probably supplied with your
+ operating system), as well as an old version of CVS. CVS 1.9.18
+ and earlier only work with RCS version 5 and later; current
+ versions of CVS do not run RCS programs.
+
+`cvs [server aborted]: received broken pipe signal'
+ This message seems to be caused by a hard-to-track-down bug in CVS
+ or the systems it runs on (we don't know--we haven't tracked it
+ down yet!). It seems to happen only after a CVS command has
+ completed, and you should be able to just ignore the message.
+ However, if you have discovered information concerning its cause,
+ please let us know as described in *note BUGS::.
+
+`'root' is not allowed to commit files'
+ When committing a permanent change, CVS makes a log entry of who
+ committed the change. If you are committing the change logged in
+ as "root" (not under "su" or other root-priv giving program), CVS
+ cannot determine who is actually making the change. As such, by
+ default, CVS disallows changes to be committed by users logged in
+ as "root". (You can disable this option by passing the
+ `--enable-rootcommit' option to `configure' and recompiling CVS.
+ On some systems this means editing the appropriate `config.h' file
+ before building CVS.)
+
+`Too many arguments!'
+ This message is typically printed by the `log.pl' script which is
+ in the `contrib' directory in the CVS source distribution. In some
+ versions of CVS, `log.pl' has been part of the default CVS
+ installation. The `log.pl' script gets called from the `loginfo'
+ administrative file. Check that the arguments passed in `loginfo'
+ match what your version of `log.pl' expects. In particular, the
+ `log.pl' from CVS 1.3 and older expects the logfile as an argument
+ whereas the `log.pl' from CVS 1.5 and newer expects the logfile to
+ be specified with a `-f' option. Of course, if you don't need
+ `log.pl' you can just comment it out of `loginfo'.
+
+`cvs [update aborted]: unexpected EOF reading FILE,v'
+ See `EOF in key in RCS file'.
+
+`cvs [login aborted]: unrecognized auth response from SERVER'
+ This message typically means that the server is not set up
+ properly. For example, if `inetd.conf' points to a nonexistent cvs
+ executable. To debug it further, find the log file which inetd
+ writes (`/var/log/messages' or whatever inetd uses on your system).
+ For details, see *note Connection::, and *note Password
+ authentication server::.
+
+`cvs commit: Up-to-date check failed for `FILE''
+ This means that someone else has committed a change to that file
+ since the last time that you did a `cvs update'. So before
+ proceeding with your `cvs commit' you need to `cvs update'. CVS
+ will merge the changes that you made and the changes that the other
+ person made. If it does not detect any conflicts it will report `M
+ FILE' and you are ready to `cvs commit'. If it detects conflicts
+ it will print a message saying so, will report `C FILE', and you
+ need to manually resolve the conflict. For more details on this
+ process see *note Conflicts example::.
+
+`Usage: diff3 [-exEX3 [-i | -m] [-L label1 -L label3]] file1 file2
file3'
+
+ Only one of [exEX3] allowed
+
+ This indicates a problem with the installation of `diff3' and
+ `rcsmerge'. Specifically `rcsmerge' was compiled to look for GNU
+ diff3, but it is finding unix diff3 instead. The exact text of the
+ message will vary depending on the system. The simplest solution
+ is to upgrade to a current version of CVS, which does not rely on
+ external `rcsmerge' or `diff3' programs.
+
+`warning: unrecognized response `TEXT' from cvs server'
+ If TEXT contains a valid response (such as `ok') followed by an
+ extra carriage return character (on many systems this will cause
+ the second part of the message to overwrite the first part), then
+ it probably means that you are using the `:ext:' access method with
+ a version of rsh, such as most non-unix rsh versions, which does
+ not by default provide a transparent data stream. In such cases
+ you probably want to try `:server:' instead of `:ext:'. If TEXT is
+ something else, this may signify a problem with your CVS server.
+ Double-check your installation against the instructions for setting
+ up the CVS server.
+
+`cvs commit: [TIME] waiting for USER's lock in DIRECTORY'
+ This is a normal message, not an error. See *note Concurrency::,
+ for more details.
+
+`cvs commit: warning: editor session failed'
+ This means that the editor which CVS is using exits with a nonzero
+ exit status. Some versions of vi will do this even when there was
+ not a problem editing the file. If so, point the `CVSEDITOR'
+ environment variable to a small script such as:
+
+ #!/bin/sh
+ vi $*
+ exit 0
+
+
+File: cvs.info, Node: Connection, Next: Other problems, Prev: Error
messages, Up: Troubleshooting
+
+F.2 Trouble making a connection to a CVS server
+===============================================
+
+This section concerns what to do if you are having trouble making a
+connection to a CVS server. If you are running the CVS command line
+client running on Windows, first upgrade the client to CVS 1.9.12 or
+later. The error reporting in earlier versions provided much less
+information about what the problem was. If the client is non-Windows,
+CVS 1.9 should be fine.
+
+ If the error messages are not sufficient to track down the problem,
+the next steps depend largely on which access method you are using.
+
+`:ext:'
+ Try running the rsh program from the command line. For example:
+ "rsh servername cvs -v" should print CVS version information. If
+ this doesn't work, you need to fix it before you can worry about
+ CVS problems.
+
+`:server:'
+ You don't need a command line rsh program to use this access
+ method, but if you have an rsh program around, it may be useful as
+ a debugging tool. Follow the directions given for :ext:.
+
+`:pserver:'
+ Errors along the lines of "connection refused" typically indicate
+ that inetd isn't even listening for connections on port 2401
+ whereas errors like "connection reset by peer", "received broken
+ pipe signal", "recv() from server: EOF", or "end of file from
+ server" typically indicate that inetd is listening for connections
+ but is unable to start CVS (this is frequently caused by having an
+ incorrect path in `inetd.conf' or by firewall software rejecting
+ the connection). "unrecognized auth response" errors are caused by
+ a bad command line in `inetd.conf', typically an invalid option or
+ forgetting to put the `pserver' command at the end of the line.
+ Another less common problem is invisible control characters that
+ your editor "helpfully" added without you noticing.
+
+ One good debugging tool is to "telnet servername 2401". After
+ connecting, send any text (for example "foo" followed by return).
+ If CVS is working correctly, it will respond with
+
+ cvs [pserver aborted]: bad auth protocol start: foo
+
+ If instead you get:
+
+ Usage: cvs [cvs-options] command [command-options-and-arguments]
+ ...
+
+ then you're missing the `pserver' command at the end of the line in
+ `inetd.conf'; check to make sure that the entire command is on one
+ line and that it's complete.
+
+ Likewise, if you get something like:
+
+ Unknown command: `pserved'
+
+ CVS commands are:
+ add Add a new file/directory to the repository
+ ...
+
+ then you've misspelled `pserver' in some way. If it isn't obvious,
+ check for invisible control characters (particularly carriage
+ returns) in `inetd.conf'.
+
+ If it fails to work at all, then make sure inetd is working right.
+ Change the invocation in `inetd.conf' to run the echo program
+ instead of cvs. For example:
+
+ 2401 stream tcp nowait root /bin/echo echo hello
+
+ After making that change and instructing inetd to re-read its
+ configuration file, "telnet servername 2401" should show you the
+ text hello and then the server should close the connection. If
+ this doesn't work, you need to fix it before you can worry about
+ CVS problems.
+
+ On AIX systems, the system will often have its own program trying
+ to use port 2401. This is AIX's problem in the sense that port
+ 2401 is registered for use with CVS. I hear that there is an AIX
+ patch available to address this problem.
+
+ Another good debugging tool is the `-d' (debugging) option to
+ inetd. Consult your system documentation for more information.
+
+ If you seem to be connecting but get errors like:
+
+ cvs server: cannot open /root/.cvsignore: Permission denied
+ cvs [server aborted]: can't chdir(/root): Permission denied
+
+ then you probably haven't specified `-f' in `inetd.conf'. (In
+ releases prior to CVS 1.11.1, this problem can be caused by your
+ system setting the `$HOME' environment variable for programs being
+ run by inetd. In this case, you can either have inetd run a shell
+ script that unsets `$HOME' and then runs CVS, or you can use `env'
+ to run CVS with a pristine environment.)
+
+ If you can connect successfully for a while but then can't, you've
+ probably hit inetd's rate limit. (If inetd receives too many
+ requests for the same service in a short period of time, it assumes
+ that something is wrong and temporarily disables the service.)
+ Check your inetd documentation to find out how to adjust the rate
+ limit (some versions of inetd have a single rate limit, others
+ allow you to set the limit for each service separately.)
+
+
+File: cvs.info, Node: Other problems, Prev: Connection, Up: Troubleshooting
+
+F.3 Other common problems
+=========================
+
+Here is a list of problems which do not fit into the above categories.
+They are in no particular order.
+
+ * On Windows, if there is a 30 second or so delay when you run a CVS
+ command, it may mean that you have your home directory set to
+ `C:/', for example (see `HOMEDRIVE' and `HOMEPATH' in *note
+ Environment variables::). CVS expects the home directory to not
+ end in a slash, for example `C:' or `C:\cvs'.
+
+ * If you are running CVS 1.9.18 or older, and `cvs update' finds a
+ conflict and tries to merge, as described in *note Conflicts
+ example::, but doesn't tell you there were conflicts, then you may
+ have an old version of RCS. The easiest solution probably is to
+ upgrade to a current version of CVS, which does not rely on
+ external RCS programs.
+
+
+File: cvs.info, Node: Credits, Next: BUGS, Prev: Troubleshooting, Up: Top
+
+Annexe G Credits
+****************
+
+Roland Pesch, then of Cygnus Support <address@hidden> wrote the manual
+pages which were distributed with CVS 1.3. Much of their text was
+copied into this manual. He also read an early draft of this manual and
+contributed many ideas and corrections.
+
+ The mailing-list `info-cvs' is sometimes informative. I have included
+information from postings made by the following persons: David G. Grubbs
+<address@hidden>.
+
+ Some text has been extracted from the man pages for RCS.
+
+ The CVS FAQ by David G. Grubbs has provided useful material. The FAQ
+is no longer maintained, however, and this manual is about the closest
+thing there is to a successor (with respect to documenting how to use
+CVS, at least).
+
+ In addition, the following persons have helped by telling me about
+mistakes I've made:
+
+ Roxanne Brunskill <address@hidden>,
+ Kathy Dyer <address@hidden>,
+ Karl Pingle <address@hidden>,
+ Thomas A Peterson <address@hidden>,
+ Inge Wallin <address@hidden>,
+ Dirk Koschuetzki <address@hidden>
+ and Michael Brown <address@hidden>.
+
+ The list of contributors here is not comprehensive; for a more
+complete list of who has contributed to this manual see the file
+`doc/ChangeLog' in the CVS source distribution.
+
+
+File: cvs.info, Node: BUGS, Next: Index, Prev: Credits, Up: Top
+
+Annexe H Dealing with bugs in CVS or this manual
+************************************************
+
+Neither CVS nor this manual is perfect, and they probably never will be.
+ If you are having trouble using CVS, or think you have found a bug,
+there are a number of things you can do about it. Note that if the
+manual is unclear, that can be considered a bug in the manual, so these
+problems are often worth doing something about as well as problems with
+CVS itself.
+
+ * If you want someone to help you and fix bugs that you report, there
+ are companies which will do that for a fee. One such company is:
+
+ Ximbiot
+ 319 S. River St.
+ Harrisburg, PA 17104-1657
+ USA
+ Email: address@hidden
+ Phone: (717) 579-6168
+ Fax: (717) 234-3125
+ http://ximbiot.com/
+
+ * If you got CVS through a distributor, such as an operating system
+ vendor or a vendor of freeware CD-ROMs, you may wish to see whether
+ the distributor provides support. Often, they will provide no
+ support or minimal support, but this may vary from distributor to
+ distributor.
+
+ * If you have the skills and time to do so, you may wish to fix the
+ bug yourself. If you wish to submit your fix for inclusion in
+ future releases of CVS, see the file HACKING in the CVS source
+ distribution. It contains much more information on the process of
+ submitting fixes.
+
+ * There may be resources on the net which can help. Two good places
+ to start are:
+
+ http://www.cvshome.org
+ http://www.loria.fr/~molli/cvs-index.html
+
+ If you are so inspired, increasing the information available on the
+ net is likely to be appreciated. For example, before the standard
+ CVS distribution worked on Windows 95, there was a web page with
+ some explanation and patches for running CVS on Windows 95, and
+ various people helped out by mentioning this page on mailing lists
+ or newsgroups when the subject came up.
+
+ * It is also possible to report bugs to `bug-cvs'. Note that someone
+ may or may not want to do anything with your bug report--if you
+ need a solution consider one of the options mentioned above.
+ People probably do want to hear about bugs which are particularly
+ severe in consequences and/or easy to fix, however. You can also
+ increase your odds by being as clear as possible about the exact
+ nature of the bug and any other relevant information. The way to
+ report bugs is to send email to address@hidden'. Note that
+ submissions to `bug-cvs' may be distributed under the terms of the
+ GNU Public License, so if you don't like this, don't submit them.
+ There is usually no justification for sending mail directly to one
+ of the CVS maintainers rather than to `bug-cvs'; those maintainers
+ who want to hear about such bug reports read `bug-cvs'. Also note
+ that sending a bug report to other mailing lists or newsgroups is
+ _not_ a substitute for sending it to `bug-cvs'. It is fine to
+ discuss CVS bugs on whatever forum you prefer, but there are not
+ necessarily any maintainers reading bug reports sent anywhere
+ except `bug-cvs'.
+
+ People often ask if there is a list of known bugs or whether a
+particular bug is a known one. The file BUGS in the CVS source
+distribution is one list of known bugs, but it doesn't necessarily try
+to be comprehensive. Perhaps there will never be a comprehensive,
+detailed list of known bugs.
+
+
+File: cvs.info, Node: Index, Prev: BUGS, Up: Top
+
+Index
+*****
+
+ [index ]
+* Menu:
+
+* `commitinfo': commitinfo. (line 6)
+* `verifymsg' (admin file): verifymsg. (line 6)
+* !, in modules file: Excluding directories.
+ (line 6)
+* #cvs.lock, removing: Concurrency. (line 11)
+* #cvs.lock, technical details: Locks. (line 6)
+* #cvs.rfl, and backups: Backing up. (line 10)
+* #cvs.rfl, removing: Concurrency. (line 11)
+* #cvs.rfl, technical details: Locks. (line 6)
+* #cvs.tfl: Locks. (line 14)
+* #cvs.wfl, removing: Concurrency. (line 11)
+* #cvs.wfl, technical details: Locks. (line 6)
+* &, in modules file: Ampersand modules. (line 6)
+* `verifymsg', changing the log message: verifymsg. (line 31)
+* `verifymsg', changing the log message: config. (line 67)
+* `commitinfo', command environment: commitinfo. (line 30)
+* `commitinfo', working directory: commitinfo. (line 30)
+* -a, in modules file: Alias modules. (line 6)
+* -d, in modules file: Module options. (line 9)
+* -e, in modules file: Module options. (line 12)
+* -e, in modules file: Module program options.
+ (line 6)
+* -j (merging branches): Merging a branch. (line 6)
+* -j (merging branches), and keyword substitution: Merging and keywords.
+ (line 6)
+* -k (keyword substitution): Substitution modes. (line 6)
+* -kk, to avoid conflicts during a merge: Merging and keywords.
+ (line 6)
+* -o, in modules file: Module options. (line 16)
+* -o, in modules file: Module program options.
+ (line 6)
+* -s, in modules file: Module options. (line 22)
+* -t, in modules file: Module options. (line 30)
+* -t, in modules file: Module program options.
+ (line 6)
+* .# files: update output. (line 49)
+* .bashrc, setting CVSROOT in: Specifying a repository.
+ (line 12)
+* .cshrc, setting CVSROOT in: Specifying a repository.
+ (line 12)
+* .cvsrc file: ~/.cvsrc. (line 6)
+* .profile, setting CVSROOT in: Specifying a repository.
+ (line 12)
+* .tcshrc, setting CVSROOT in: Specifying a repository.
+ (line 12)
+* /usr/local/cvsroot, as example repository: Repository. (line 6)
+* :ext:, setting up: Connecting via rsh. (line 32)
+* :ext:, troubleshooting: Connection. (line 16)
+* :fork:, setting up: Connecting via fork. (line 6)
+* :gserver:, setting up: GSSAPI authenticated.
+ (line 6)
+* :kserver:, setting up: Kerberos authenticated.
+ (line 6)
+* :local:, setting up: Repository. (line 19)
+* :pserver:, setting up: Password authentication client.
+ (line 6)
+* :pserver:, troubleshooting: Connection. (line 27)
+* :server:, setting up: Connecting via rsh. (line 32)
+* :server:, troubleshooting: Connection. (line 22)
+* <<<<<<<: Conflicts example. (line 96)
+* =======: Conflicts example. (line 96)
+* >>>>>>>: Conflicts example. (line 96)
+* __ files (VMS): update output. (line 49)
+* Abandoning work: Editing files. (line 33)
+* Access a branch: Accessing branches. (line 6)
+* add (subcommand): Adding files. (line 29)
+* Adding a tag: Tags. (line 46)
+* Adding files: Adding files. (line 6)
+* Admin (subcommand): admin. (line 6)
+* Administrative files (intro): Intro administrative files.
+ (line 6)
+* Administrative files (reference): Administrative files.
+ (line 6)
+* Administrative files, editing them: Intro administrative files.
+ (line 33)
+* Alias modules: Alias modules. (line 6)
+* ALL in commitinfo: commitinfo. (line 26)
+* Ampersand modules: Ampersand modules. (line 6)
+* annotate (subcommand): annotate. (line 6)
+* Atomic transactions, lack of: Concurrency. (line 27)
+* Attic: Attic. (line 6)
+* Authenticated client, using: Password authentication client.
+ (line 6)
+* Authenticating server, setting up: Password authentication server.
+ (line 10)
+* Authentication, stream: Global options. (line 13)
+* Author keyword: Keyword list. (line 8)
+* Automatically ignored files: cvsignore. (line 23)
+* Avoiding editor invocation: Common options. (line 115)
+* Backing up, repository: Backing up. (line 6)
+* Base directory, in CVS directory: Working directory storage.
+ (line 176)
+* BASE, as reserved tag name: Tags. (line 25)
+* BASE, special tag: Common options. (line 148)
+* Baserev file, in CVS directory: Working directory storage.
+ (line 182)
+* Baserev.tmp file, in CVS directory: Working directory storage.
+ (line 190)
+* Bill of materials: Builds. (line 25)
+* Binary files: Binary files. (line 6)
+* Branch merge example: Merging a branch. (line 15)
+* Branch number: Revision numbers. (line 6)
+* Branch number: Branches and revisions.
+ (line 6)
+* Branch tags, deleting: Modifying tags. (line 19)
+* Branch tags, moving: Modifying tags. (line 37)
+* Branch, accessing: Accessing branches. (line 6)
+* Branch, check out: Accessing branches. (line 6)
+* Branch, creating a: Creating a branch. (line 6)
+* Branch, identifying: Accessing branches. (line 6)
+* Branch, retrieving: Accessing branches. (line 6)
+* Branch, vendor-: Tracking sources. (line 10)
+* Branches motivation: Branches motivation. (line 6)
+* Branches, copying changes between: Branching and merging.
+ (line 6)
+* Branches, sticky: Accessing branches. (line 37)
+* Branching: Branching and merging.
+ (line 6)
+* Bringing a file up to date: Updating a file. (line 6)
+* Bugs in this manual or CVS: BUGS. (line 6)
+* Bugs, reporting: BUGS. (line 13)
+* Builds: Builds. (line 6)
+* Changes, copying between branches: Branching and merging.
+ (line 6)
+* Changing a log message: admin options. (line 73)
+* Check out a branch: Accessing branches. (line 6)
+* Checked out copy, keeping: Keeping a checked out copy.
+ (line 6)
+* Checking out source: Getting the source. (line 6)
+* checkout (subcommand): checkout. (line 6)
+* Checkout program: Module options. (line 16)
+* Checkout, as term for getting ready to edit: Editing files. (line 6)
+* Checkout, example: Getting the source. (line 6)
+* checkoutlist: checkoutlist. (line 6)
+* Choosing, reserved or unreserved checkouts: Choosing a model.
+ (line 6)
+* Cleaning up: Cleaning up. (line 6)
+* Client/Server Operation: Remote repositories. (line 6)
+* Client/Server Operation, port specification: Remote repositories.
+ (line 6)
+* Client/Server Operation, port specification: Password authentication server.
+ (line 10)
+* co (subcommand): checkout. (line 6)
+* Command reference: Invoking CVS. (line 6)
+* Command structure: Structure. (line 6)
+* Comment leader: admin options. (line 27)
+* commit (subcommand): commit. (line 6)
+* Commits, precommit verification of: commitinfo. (line 6)
+* Committing changes to files: Committing your changes.
+ (line 6)
+* Committing, administrative support files: commit files. (line 6)
+* Committing, when to: When to commit. (line 6)
+* Common options: Common options. (line 6)
+* Common syntax of info files: syntax. (line 6)
+* Compatibility, between CVS versions: Compatibility. (line 6)
+* Compression: Global options. (line 126)
+* Compression: Invoking CVS. (line 79)
+* COMSPEC, environment variable: Environment variables.
+ (line 122)
+* config, in CVSROOT: config. (line 6)
+* Configuring keyword expansion: Configuring keyword expansion.
+ (line 6)
+* Conflict markers: Conflicts example. (line 96)
+* Conflict resolution: Conflicts example. (line 100)
+* Conflicts (merge example): Conflicts example. (line 68)
+* Contributors (CVS program): What is CVS?. (line 28)
+* Contributors (manual): Credits. (line 6)
+* Copying a repository: Moving a repository. (line 6)
+* Copying changes: Branching and merging.
+ (line 6)
+* Correcting a log message: admin options. (line 73)
+* Creating a branch: Creating a branch. (line 6)
+* Creating a project: Starting a new project.
+ (line 6)
+* Creating a repository: Creating a repository.
+ (line 6)
+* Credits (CVS program): What is CVS?. (line 28)
+* Credits (manual): Credits. (line 6)
+* CVS 1.6, and watches: Watches Compatibility.
+ (line 6)
+* CVS command structure: Structure. (line 6)
+* CVS directory, in repository: CVS in repository. (line 6)
+* CVS directory, in working directory: Working directory storage.
+ (line 6)
+* CVS passwd file: Password authentication server.
+ (line 67)
+* CVS, history of: What is CVS?. (line 28)
+* CVS, introduction to: What is CVS?. (line 6)
+* CVS, versions of: Compatibility. (line 6)
+* CVS/Base directory: Working directory storage.
+ (line 176)
+* CVS/Baserev file: Working directory storage.
+ (line 182)
+* CVS/Baserev.tmp file: Working directory storage.
+ (line 190)
+* CVS/Entries file: Working directory storage.
+ (line 60)
+* CVS/Entries.Backup file: Working directory storage.
+ (line 143)
+* CVS/Entries.Log file: Working directory storage.
+ (line 120)
+* CVS/Entries.Static file: Working directory storage.
+ (line 148)
+* CVS/Notify file: Working directory storage.
+ (line 166)
+* CVS/Notify.tmp file: Working directory storage.
+ (line 171)
+* CVS/Repository file: Working directory storage.
+ (line 32)
+* CVS/Root file: Specifying a repository.
+ (line 25)
+* CVS/Tag file: Working directory storage.
+ (line 155)
+* CVS/Template file: Working directory storage.
+ (line 196)
+* cvsadmin: admin. (line 18)
+* CVSEDITOR, environment variable: Committing your changes.
+ (line 17)
+* CVSEDITOR, environment variable: Environment variables.
+ (line 46)
+* CVSEDITOR, internal variable: Variables. (line 37)
+* CVSHeader keyword: Keyword list. (line 11)
+* cvsignore (admin file), global: cvsignore. (line 6)
+* CVSIGNORE, environment variable: Environment variables.
+ (line 8)
+* CVSREAD, environment variable: Environment variables.
+ (line 16)
+* CVSREAD, overriding: Global options. (line 110)
+* CVSREADONLYFS, environment variable: Environment variables.
+ (line 22)
+* cvsroot: Repository. (line 6)
+* CVSROOT (file): Administrative files.
+ (line 6)
+* CVSROOT, environment variable: Specifying a repository.
+ (line 12)
+* CVSROOT, internal variable: Variables. (line 26)
+* CVSROOT, module name: Intro administrative files.
+ (line 6)
+* CVSROOT, multiple repositories: Multiple repositories.
+ (line 6)
+* CVSROOT, overriding: Global options. (line 35)
+* CVSROOT, storage of files: CVSROOT storage. (line 6)
+* CVSROOT/config: config. (line 6)
+* CVSROOT/Emptydir directory: Working directory storage.
+ (line 58)
+* CVSUMASK, environment variable: File permissions. (line 34)
+* cvswrappers (admin file): Wrappers. (line 6)
+* CVSWRAPPERS, environment variable: Wrappers. (line 6)
+* CVSWRAPPERS, environment variable: Environment variables.
+ (line 12)
+* CVS_CLIENT_LOG, environment variable: Environment variables.
+ (line 97)
+* CVS_CLIENT_PORT: Kerberos authenticated.
+ (line 25)
+* CVS_IGNORE_REMOTE_ROOT, environment variable: Environment variables.
+ (line 108)
+* CVS_LOCAL_BRANCH_NUM, environment variable: Environment variables.
+ (line 114)
+* CVS_PASSFILE, environment variable: Password authentication client.
+ (line 46)
+* CVS_PID, environment variable: Environment variables.
+ (line 142)
+* CVS_RCMD_PORT, environment variable: Environment variables.
+ (line 92)
+* CVS_RSH, environment variable: Environment variables.
+ (line 68)
+* CVS_SERVER, and :fork:: Connecting via fork. (line 24)
+* CVS_SERVER, environment variable: Connecting via rsh. (line 22)
+* CVS_SERVER_SLEEP, environment variable: Environment variables.
+ (line 103)
+* CVS_USER, environment variable: Variables. (line 71)
+* Date keyword: Keyword list. (line 25)
+* Dates: Common options. (line 18)
+* Dead state: Attic. (line 17)
+* Decimal revision number: Revision numbers. (line 6)
+* DEFAULT in `verifymsg': verifymsg. (line 25)
+* DEFAULT in commitinfo: commitinfo. (line 23)
+* DEFAULT in editinfo: editinfo. (line 38)
+* Defining a module: Defining the module. (line 6)
+* Defining modules (intro): Intro administrative files.
+ (line 6)
+* Defining modules (reference manual): modules. (line 6)
+* Deleting branch tags: Modifying tags. (line 19)
+* Deleting files: Removing files. (line 6)
+* Deleting revisions: admin options. (line 95)
+* Deleting sticky tags: Sticky tags. (line 30)
+* Deleting tags: Modifying tags. (line 19)
+* Descending directories: Recursive behavior. (line 6)
+* Device nodes: Special Files. (line 6)
+* Diff: Viewing differences. (line 6)
+* diff (subcommand): diff. (line 6)
+* Differences, merging: Merging two revisions.
+ (line 6)
+* Directories, moving: Moving directories. (line 6)
+* Directories, removing: Removing directories.
+ (line 6)
+* Directory, descending: Recursive behavior. (line 6)
+* Disjoint repositories: Multiple repositories.
+ (line 6)
+* Distributing log messages: loginfo. (line 6)
+* driver.c (merge example): Conflicts example. (line 6)
+* edit (subcommand): Editing files. (line 13)
+* editinfo (admin file): editinfo. (line 6)
+* Editing administrative files: Intro administrative files.
+ (line 33)
+* Editing the modules file: Defining the module. (line 6)
+* Editor, avoiding invocation of: Common options. (line 115)
+* EDITOR, environment variable: Committing your changes.
+ (line 17)
+* EDITOR, environment variable: Environment variables.
+ (line 47)
+* EDITOR, internal variable: Variables. (line 38)
+* EDITOR, overriding: Global options. (line 40)
+* Editor, specifying per module: editinfo. (line 6)
+* editors (subcommand): Watch information. (line 14)
+* emerge: Conflicts example. (line 139)
+* Emptydir, in CVSROOT directory: Working directory storage.
+ (line 58)
+* Encryption: Global options. (line 116)
+* Entries file, in CVS directory: Working directory storage.
+ (line 60)
+* Entries.Backup file, in CVS directory: Working directory storage.
+ (line 143)
+* Entries.Log file, in CVS directory: Working directory storage.
+ (line 120)
+* Entries.Static file, in CVS directory: Working directory storage.
+ (line 148)
+* Environment variables: Environment variables.
+ (line 6)
+* environment variables, passed to administrative files: Variables.
+ (line 70)
+* Errors, reporting: BUGS. (line 13)
+* Example of a work-session: A sample session. (line 6)
+* Example of merge: Conflicts example. (line 6)
+* Example, branch merge: Merging a branch. (line 15)
+* Excluding directories, in modules file: Excluding directories.
+ (line 6)
+* Exit status, of `verifymsg': verifymsg. (line 28)
+* Exit status, of commitinfo: commitinfo. (line 19)
+* Exit status, of CVS: Exit status. (line 6)
+* Exit status, of editor: Error messages. (line 297)
+* Exit status, of taginfo: user-defined logging.
+ (line 19)
+* export (subcommand): export. (line 6)
+* Export program: Module options. (line 12)
+* Fetching source: Getting the source. (line 6)
+* File had conflicts on merge: File status. (line 46)
+* File locking: Multiple developers. (line 6)
+* File permissions, general: File permissions. (line 6)
+* File permissions, Windows-specific: Windows permissions. (line 6)
+* File status: File status. (line 6)
+* Files, moving: Moving files. (line 6)
+* Files, reference manual: Administrative files.
+ (line 6)
+* Fixing a log message: admin options. (line 73)
+* Forcing a tag match: Common options. (line 72)
+* fork, access method: Connecting via fork. (line 6)
+* Form for log message: rcsinfo. (line 6)
+* Format of CVS commands: Structure. (line 6)
+* Getting started: A sample session. (line 6)
+* Getting the source: Getting the source. (line 6)
+* Global cvsignore: cvsignore. (line 6)
+* Global options: Global options. (line 6)
+* Group: File permissions. (line 6)
+* gserver (client/server connection method), port specification: Remote
repositories.
+ (line 6)
+* gserver (client/server connection method), port specification: Password
authentication server.
+ (line 10)
+* GSSAPI: GSSAPI authenticated.
+ (line 6)
+* Gzip: Global options. (line 126)
+* Gzip: Invoking CVS. (line 79)
+* Hard links: Special Files. (line 6)
+* HEAD, as reserved tag name: Tags. (line 25)
+* HEAD, special tag: Common options. (line 148)
+* Header keyword: Keyword list. (line 28)
+* history (subcommand): history. (line 6)
+* History browsing: History browsing. (line 6)
+* History file: history file. (line 6)
+* History files: Repository files. (line 68)
+* History of CVS: What is CVS?. (line 28)
+* HOME, environment variable: Environment variables.
+ (line 57)
+* HOMEDRIVE, environment variable: Environment variables.
+ (line 60)
+* HOMEPATH, environment variable: Environment variables.
+ (line 58)
+* Id keyword: Keyword list. (line 34)
+* Ident (shell command): Using keywords. (line 17)
+* Identifying a branch: Accessing branches. (line 6)
+* Identifying files: Keyword substitution.
+ (line 6)
+* Ignored files: cvsignore. (line 23)
+* Ignoring files: cvsignore. (line 6)
+* import (subcommand): import. (line 6)
+* Importing files: From files. (line 6)
+* Importing files, from other version control systems: From other version
control systems.
+ (line 6)
+* Importing modules: First import. (line 6)
+* Index: Index. (line 6)
+* inetd, configuring for pserver: Password authentication server.
+ (line 10)
+* Info files (syntax): syntax. (line 6)
+* Informing others: Informing others. (line 6)
+* init (subcommand): Creating a repository.
+ (line 28)
+* Installed images (VMS): File permissions. (line 58)
+* Internal variables: Variables. (line 6)
+* Introduction to CVS: What is CVS?. (line 6)
+* Invoking CVS: Invoking CVS. (line 6)
+* Isolation: History browsing. (line 6)
+* Join: Merging a branch. (line 13)
+* Keeping a checked out copy: Keeping a checked out copy.
+ (line 6)
+* Kerberos, using :gserver:: GSSAPI authenticated.
+ (line 6)
+* Kerberos, using :kserver:: Kerberos authenticated.
+ (line 6)
+* Kerberos, using kerberized rsh: Connecting via rsh. (line 32)
+* Keyword expansion: Keyword substitution.
+ (line 6)
+* Keyword List: Keyword list. (line 6)
+* Keyword substitution: Keyword substitution.
+ (line 6)
+* Keyword substitution, and merging: Merging and keywords.
+ (line 6)
+* Keyword substitution, changing modes: Substitution modes. (line 6)
+* Kflag: Substitution modes. (line 6)
+* kinit: Kerberos authenticated.
+ (line 31)
+* Known bugs in this manual or CVS: BUGS. (line 69)
+* kserver (client/server connection method), port specification: Remote
repositories.
+ (line 6)
+* kserver (client/server connection method), port specification: Password
authentication server.
+ (line 10)
+* Layout of repository: Repository. (line 6)
+* Left-hand options: Global options. (line 6)
+* Linear development: Revision numbers. (line 6)
+* Link, symbolic, importing: import output. (line 23)
+* List, mailing list: What is CVS?. (line 45)
+* Local keyword: Keyword list. (line 83)
+* Locally Added: File status. (line 19)
+* Locally Modified: File status. (line 16)
+* Locally Removed: File status. (line 23)
+* LockDir, in CVSROOT/config: config. (line 41)
+* Locker keyword: Keyword list. (line 43)
+* Locking files: Multiple developers. (line 6)
+* Locks, cvs, and backups: Backing up. (line 10)
+* Locks, cvs, introduction: Concurrency. (line 6)
+* Locks, cvs, technical details: Locks. (line 6)
+* log (subcommand): log. (line 6)
+* Log information, saving: history file. (line 6)
+* Log keyword: Keyword list. (line 47)
+* Log message entry: Committing your changes.
+ (line 6)
+* Log message template: rcsinfo. (line 6)
+* Log message, correcting: admin options. (line 73)
+* Log message, verifying: verifymsg. (line 6)
+* Log messages: loginfo. (line 6)
+* Log messages, editing: editinfo. (line 6)
+* LogHistory, in CVSROOT/config: config. (line 60)
+* Login (subcommand): Password authentication client.
+ (line 6)
+* loginfo (admin file): loginfo. (line 6)
+* LOGNAME, environment variable: Variables. (line 78)
+* Logout (subcommand): Password authentication client.
+ (line 70)
+* Mail, automatic mail on commit: Informing others. (line 6)
+* Mailing list: What is CVS?. (line 45)
+* Mailing log messages: loginfo. (line 6)
+* Main trunk and branches: Branching and merging.
+ (line 6)
+* make: Builds. (line 6)
+* Many repositories: Multiple repositories.
+ (line 6)
+* Markers, conflict: Conflicts example. (line 96)
+* Merge, an example: Conflicts example. (line 6)
+* Merge, branch example: Merging a branch. (line 15)
+* Merging: Branching and merging.
+ (line 6)
+* Merging a branch: Merging a branch. (line 6)
+* Merging a file: Updating a file. (line 6)
+* Merging two revisions: Merging two revisions.
+ (line 6)
+* Merging, and keyword substitution: Merging and keywords.
+ (line 6)
+* mkmodules: Error messages. (line 168)
+* Modifications, copying between branches: Branching and merging.
+ (line 6)
+* Module status: Module options. (line 22)
+* Module, defining: Defining the module. (line 6)
+* Modules (admin file): modules. (line 6)
+* Modules file: Intro administrative files.
+ (line 6)
+* Modules file program options: Module program options.
+ (line 6)
+* Modules file, changing: Defining the module. (line 6)
+* modules.db: CVSROOT storage. (line 25)
+* modules.dir: CVSROOT storage. (line 25)
+* modules.pag: CVSROOT storage. (line 25)
+* Motivation for branches: Branches motivation. (line 6)
+* Moving a repository: Moving a repository. (line 6)
+* Moving branch tags: Modifying tags. (line 37)
+* Moving directories: Moving directories. (line 6)
+* Moving files: Moving files. (line 6)
+* Moving tags: Modifying tags. (line 37)
+* Multiple developers: Multiple developers. (line 6)
+* Multiple repositories: Multiple repositories.
+ (line 6)
+* Name keyword: Keyword list. (line 37)
+* Name, symbolic (tag): Tags. (line 25)
+* Needs Checkout: File status. (line 27)
+* Needs Merge: File status. (line 37)
+* Needs Patch: File status. (line 32)
+* Newsgroups: What is CVS?. (line 45)
+* notify (admin file): Getting Notified. (line 56)
+* Notify file, in CVS directory: Working directory storage.
+ (line 166)
+* Notify.tmp file, in CVS directory: Working directory storage.
+ (line 171)
+* Number, branch: Revision numbers. (line 6)
+* Number, branch: Branches and revisions.
+ (line 6)
+* Number, revision-: Revision numbers. (line 6)
+* Option defaults: ~/.cvsrc. (line 6)
+* Options, global: Global options. (line 6)
+* Options, in modules file: Module options. (line 6)
+* Outdating revisions: admin options. (line 95)
+* Overlap: Updating a file. (line 22)
+* Overriding CVSREAD: Global options. (line 110)
+* Overriding CVSROOT: Global options. (line 35)
+* Overriding EDITOR: Global options. (line 40)
+* Overriding RCSBIN: Global options. (line 21)
+* Overriding TMPDIR: Global options. (line 27)
+* Overview: Overview. (line 6)
+* Ownership, saving in CVS: Special Files. (line 6)
+* Parallel repositories: Multiple repositories.
+ (line 6)
+* passwd (admin file): Password authentication server.
+ (line 67)
+* Password client, using: Password authentication client.
+ (line 6)
+* Password server, setting up: Password authentication server.
+ (line 10)
+* PATH, environment variable: Environment variables.
+ (line 53)
+* Per-directory sticky tags/dates: Working directory storage.
+ (line 155)
+* Per-module editor: editinfo. (line 6)
+* Permissions, general: File permissions. (line 6)
+* Permissions, saving in CVS: Special Files. (line 6)
+* Permissions, Windows-specific: Windows permissions. (line 6)
+* Policy: When to commit. (line 6)
+* port, specifying for remote repositories: Remote repositories.
+ (line 6)
+* port, specifying for remote repositories: Password authentication server.
+ (line 10)
+* Precommit checking: commitinfo. (line 6)
+* pserver (client/server connection method), port specification: Remote
repositories.
+ (line 6)
+* pserver (client/server connection method), port specification: Password
authentication server.
+ (line 10)
+* pserver (subcommand): Password authentication server.
+ (line 10)
+* PVCS, importing files from: From other version control systems.
+ (line 44)
+* RCS history files: Repository files. (line 68)
+* RCS revision numbers: Tags. (line 10)
+* RCS, importing files from: From other version control systems.
+ (line 10)
+* RCS-style locking: Multiple developers. (line 6)
+* RCSBIN, in CVSROOT/config: config. (line 15)
+* RCSBIN, internal variable: Variables. (line 32)
+* RCSBIN, overriding: Global options. (line 21)
+* RCSfile keyword: Keyword list. (line 70)
+* rcsinfo (admin file): rcsinfo. (line 6)
+* rdiff (subcommand): rdiff. (line 6)
+* Read-only files, and -r: Global options. (line 91)
+* Read-only files, and CVSREAD: Environment variables.
+ (line 16)
+* Read-only files, and watches: Setting a watch. (line 10)
+* Read-only files, in repository: File permissions. (line 6)
+* Read-only mode: Global options. (line 72)
+* Read-only repository access: Read-only access. (line 6)
+* Read-only repository mode: Global options. (line 64)
+* readers (admin file): Read-only access. (line 6)
+* Recursive (directory descending): Recursive behavior. (line 6)
+* Reference manual (files): Administrative files.
+ (line 6)
+* Reference manual for variables: Environment variables.
+ (line 6)
+* Reference, commands: Invoking CVS. (line 6)
+* Regular expression syntax: syntax. (line 10)
+* Regular modules: Regular modules. (line 6)
+* release (subcommand): release. (line 6)
+* Releases, revisions and versions: Versions revisions releases.
+ (line 6)
+* Releasing your working copy: Cleaning up. (line 6)
+* Remote repositories: Remote repositories. (line 6)
+* Remote repositories, port specification: Remote repositories.
+ (line 6)
+* Remote repositories, port specification: Password authentication server.
+ (line 10)
+* Remove (subcommand): Removing files. (line 34)
+* Removing a change: Merging two revisions.
+ (line 9)
+* Removing branch tags: Modifying tags. (line 19)
+* Removing directories: Removing directories.
+ (line 6)
+* Removing files: Removing files. (line 6)
+* Removing tags: Modifying tags. (line 19)
+* Removing your working copy: Cleaning up. (line 6)
+* Renaming directories: Moving directories. (line 6)
+* Renaming files: Moving files. (line 6)
+* Renaming tags: Modifying tags. (line 57)
+* Replacing a log message: admin options. (line 73)
+* Reporting bugs: BUGS. (line 13)
+* Repositories, multiple: Multiple repositories.
+ (line 6)
+* Repositories, remote: Remote repositories. (line 6)
+* Repositories, remote, port specification: Remote repositories.
+ (line 6)
+* Repositories, remote, port specification: Password authentication server.
+ (line 10)
+* Repository (intro): Repository. (line 6)
+* Repository file, in CVS directory: Working directory storage.
+ (line 32)
+* Repository, backing up: Backing up. (line 6)
+* Repository, example: Repository. (line 6)
+* Repository, how data is stored: Repository storage. (line 6)
+* Repository, moving: Moving a repository. (line 6)
+* Repository, setting up: Creating a repository.
+ (line 6)
+* RereadLogAfterVerify, in CVSROOT/config: config. (line 67)
+* Reserved checkouts: Multiple developers. (line 6)
+* Resetting sticky tags: Sticky tags. (line 30)
+* Resolving a conflict: Conflicts example. (line 100)
+* Restoring old version of removed file: Merging two revisions.
+ (line 19)
+* Resurrecting old version of dead file: Merging two revisions.
+ (line 19)
+* Retrieve a branch: Accessing branches. (line 6)
+* Retrieving an old revision using tags: Tags. (line 85)
+* Reverting to repository version: Editing files. (line 33)
+* Revision keyword: Keyword list. (line 73)
+* Revision management: Revision management. (line 6)
+* Revision numbers: Revision numbers. (line 6)
+* Revision numbers (branches): Branches and revisions.
+ (line 6)
+* Revision tree: Revision numbers. (line 6)
+* Revision tree, making branches: Branching and merging.
+ (line 6)
+* Revisions, merging differences between: Merging two revisions.
+ (line 6)
+* Revisions, versions and releases: Versions revisions releases.
+ (line 6)
+* Right-hand options: Common options. (line 6)
+* Root file, in CVS directory: Specifying a repository.
+ (line 25)
+* rsh: Connecting via rsh. (line 6)
+* rsh replacements (Kerberized, SSH, &c): Connecting via rsh. (line 32)
+* rtag (subcommand): Tagging by date/tag. (line 6)
+* rtag (subcommand), creating a branch using: Creating a branch.
+ (line 6)
+* Saving space: admin options. (line 95)
+* SCCS, importing files from: From other version control systems.
+ (line 37)
+* Security, file permissions in repository: File permissions. (line 6)
+* Security, GSSAPI: GSSAPI authenticated.
+ (line 6)
+* Security, kerberos: Kerberos authenticated.
+ (line 6)
+* Security, of pserver: Password authentication security.
+ (line 6)
+* Security, setuid: File permissions. (line 58)
+* Server, CVS: Remote repositories. (line 6)
+* Server, temporary directories: Server temporary directory.
+ (line 6)
+* Setgid: File permissions. (line 58)
+* Setting up a repository: Creating a repository.
+ (line 6)
+* Setuid: File permissions. (line 58)
+* Source keyword: Keyword list. (line 76)
+* Source, getting CVS source: What is CVS?. (line 38)
+* Source, getting from CVS: Getting the source. (line 6)
+* Special files: Special Files. (line 6)
+* Specifying dates: Common options. (line 18)
+* Spreading information: Informing others. (line 6)
+* SSH (rsh replacement): Connecting via rsh. (line 32)
+* Starting a project with CVS: Starting a new project.
+ (line 6)
+* State keyword: Keyword list. (line 79)
+* Status of a file: File status. (line 6)
+* Status of a module: Module options. (line 22)
+* Sticky date: Sticky tags. (line 36)
+* Sticky tags: Sticky tags. (line 6)
+* Sticky tags, resetting: Sticky tags. (line 30)
+* Sticky tags/dates, per-directory: Working directory storage.
+ (line 155)
+* Storing log messages: loginfo. (line 6)
+* Stream authentication: Global options. (line 13)
+* Structure: Structure. (line 6)
+* Subdirectories: Recursive behavior. (line 6)
+* Support, getting CVS support: BUGS. (line 16)
+* Symbolic link, importing: import output. (line 23)
+* Symbolic links: Special Files. (line 6)
+* Symbolic name (tag): Tags. (line 25)
+* Syntax of info files: syntax. (line 6)
+* SystemAuth, in CVSROOT/config: config. (line 21)
+* tag (subcommand): Tagging the working directory.
+ (line 6)
+* tag (subcommand), creating a branch using: Creating a branch.
+ (line 6)
+* tag (subcommand), introduction: Tags. (line 25)
+* Tag file, in CVS directory: Working directory storage.
+ (line 155)
+* Tag program: Module options. (line 30)
+* taginfo: user-defined logging.
+ (line 19)
+* Tags: Tags. (line 6)
+* Tags, deleting: Modifying tags. (line 19)
+* Tags, example: Tags. (line 46)
+* Tags, moving: Modifying tags. (line 37)
+* Tags, renaming: Modifying tags. (line 57)
+* Tags, retrieving old revisions: Tags. (line 85)
+* Tags, sticky: Sticky tags. (line 6)
+* Tags, symbolic name: Tags. (line 25)
+* tc, Trivial Compiler (example): A sample session. (line 6)
+* Team of developers: Multiple developers. (line 6)
+* TEMP, environment variable: Environment variables.
+ (line 128)
+* Template file, in CVS directory: Working directory storage.
+ (line 196)
+* Template for log message: rcsinfo. (line 6)
+* Temporary directories, and server: Server temporary directory.
+ (line 6)
+* Temporary files, location of: Environment variables.
+ (line 129)
+* Third-party sources: Tracking sources. (line 6)
+* Time: Common options. (line 18)
+* Timezone, in input: Common options. (line 34)
+* Timezone, in output: log. (line 17)
+* TMP, environment variable: Environment variables.
+ (line 127)
+* TMPDIR, environment variable: Environment variables.
+ (line 126)
+* TMPDIR, overriding: Global options. (line 27)
+* TopLevelAdmin, in CVSROOT/config: config. (line 28)
+* Trace: Global options. (line 100)
+* Traceability: History browsing. (line 6)
+* Tracking sources: Tracking sources. (line 6)
+* Transactions, atomic, lack of: Concurrency. (line 27)
+* Trivial Compiler (example): A sample session. (line 6)
+* Typical repository: Repository. (line 6)
+* Umask, for repository files: File permissions. (line 34)
+* Undoing a change: Merging two revisions.
+ (line 9)
+* unedit (subcommand): Editing files. (line 33)
+* Unknown: File status. (line 51)
+* Unreserved checkouts: Multiple developers. (line 6)
+* Unresolved Conflict: File status. (line 41)
+* Up-to-date: File status. (line 11)
+* update (subcommand): update. (line 6)
+* Update, introduction: Updating a file. (line 6)
+* update, to display file status: File status. (line 72)
+* Updating a file: Updating a file. (line 6)
+* User aliases: Password authentication server.
+ (line 96)
+* User variables: Variables. (line 50)
+* USER, environment variable: Variables. (line 81)
+* USER, internal variable: Variables. (line 43)
+* UserAdminOptions, in CVSROOT/config: admin. (line 18)
+* UserAdminOptions, in CVSROOT/config: config. (line 84)
+* users (admin file): Getting Notified. (line 71)
+* Variables: Variables. (line 6)
+* Vendor: Tracking sources. (line 10)
+* Vendor branch: Tracking sources. (line 10)
+* version (subcommand): Invoking CVS. (line 782)
+* Versions, of CVS: Compatibility. (line 6)
+* Versions, revisions and releases: Versions revisions releases.
+ (line 6)
+* Viewing differences: Viewing differences. (line 6)
+* VISUAL, environment variable: Committing your changes.
+ (line 23)
+* VISUAL, environment variable: Environment variables.
+ (line 48)
+* VISUAL, internal variable: Variables. (line 39)
+* watch add (subcommand): Getting Notified. (line 11)
+* watch off (subcommand): Setting a watch. (line 24)
+* watch on (subcommand): Setting a watch. (line 9)
+* watch remove (subcommand): Getting Notified. (line 51)
+* watchers (subcommand): Watch information. (line 6)
+* Watches: Watches. (line 6)
+* wdiff (import example): First import. (line 19)
+* Web pages, maintaining with CVS: Keeping a checked out copy.
+ (line 6)
+* What (shell command): Using keywords. (line 30)
+* What branches are good for: Branches motivation. (line 6)
+* What is CVS not?: What is CVS not?. (line 6)
+* What is CVS?: What is CVS?. (line 6)
+* When to commit: When to commit. (line 6)
+* Windows, and permissions: Windows permissions. (line 6)
+* Work-session, example of: A sample session. (line 6)
+* Working copy: Multiple developers. (line 6)
+* Working copy, removing: Cleaning up. (line 6)
+* Wrappers: Wrappers. (line 6)
+* writers (admin file): Read-only access. (line 6)
+* Ximbiot: BUGS. (line 16)
+* xinetd, configuring for pserver: Password authentication server.
+ (line 10)
+* Zone, time, in input: Common options. (line 34)
+* Zone, time, in output: log. (line 17)
+
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Texi2html-cvs] texi2html/test formatting/menus.texi formatting...,
Patrice Dumas <=