texi2html-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Texi2html-cvs] texi2html ChangeLog TODO texi2html.init texi2ht...


From: Patrice Dumas
Subject: [Texi2html-cvs] texi2html ChangeLog TODO texi2html.init texi2ht...
Date: Wed, 12 Mar 2008 10:24:18 +0000

CVSROOT:        /cvsroot/texi2html
Module name:    texi2html
Changes by:     Patrice Dumas <pertusus>        08/03/12 10:24:16

Modified files:
        .              : ChangeLog TODO texi2html.init texi2html.pl 
        Tests          : test.sh 
        examples       : mediawiki.init 
Added files:
        Tests/ccvs_mediawiki_nosplit_res: cvs cvs.2 cvs.passfirst 
                                          cvs.passtexi 
        Tests/ccvs_mediawiki_res: cvs cvs.2 cvs.passfirst cvs.passtexi 
                                  `cvs: About this Manual' 
                                  `cvs: Adding, removing, and renaming files 
and directories' 
                                  `cvs: All environment variables which affect 
CVS' 
                                  `cvs: Branching and merging' 
                                  `cvs: Compatibility between CVS Versions' 
                                  `cvs: Credits' 
                                  `cvs: Dealing with bugs in CVS or this 
manual' 
                                  `cvs: Guide to CVS commands' 
                                  `cvs: Handling binary files' 
                                  `cvs: History browsing' 
                                  `cvs: How your build system interacts with 
CVS' 
                                  `cvs: Index' 
                                  `cvs: Keyword substitution' 
                                  `cvs: Multiple developers' 
                                  `cvs: Overview' 
                                  `cvs: Quick reference to CVS commands' 
                                  `cvs: Recursive behavior' 
                                  `cvs: Reference manual for Administrative 
files' 
                                  `cvs: Revision management' 
                                  `cvs: Revisions' 
                                  `cvs: Short Table of Contents' 
                                  `cvs: Special Files' 
                                  `cvs: Starting a project with CVS' 
                                  `cvs: Table of Contents' 
                                  `cvs: The Repository' 
                                  `cvs: Tracking third-party sources' 
                                  `cvs: Troubleshooting' 

Log message:
                * texi2html.pl, texi2html.init, examples/mediawiki.init: add
                the program_string reference.
                * examples/mediawiki.init: cleanup perl warnings.
                * texi2html.pl: element_file_name called with doc sets docu_doc
                and not docu_top (Reinhold Kainhofer).
                * Tests/test.sh: more robust for files with spaces.
                * Tests/*: add tests for mediawiki output.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/texi2html/ChangeLog?cvsroot=texi2html&r1=1.284&r2=1.285
http://cvs.savannah.gnu.org/viewcvs/texi2html/TODO?cvsroot=texi2html&r1=1.41&r2=1.42
http://cvs.savannah.gnu.org/viewcvs/texi2html/texi2html.init?cvsroot=texi2html&r1=1.131&r2=1.132
http://cvs.savannah.gnu.org/viewcvs/texi2html/texi2html.pl?cvsroot=texi2html&r1=1.197&r2=1.198
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/test.sh?cvsroot=texi2html&r1=1.76&r2=1.77
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_nosplit_res/cvs?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_nosplit_res/cvs.2?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_nosplit_res/cvs.passfirst?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_nosplit_res/cvs.passtexi?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs.2?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs.passfirst?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs.passtexi?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32About%32this%32Manual?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32Adding%44%32removing%44%32and%32renaming%32files%32and%32directories?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32All%32environment%32variables%32which%32affect%32CVS?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32Branching%32and%32merging?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32Compatibility%32between%32CVS%32Versions?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32Credits?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32Dealing%32with%32bugs%32in%32CVS%32or%32this%32manual?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32Guide%32to%32CVS%32commands?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32Handling%32binary%32files?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32History%32browsing?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32How%32your%32build%32system%32interacts%32with%32CVS?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32Index?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32Keyword%32substitution?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32Multiple%32developers?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32Overview?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32Quick%32reference%32to%32CVS%32commands?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32Recursive%32behavior?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32Reference%32manual%32for%32Administrative%32files?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32Revision%32management?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32Revisions?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32Short%32Table%32of%32Contents?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32Special%32Files?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32Starting%32a%32project%32with%32CVS?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32Table%32of%32Contents?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32The%32Repository?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32Tracking%32third-party%32sources?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/Tests/ccvs_mediawiki_res/cvs:%32Troubleshooting?cvsroot=texi2html&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/texi2html/examples/mediawiki.init?cvsroot=texi2html&r1=1.5&r2=1.6

Patches:
Index: ChangeLog
===================================================================
RCS file: /cvsroot/texi2html/texi2html/ChangeLog,v
retrieving revision 1.284
retrieving revision 1.285
diff -u -b -r1.284 -r1.285
--- ChangeLog   7 Oct 2007 13:22:44 -0000       1.284
+++ ChangeLog   12 Mar 2008 10:24:11 -0000      1.285
@@ -1,3 +1,13 @@
+2008-03-12  Patrice Dumas  <address@hidden>
+
+       * texi2html.pl, texi2html.init, examples/mediawiki.init: add
+       the program_string reference.
+       * examples/mediawiki.init: cleanup perl warnings.
+       * texi2html.pl: element_file_name called with doc sets docu_doc
+       and not docu_top (Reinhold Kainhofer).
+       * Tests/test.sh: more robust for files with spaces.
+       * Tests/*: add tests for mediawiki output.
+
 2007-10-07  Patrice Dumas  <address@hidden>
 
        * texi2html.pl: better handling of special regions.

Index: TODO
===================================================================
RCS file: /cvsroot/texi2html/texi2html/TODO,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -b -r1.41 -r1.42
--- TODO        7 Oct 2007 13:22:45 -0000       1.41
+++ TODO        12 Mar 2008 10:24:12 -0000      1.42
@@ -125,3 +125,5 @@
 
 * maybe be quiet during special region expansion outside of document. It
   is not very clear that it is wrong, though.
+
+* document program_string

Index: texi2html.init
===================================================================
RCS file: /cvsroot/texi2html/texi2html/texi2html.init,v
retrieving revision 1.131
retrieving revision 1.132
diff -u -b -r1.131 -r1.132
--- texi2html.init      7 Oct 2007 13:22:45 -0000       1.131
+++ texi2html.init      12 Mar 2008 10:24:12 -0000      1.132
@@ -12,7 +12,7 @@
 # Afterwards, load the file with command-line 
 # option -init-file <your_init_file>
 #
-# $Id: texi2html.init,v 1.131 2007/10/07 13:22:45 pertusus Exp $
+# $Id: texi2html.init,v 1.132 2008/03/12 10:24:12 pertusus Exp $
 
 ######################################################################
 # The following variables can also be set by command-line options
@@ -812,6 +812,7 @@
 $print_redirection_page    = \&T2H_DEFAULT_print_redirection_page;
 $node_file_name            = \&T2H_DEFAULT_node_file_name;
 $inline_contents           = \&T2H_DEFAULT_inline_contents;
+$program_string            = \&T2H_DEFAULT_program_string;
 
 ########################################################################
 # Layout for html for every sections
@@ -1082,7 +1083,7 @@
 EOT
 }
 
-sub program_string()
+sub T2H_DEFAULT_program_string()
 {
     my $user = $Texi2HTML::THISDOC{'user'};
     my $date = $Texi2HTML::THISDOC{'today'};
@@ -1119,7 +1120,7 @@
 sub T2H_DEFAULT_print_page_foot($)
 {
     my $fh = shift;
-    my $program_string = program_string();
+    my $program_string = &$program_string();
     print $fh <<EOT;
 <p>
  <font size="-1">
@@ -1439,7 +1440,7 @@
 # and all global variables like $ADDRESS are not available.
 $PRE_ABOUT = sub
 {
-    return '  ' . program_string() .  "\n";
+    return '  ' . &$program_string() .  "\n";
 };
 
 # If customizing $AFTER_ABOUT, be sure to put the content inside <p></p>.

Index: texi2html.pl
===================================================================
RCS file: /cvsroot/texi2html/texi2html/texi2html.pl,v
retrieving revision 1.197
retrieving revision 1.198
diff -u -b -r1.197 -r1.198
--- texi2html.pl        7 Oct 2007 12:07:09 -0000       1.197
+++ texi2html.pl        12 Mar 2008 10:24:12 -0000      1.198
@@ -60,7 +60,7 @@
 #--##########################################################################
 
 # CVS version:
-# $Id: texi2html.pl,v 1.197 2007/10/07 12:07:09 pertusus Exp $
+# $Id: texi2html.pl,v 1.198 2008/03/12 10:24:12 pertusus Exp $
 
 # Homepage:
 my $T2H_HOMEPAGE = "http://www.nongnu.org/texi2html/";;
@@ -361,6 +361,7 @@
 $node_file_name
 $element_file_name
 $inline_contents
+$program_string
 
 $protect_text
 $anchor
@@ -2948,9 +2949,9 @@
     }
     if (defined $Texi2HTML::Config::element_file_name)
     {
-        my $docu_name = &$Texi2HTML::Config::element_file_name
+        my $docu_doc_set = &$Texi2HTML::Config::element_file_name
            (undef, "doc", $docu_name);
-        $docu_top = $docu_name if (defined($docu_name));
+        $docu_doc = $docu_doc_set if (defined($docu_doc_set));
     } 
     $docu_toc = $docu_foot = $docu_stoc = $docu_about = $docu_top = $docu_doc;
 }

Index: Tests/test.sh
===================================================================
RCS file: /cvsroot/texi2html/texi2html/Tests/test.sh,v
retrieving revision 1.76
retrieving revision 1.77
diff -u -b -r1.76 -r1.77
--- Tests/test.sh       7 Oct 2007 12:07:09 -0000       1.76
+++ Tests/test.sh       12 Mar 2008 10:24:12 -0000      1.77
@@ -80,32 +80,33 @@
 [ -d $dir_res ] || return
 echo "  diffs:"
 previous_good='no'
-for file in `ls $dir_res` ; do
+for full_file in "$dir_res"/* ; do
+       file=`basename "$full_file"`
        found='no'
-       if [ -d $dir_res/$file -a $dir_res/$file = $dir_res/'CVS' ]; then 
continue
-       elif [ -d $dir_res/$file ]; then
+       if [ -d "${dir_res}/${file}" -a "$dir_res/$file" = "${dir_res}/CVS" ]; 
then continue
+       elif [ -d "${dir_res}/$file" ]; then
                file_or_dir=dir
-               if [ ! -d $dir/$file ]; then
+               if [ ! -d "${dir}/$file" ]; then
                        result=1
                else
                        found='yes'
-                       diff --recursive $dir_res/$file $dir/$file 2>&1 > 
/dev/null
+                       diff --recursive "${dir_res}/$file" "${dir}/$file" 2>&1 
> /dev/null
                        result=$?
                fi
-       elif [ -f $dir_res/$file ]; then
+       elif [ -f "${dir_res}/$file" ]; then
                file_or_dir=file
-               if [ ! -f $dir/$file ]; then
+               if [ ! -f "${dir}/$file" ]; then
                        result=1
                else
                        found='yes'
                        if [ $ignore_tags = 'yes' ]; then
-                               temp_file=$dir/${file}_tempnotag
-                               sed 's/\$\([[:alpha:]]\+\):.*\$/\$\1\$/g' 
$dir/${file} > $temp_file
-                               sed 's/\$\([[:alpha:]]\+\):.*\$/\$\1\$/g' 
$dir_res/$file | diff - $temp_file 2>&1 > /dev/null
+                               temp_file="${dir}/${file}_tempnotag"
+                               sed 's/\$\([[:alpha:]]\+\):.*\$/\$\1\$/g' 
"${dir}/${file}" > $temp_file
+                               sed 's/\$\([[:alpha:]]\+\):.*\$/\$\1\$/g' 
"${dir_res}/$file" | diff - $temp_file 2>&1 > /dev/null
                                result=$?
                                rm $temp_file
                        else                    
-                               diff $dir_res/$file $dir/$file 2>&1 > /dev/null
+                               diff "${dir_res}/$file" "${dir}/$file" 2>&1 > 
/dev/null
                                result=$?
                        fi
                fi
@@ -372,5 +373,7 @@
 test_texi nodes_texinfo ../texinfo/texinfo.txi "-split node -node-files 
-ifinfo -output . -I ../texinfo" 0 txi texinfo   #ignore_tags
 test_texi ccvs cvs.texinfo "-split chapter -output ." 0 texinfo
 test_texi tar ../tar_texi/tar.texi 
+test_texi ccvs_mediawiki ../ccvs/cvs.texinfo "-init 
../../examples/mediawiki.init -split chapter -output ." 0 texinfo
+test_texi ccvs_mediawiki_nosplit ../ccvs/cvs.texinfo "-init 
../../examples/mediawiki.init" 0 texinfo
 test_texi singular ../singular_texi/singular.tex "-init-file 
../singular_texi/t2h_singular.init -l2h -short-ext -prefix sing -top-file 
index.htm -noVerbose -output ." 0 tex sing #ignore_tags
 #test_texi singular_httex ../singular_texi/singular.tex "-init-file 
../singular_texi/t2h_singular.init -init ../../examples/tex4ht.init -short-ext 
-prefix sing -top-file index.htm -noVerbose -output ." 0 tex sing #ignore_tags

Index: examples/mediawiki.init
===================================================================
RCS file: /cvsroot/texi2html/texi2html/examples/mediawiki.init,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- examples/mediawiki.init     7 Oct 2007 13:22:46 -0000       1.5
+++ examples/mediawiki.init     12 Mar 2008 10:24:16 -0000      1.6
@@ -8,7 +8,7 @@
 # Load the file with command-line 
 # option -init-file mediawiki.init
 #
-# $Id: mediawiki.init,v 1.5 2007/10/07 13:22:46 pertusus Exp $
+# $Id: mediawiki.init,v 1.6 2008/03/12 10:24:16 pertusus Exp $
 
 ######################################################################
 # The following variables can also be set by command-line options
@@ -57,6 +57,7 @@
 
 $print_page_head             = \&mediawiki_print_page_head;
 $print_page_foot             = \&mediawiki_print_page_foot;
+$program_string                      = \&mediawiki_program_string;
 
 sub mediawiki_print_page_head($)
 {
@@ -64,7 +65,7 @@
     print $fh "$AFTER_BODY_OPEN\n" if $AFTER_BODY_OPEN;
 }
 
-sub program_string()
+sub mediawiki_program_string()
 {
     my $user = $Texi2HTML::THISDOC{'user'};
     my $date = $Texi2HTML::THISDOC{'today'};
@@ -93,7 +94,7 @@
 sub mediawiki_print_page_foot($)
 {
     my $fh = shift;
-    my $program_string = program_string();
+    my $program_string = &$program_string();
     print $fh $program_string, "\n";
     print $fh $PRE_BODY_CLOSE, "\n" if $PRE_BODY_CLOSE;
 }
@@ -151,13 +152,13 @@
 # there is a " the resulting text is also enclosed within `'
 
 # default is {'args' => ['normal'], 'attribute' => ''},   
-$style_map{'titlefont'} => {'function' => \&mediawiki_titlefont};
-$style_map{'option'} => {'args' => ['code'],
-                        'attribute' => 'code',
-                        'quote' => '"'};
-$style_map{'samp'} => {'args' => ['code'],
-                      'attribute' => 'code',
-                      'quote' => '"'};
+$style_map{'titlefont'} = {'function' => \&mediawiki_titlefont};
+#$style_map{'option'} = {'args' => ['code'],
+#                       'attribute' => 'code',
+#                       'quote' => '"'};
+#$style_map{'samp'} = {'args' => ['code'],
+#                     'attribute' => 'code',
+#                     'quote' => '"'};
 
 
 

Index: Tests/ccvs_mediawiki_nosplit_res/cvs
===================================================================
RCS file: Tests/ccvs_mediawiki_nosplit_res/cvs
diff -N Tests/ccvs_mediawiki_nosplit_res/cvs
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ Tests/ccvs_mediawiki_nosplit_res/cvs        12 Mar 2008 10:24:12 -0000      
1.1
@@ -0,0 +1,17225 @@
+<div id="Top"></div>
+<div id="SEC_Top"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== CVS&mdash;Concurrent Versions System v1.12.1.1 ==
+
+<p>This info manual describes how to use and administer
+<small>CVS</small> version 1.12.1.1.
+</p>
+
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC1| 
Overview]]::<nowiki>                    An introduction to CVS
+</nowiki>&bull;[[#SEC9| Repository]]::<nowiki>                  Where all your 
sources are stored
+</nowiki>&bull;[[#SEC38| Starting a new project]]::<nowiki>      Starting a 
project with CVS
+</nowiki>&bull;[[#SEC44| Revisions]]::<nowiki>                   Numeric and 
symbolic names for revisions
+</nowiki>&bull;[[#SEC54| Branching and merging]]::<nowiki>       
Diverging/rejoining branches of development
+</nowiki>&bull;[[#SEC65| Recursive behavior]]::<nowiki>          CVS descends 
directories
+</nowiki>&bull;[[#SEC66| Adding and removing]]::<nowiki>         
Adding/removing/renaming files/directories
+</nowiki>&bull;[[#SEC75| History browsing]]::<nowiki>            Viewing the 
history of files in various ways
+
+CVS and the Real World.
+-----------------------
+</nowiki>&bull;[[#SEC80| Binary files]]::<nowiki>                CVS can 
handle binary files
+</nowiki>&bull;[[#SEC83| Multiple developers]]::<nowiki>         How CVS helps 
a group of developers
+</nowiki>&bull;[[#SEC96| Revision management]]::<nowiki>         Policy 
questions for revision management
+</nowiki>&bull;[[#SEC98| Keyword substitution]]::<nowiki>        CVS can 
include the revision inside the file
+</nowiki>&bull;[[#SEC105| Tracking sources]]::<nowiki>            Tracking 
third-party sources
+</nowiki>&bull;[[#SEC112| Builds]]::<nowiki>                      Issues 
related to CVS and builds
+</nowiki>&bull;[[#SEC113| Special Files]]::<nowiki>            Devices, links 
and other non-regular files
+
+References.
+-----------
+</nowiki>&bull;[[#SEC114| CVS commands]]::<nowiki>                CVS commands 
share some things
+</nowiki>&bull;[[#SEC156| Invoking CVS]]::<nowiki>                Quick 
reference to CVS commands
+</nowiki>&bull;[[#SEC157| Administrative files]]::<nowiki>        Reference 
manual for the Administrative files
+</nowiki>&bull;[[#SEC181| Environment variables]]::<nowiki>       All 
environment variables which affect CVS
+</nowiki>&bull;[[#SEC182| Compatibility]]::<nowiki>               Upgrading 
CVS versions
+</nowiki>&bull;[[#SEC183| Troubleshooting]]::<nowiki>             Some tips 
when nothing works
+</nowiki>&bull;[[#SEC187| Credits]]::<nowiki>                     Some of the 
contributors to this manual
+</nowiki>&bull;[[#SEC188| BUGS]]::<nowiki>                        Dealing with 
bugs in CVS or this manual
+</nowiki>&bull;[[#SEC189| Index]]::<nowiki>                       Index
+</nowiki></pre>
+<hr size="1">
+<div id="Overview"></div>
+<div id="SEC1"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC_Top| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC2| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[ &lt;&lt; ]</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC9| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== Overview ==
+
+<p>This chapter is for people who have never used
+<small>CVS</small>, and perhaps have never used version control
+software before.
+</p>
+<p>If you are already familiar with <small>CVS</small> and are just
+trying to learn a particular feature or remember a
+certain command, you can probably skip everything here.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC2| What is 
CVS?]]::<nowiki>                What you can do with CVS
+</nowiki>&bull;[[#SEC3| What is CVS not?]]::<nowiki>            Problems CVS 
doesn't try to solve
+</nowiki>&bull;[[#SEC4| A sample session]]::<nowiki>            A tour of 
basic CVS usage
+</nowiki></pre>
+<hr size="6">
+<div id="What-is-CVS_003f"></div>
+<div id="SEC2"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC1| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC3| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC1| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC1| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC9| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== What is CVS? ===
+
+<p><small>CVS</small> is a version control system.  Using it, you can
+record the history of your source files.
+</p>
+
+<p>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 <small>CVS</small>, you can easily retrieve old versions to see
+exactly which change caused the bug.  This can
+sometimes be a big help.
+</p>
+<p>You could of course save every version of every file
+you have ever created.  This would
+however waste an enormous amount of disk space.  <small>CVS</small>
+stores all the versions of a file in a single file in a
+clever way that only stores the differences between
+versions.
+</p>
+<p><small>CVS</small> 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&rsquo; changes unless you are extremely careful.
+Some editors, like <small>GNU</small> 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.  <small>CVS</small> solves this problem
+by insulating the different developers from each other.  Every
+developer works in his own directory, and <small>CVS</small> merges
+the work when each developer is done.
+</p>
+<div id="IDX1"></div>
+<div id="IDX2"></div>
+<div id="IDX3"></div>
+<div id="IDX4"></div>
+<p><small>CVS</small> started out as a bunch of shell scripts written by
+Dick Grune, posted to the newsgroup
+<code>comp.sources.unix</code> in the volume 6
+release of July, 1986.  While no actual code from
+these shell scripts is present in the current version
+of <small>CVS</small> much of the <small>CVS</small> conflict resolution 
algorithms
+come from them.
+</p>
+<p>In April, 1989, Brian Berliner designed and coded <small>CVS</small>.
+Jeff Polk later helped Brian with the design of the <small>CVS</small>
+module and vendor branch support.
+</p>
+<div id="IDX5"></div>
+<p>You can get <small>CVS</small> in a variety of ways, including
+free download from the internet.  For more information
+on downloading <small>CVS</small> and other <small>CVS</small> topics, see:
+</p>
+<table><tr><td>&nbsp;</td><td><pre 
class="example"><nowiki>http://www.cvshome.org/
+http://www.loria.fr/~molli/cvs-index.html
+</nowiki></pre></td></tr></table>
+
+<div id="IDX6"></div>
+<div id="IDX7"></div>
+<div id="IDX8"></div>
+<p>There is a mailing list, known as <code>info-cvs</code>,
+devoted to <small>CVS</small>.  To subscribe or
+unsubscribe
+write to
+<code>address@hidden</code>.
+If you prefer a usenet group, the right
+group is <code>comp.software.config-mgmt</code> which is for
+<small>CVS</small> discussions (along with other configuration
+management systems).  In the future, it might be
+possible to create a
+<code>comp.software.config-mgmt.cvs</code>, but probably only
+if there is sufficient <small>CVS</small> traffic on
+<code>comp.software.config-mgmt</code>.
+</p>
+<p>You can also subscribe to the <code>bug-cvs</code> mailing list,
+described in more detail in [[#SEC188|Dealing with bugs in CVS or this 
manual]].  To subscribe
+send mail to <code>address@hidden</code>.
+</p>
+<hr size="6">
+<div id="What-is-CVS-not_003f"></div>
+<div id="SEC3"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC2| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC4| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC1| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC1| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC9| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== What is CVS not? ===
+
+<p><small>CVS</small> can do a lot of things for you, but it does
+not try to be everything for everyone.
+</p>
+<dl compact="compact">
+<dt> <small>CVS</small> is not a build system.</dt>
+<dd>
+<p>Though the structure of your repository and modules
+file interact with your build system
+(e.g. &lsquo;<tt>Makefile</tt>&rsquo;s), they are essentially
+independent.
+</p>
+<p><small>CVS</small> does not dictate how you build anything.  It
+merely stores files for retrieval in a tree structure
+you devise.
+</p>
+<p><small>CVS</small> does not dictate how to use disk space in the
+checked out working directories.  If you write your
+&lsquo;<tt>Makefile</tt>&rsquo;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.
+</p>
+<p>If you modularize your work, and construct a build
+system that will share files (via links, mounts,
+<code>VPATH</code> in &lsquo;<tt>Makefile</tt>&rsquo;s, etc.), you can
+arrange your disk usage however you like.
+</p>
+<p>But you have to remember that <em>any</em> such system is
+a lot of work to construct and maintain.  <small>CVS</small> does
+not address the issues involved.
+</p>
+<p>Of course, you should place the tools created to
+support such a build system (scripts, &lsquo;<tt>Makefile</tt>&rsquo;s,
+etc) under <small>CVS</small>.
+</p>
+<p>Figuring out what files need to be rebuilt when
+something changes is, again, something to be handled
+outside the scope of <small>CVS</small>.  One traditional
+approach is to use <code>make</code> for building, and use
+some automated tool for generating the dependencies which
+<code>make</code> uses.
+</p>
+<p>See [[#SEC112|How your build system interacts with CVS]], for more 
information on doing builds
+in conjunction with <small>CVS</small>.
+</p>
+</dd>
+<dt> <small>CVS</small> is not a substitute for management.</dt>
+<dd>
+<p>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&rsquo;t, <small>CVS</small> can&rsquo;t help.
+</p>
+<p><small>CVS</small> 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.
+</p>
+</dd>
+<dt> <small>CVS</small> is not a substitute for developer communication.</dt>
+<dd>
+<p>When faced with conflicts within a single file, most
+developers manage to resolve them without too much
+effort.  But a more general definition of &ldquo;conflict&rdquo;
+includes problems too difficult to solve without
+communication between developers.
+</p>
+<p><small>CVS</small> 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 <em>conflict</em> is purely textual, arising
+when two changes to the same base file are near enough
+to spook the merge (i.e. <code>diff3</code>) command.
+</p>
+<p><small>CVS</small> does not claim to help at all in figuring out
+non-textual or distributed conflicts in program logic.
+</p>
+<p>For example: Say you change the arguments to function
+<code>X</code> defined in file &lsquo;<tt>A</tt>&rsquo;.  At the same time,
+someone edits file &lsquo;<tt>B</tt>&rsquo;, adding new calls to
+function <code>X</code> using the old arguments.  You are
+outside the realm of <small>CVS</small>&rsquo;s competence.
+</p>
+<p>Acquire the habit of reading specs and talking to your
+peers.
+</p>
+
+</dd>
+<dt> <small>CVS</small> does not have change control</dt>
+<dd>
+<p>Change control refers to a number of things.  First of
+all it can mean <em>bug-tracking</em>, 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
+<small>CVS</small> to an external bug-tracking system, see the
+&lsquo;<tt>rcsinfo</tt>&rsquo; and &lsquo;<tt>verifymsg</tt>&rsquo; files
+(see section [[#SEC157|Reference manual for Administrative files]]).
+</p>
+<p>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 <code>cvs commit</code>
+operation, <small>CVS</small> 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 <small>GNU</small> style &lsquo;<tt>ChangeLog</tt>&rsquo;
+can help somewhat.
+</p>
+<p>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 <small>CVS</small> is to
+generate a diff (using <code>cvs diff</code> or <code>diff</code>)
+and email it to someone who can then apply it using the
+<code>patch</code> utility.  This is very flexible, but
+depends on mechanisms outside <small>CVS</small> to make sure
+nothing falls through the cracks.
+</p>
+</dd>
+<dt> <small>CVS</small> is not an automated testing program</dt>
+<dd>
+<p>It should be possible to enforce mandatory use of a
+testsuite using the <code>commitinfo</code> file.  I haven&rsquo;t
+heard a lot about projects trying to do that or whether
+there are subtle gotchas, however.
+</p>
+</dd>
+<dt> <small>CVS</small> does not have a builtin process model</dt>
+<dd>
+<p>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 <small>CVS</small> but it might be a little more work.
+In some cases you&rsquo;ll want to use the &lsquo;<tt>commitinfo</tt>&rsquo;,
+&lsquo;<tt>loginfo</tt>&rsquo;, &lsquo;<tt>rcsinfo</tt>&rsquo;, or 
&lsquo;<tt>verifymsg</tt>&rsquo;
+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.
+</p></dd>
+</dl>
+
+<hr size="6">
+<div id="A-sample-session"></div>
+<div id="SEC4"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC3| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC5| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC1| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC1| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC9| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== A sample session ===
+
+
+<p>As a way of introducing <small>CVS</small>, we&rsquo;ll go through a
+typical work-session using <small>CVS</small>.  The first thing
+to understand is that <small>CVS</small> stores all files in a
+centralized <em>repository</em> (see section [[#SEC9|The Repository]]); this
+section assumes that a repository is set up.
+</p>
+<p>Suppose you are working on a simple compiler.  The source
+consists of a handful of C files and a &lsquo;<tt>Makefile</tt>&rsquo;.
+The compiler is called &lsquo;<samp>tc</samp>&rsquo; (Trivial Compiler),
+and the repository is set up so that there is a module
+called &lsquo;<samp>tc</samp>&rsquo;.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC5| Getting the 
source]]::<nowiki>          Creating a workspace
+</nowiki>&bull;[[#SEC6| Committing your changes]]::<nowiki>     Making your 
work available to others
+</nowiki>&bull;[[#SEC7| Cleaning up]]::<nowiki>                 Cleaning up
+</nowiki>&bull;[[#SEC8| Viewing differences]]::<nowiki>         Viewing 
differences
+</nowiki></pre>
+<hr size="6">
+<div id="Getting-the-source"></div>
+<div id="SEC5"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC4| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC6| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC1| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC4| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC9| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Getting the source ====
+
+<p>The first thing you must do is to get your own working copy of the
+source for &lsquo;<samp>tc</samp>&rsquo;.  For this, you use the 
<code>checkout</code> command:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs checkout tc
+</nowiki></pre></td></tr></table>
+
+<p>This will create a new directory called &lsquo;<tt>tc</tt>&rsquo; and 
populate it with
+the source files.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cd tc
+$ ls
+CVS         Makefile    backend.c   driver.c    frontend.c  parser.c
+</nowiki></pre></td></tr></table>
+
+<p>The &lsquo;<tt>CVS</tt>&rsquo; directory is used internally by
+<small>CVS</small>.  Normally, you should not modify or remove
+any of the files in it.
+</p>
+<p>You start your favorite editor, hack away at 
&lsquo;<tt>backend.c</tt>&rsquo;, and a couple
+of hours later you have added an optimization pass to the compiler.
+A note to <small>RCS</small> and <small>SCCS</small> users: There is no need 
to lock the files that
+you want to edit.  See section [[#SEC83|Multiple developers]], for an 
explanation.
+</p>
+<hr size="6">
+<div id="Committing-your-changes"></div>
+<div id="SEC6"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC5| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC7| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC1| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC4| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC9| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Committing your changes ====
+
+<p>When you have checked that the compiler is still compilable you decide
+to make a new version of &lsquo;<tt>backend.c</tt>&rsquo;.  This will
+store your new &lsquo;<tt>backend.c</tt>&rsquo; in the repository and
+make it available to anyone else who is using that same
+repository.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs commit 
backend.c
+</nowiki></pre></td></tr></table>
+
+<p><small>CVS</small> starts an editor, to allow you to enter a log
+message.  You type in &ldquo;Added an optimization pass.&rdquo;,
+save the temporary file, and exit the editor.
+</p>
+<div id="IDX9"></div>
+<div id="IDX10"></div>
+<p>The environment variable <code>$CVSEDITOR</code> determines
+which editor is started.  If <code>$CVSEDITOR</code> is not
+set, then if the environment variable <code>$EDITOR</code> is
+set, it will be used. If both <code>$CVSEDITOR</code> and
+<code>$EDITOR</code> are not set then there is a default
+which will vary with your operating system, for example
+<code>vi</code> for unix or <code>notepad</code> for Windows
+NT/95.
+</p>
+<div id="IDX11"></div>
+<p>In addition, <small>CVS</small> checks the <code>$VISUAL</code> environment
+variable.  Opinions vary on whether this behavior is desirable and
+whether future releases of <small>CVS</small> should check 
<code>$VISUAL</code> or
+ignore it.  You will be OK either way if you make sure that
+<code>$VISUAL</code> is either unset or set to the same thing as
+<code>$EDITOR</code>.
+</p>
+<p>When <small>CVS</small> starts the editor, it includes a list of
+files which are modified.  For the <small>CVS</small> 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&rsquo;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&mdash;if
+you proceed with the commit <small>CVS</small> will detect that
+the contents are not modified and treat it as an
+unmodified file.  The next <code>update</code> will clue
+<small>CVS</small> 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.
+</p>
+<p>If you want to avoid
+starting an editor you can specify the log message on
+the command line using the &lsquo;<samp>-m</samp>&rsquo; flag instead, like
+this:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs commit -m 
&quot;Added an optimization pass&quot; backend.c
+</nowiki></pre></td></tr></table>
+
+<hr size="6">
+<div id="Cleaning-up"></div>
+<div id="SEC7"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC6| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC8| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC1| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC4| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC9| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Cleaning up ====
+
+<p>Before you turn to other tasks you decide to remove your working copy of
+tc.  One acceptable way to do that is of course
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cd ..
+$ rm -r tc
+</nowiki></pre></td></tr></table>
+
+<p>but a better way is to use the <code>release</code> command (see section 
[[#SEC149|release&mdash;Indicate that a Module is no longer in use]]):
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ 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.
+</nowiki></pre></td></tr></table>
+
+<p>The <code>release</code> command checks that all your modifications have 
been
+committed.  If history logging is enabled it also makes a note in the
+history file.  See section [[#SEC178|The history file]].
+</p>
+<p>When you use the &lsquo;<samp>-d</samp>&rsquo; flag with 
<code>release</code>, it
+also removes your working copy.
+</p>
+<p>In the example above, the <code>release</code> command wrote a couple of 
lines
+of output.  &lsquo;<samp>? tc</samp>&rsquo; means that the file 
&lsquo;<tt>tc</tt>&rsquo; is unknown to <small>CVS</small>.
+That is nothing to worry about: &lsquo;<tt>tc</tt>&rsquo; is the executable 
compiler,
+and it should not be stored in the repository.  See section [[#SEC176|Ignoring 
files via cvsignore]],
+for information about how to make that warning go away.
+See section [[#SEC151|release output]], for a complete explanation of
+all possible output from <code>release</code>.
+</p>
+<p>&lsquo;<samp>M driver.c</samp>&rsquo; is more serious.  It means that the
+file &lsquo;<tt>driver.c</tt>&rsquo; has been modified since it was
+checked out.
+</p>
+<p>The <code>release</code> 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.
+</p>
+<p>You decide to play it safe and answer <kbd>n &lt;RET&gt;</kbd>
+when <code>release</code> asks for confirmation.
+</p>
+<hr size="6">
+<div id="Viewing-differences"></div>
+<div id="SEC8"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC7| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC9| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC1| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC4| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC9| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Viewing differences ====
+
+<p>You do not remember modifying &lsquo;<tt>driver.c</tt>&rsquo;, so you want 
to see what
+has happened to that file.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cd tc
+$ cvs diff driver.c
+</nowiki></pre></td></tr></table>
+
+<p>This command runs <code>diff</code> to compare the version of 
&lsquo;<tt>driver.c</tt>&rsquo;
+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.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs commit -m 
&quot;Added an optimization pass&quot; driver.c
+Checking in driver.c;
+/usr/local/cvsroot/tc/driver.c,v  &lt;--  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
+</nowiki></pre></td></tr></table>
+
+<hr size="6">
+<div id="Repository"></div>
+<div id="SEC9"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC8| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC10| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC1| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== The Repository ==
+
+<p>The <small>CVS</small> <em>repository</em> stores a complete copy of
+all the files and directories which are under version
+control.
+</p>
+<p>Normally, you never access any of the files in the
+repository directly.  Instead, you use <small>CVS</small>
+commands to get your own copy of the files into a
+<em>working directory</em>, and then
+work on that copy.  When you&rsquo;ve finished a set of
+changes, you check (or <em>commit</em>) 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.
+</p>
+<div id="IDX12"></div>
+<p><small>CVS</small> 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 <em>access method</em>.
+For example, the access method <code>:local:</code> means to
+access a repository directory, so the repository
+<code>:local:/usr/local/cvsroot</code> means that the
+repository is in &lsquo;<tt>/usr/local/cvsroot</tt>&rsquo; on the
+computer running <small>CVS</small>.  For information on other
+access methods, see [[#SEC26|Remote repositories]].
+</p>
+<p>If the access method is omitted, then if the repository
+starts with &lsquo;<samp>/</samp>&rsquo;, then <code>:local:</code> is
+assumed.  If it does not start with &lsquo;<samp>/</samp>&rsquo; then either
+<code>:ext:</code> or <code>:server:</code> is assumed.  For
+example, if you have a local repository in
+&lsquo;<tt>/usr/local/cvsroot</tt>&rsquo;, you can use
+<code>/usr/local/cvsroot</code> instead of
+<code>:local:/usr/local/cvsroot</code>.  But if (under
+Windows NT, for example) your local repository is
+&lsquo;<tt>c:\src\cvsroot</tt>&rsquo;, then you must specify the access
+method, as in <code>:local:c:/src/cvsroot</code>.
+</p>
+<p>The repository is split in two parts.  
&lsquo;<tt>$CVSROOT/CVSROOT</tt>&rsquo; contains
+administrative files for <small>CVS</small>.  The other directories contain 
the actual
+user-defined modules.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC10| Specifying a 
repository]]::<nowiki>     Telling CVS where your repository is
+</nowiki>&bull;[[#SEC11| Repository storage]]::<nowiki>          The structure 
of the repository
+</nowiki>&bull;[[#SEC19| Working directory storage]]::<nowiki>   The structure 
of working directories
+</nowiki>&bull;[[#SEC20| Intro administrative files]]::<nowiki>  Defining 
modules
+</nowiki>&bull;[[#SEC22| Multiple repositories]]::<nowiki>       Multiple 
repositories
+</nowiki>&bull;[[#SEC23| Creating a repository]]::<nowiki>       Creating a 
repository
+</nowiki>&bull;[[#SEC24| Backing up]]::<nowiki>                  Backing up a 
repository
+</nowiki>&bull;[[#SEC25| Moving a repository]]::<nowiki>         Moving a 
repository
+</nowiki>&bull;[[#SEC26| Remote repositories]]::<nowiki>         Accessing 
repositories on remote machines
+</nowiki>&bull;[[#SEC36| Read-only access]]::<nowiki>            Granting 
read-only access to the repository
+</nowiki>&bull;[[#SEC37| Server temporary directory]]::<nowiki>  The server 
creates temporary directories
+</nowiki></pre>
+<hr size="6">
+<div id="Specifying-a-repository"></div>
+<div id="SEC10"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC9| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC11| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC9| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Telling CVS where your repository is ===
+
+<p>There are several ways to tell <small>CVS</small>
+where to find the repository.  You can name the
+repository on the command line explicitly, with the
+<code>-d</code> (for &quot;directory&quot;) option:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs -d 
/usr/local/cvsroot checkout yoyodyne/tc
+</nowiki></pre></td></tr></table>
+
+<div id="IDX13"></div>
+<div id="IDX14"></div>
+<div id="IDX15"></div>
+<div id="IDX16"></div>
+<div id="IDX17"></div>
+<p>        Or you can set the <code>$CVSROOT</code> environment
+variable to an absolute path to the root of the
+repository, &lsquo;<tt>/usr/local/cvsroot</tt>&rsquo; in this example.
+To set <code>$CVSROOT</code>, <code>csh</code> and <code>tcsh</code>
+users should have this line in their &lsquo;<tt>.cshrc</tt>&rsquo; or
+&lsquo;<tt>.tcshrc</tt>&rsquo; files:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>setenv CVSROOT 
/usr/local/cvsroot
+</nowiki></pre></td></tr></table>
+
+<p><code>sh</code> and <code>bash</code> users should instead have these lines 
in their
+&lsquo;<tt>.profile</tt>&rsquo; or &lsquo;<tt>.bashrc</tt>&rsquo;:
+</p>
+<table><tr><td>&nbsp;</td><td><pre 
class="example"><nowiki>CVSROOT=/usr/local/cvsroot
+export CVSROOT
+</nowiki></pre></td></tr></table>
+
+<div id="IDX18"></div>
+<div id="IDX19"></div>
+<p>        A repository specified with <code>-d</code> will
+override the <code>$CVSROOT</code> environment variable.
+Once you&rsquo;ve checked a working copy out from the
+repository, it will remember where its repository is
+(the information is recorded in the
+&lsquo;<tt>CVS/Root</tt>&rsquo; file in the working copy).
+</p>
+<p>The <code>-d</code> option and the &lsquo;<tt>CVS/Root</tt>&rsquo; file both
+override the <code>$CVSROOT</code> environment variable.  If
+<code>-d</code> option differs from &lsquo;<tt>CVS/Root</tt>&rsquo;, the
+former is used.  Of course, for proper operation they
+should be two ways of referring to the same repository.
+</p>
+<hr size="6">
+<div id="Repository-storage"></div>
+<div id="SEC11"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC10| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC12| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC9| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== How data is stored in the repository ===
+
+<p>For most purposes it isn&rsquo;t important <em>how</em>
+<small>CVS</small> 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 <small>CVS</small> commands, such
+changes need not be disruptive.
+</p>
+<p>However, in some cases it may be necessary to
+understand how <small>CVS</small> stores data in the repository,
+for example you might need to track down <small>CVS</small> locks
+(see section [[#SEC88|Several developers simultaneously attempting to run 
CVS]]) or you might need to deal with
+the file permissions appropriate for the repository.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC12| Repository 
files]]::<nowiki>            What files are stored in the repository
+</nowiki>&bull;[[#SEC13| File permissions]]::<nowiki>            File 
permissions
+</nowiki>&bull;[[#SEC14| Windows permissions]]::<nowiki>         Issues 
specific to Windows
+</nowiki>&bull;[[#SEC15| Attic]]::<nowiki>                       Some files 
are stored in the Attic
+</nowiki>&bull;[[#SEC16| CVS in repository]]::<nowiki>           Additional 
information in CVS directory
+</nowiki>&bull;[[#SEC17| Locks]]::<nowiki>                       CVS locks 
control concurrent accesses
+</nowiki>&bull;[[#SEC18| CVSROOT storage]]::<nowiki>             A few things 
about CVSROOT are different
+</nowiki></pre>
+<hr size="6">
+<div id="Repository-files"></div>
+<div id="SEC12"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC11| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC13| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC11| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Where files are stored within the repository ====
+
+
+<p>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
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>/usr/local/cvsroot
+</nowiki></pre></td></tr></table>
+
+<p>here is a possible directory tree (showing only the
+directories):
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki><tt>/usr</tt>
+ |
+ +--<tt>local</tt>
+ |   |
+ |   +--<tt>cvsroot</tt>
+ |   |    |
+ |   |    +--<tt>CVSROOT</tt>
+          |      (administrative files)
+          |
+          +--<tt>gnu</tt>
+          |   |
+          |   +--<tt>diff</tt>
+          |   |   (source code to GNU diff)
+          |   |
+          |   +--<tt>rcs</tt>
+          |   |   (source code to RCS)
+          |   |
+          |   +--<tt>cvs</tt>
+          |       (source code to CVS)
+          |
+          +--<tt>yoyodyne</tt>
+              |
+              +--<tt>tc</tt>
+              |    |
+              |    +--<tt>man</tt>
+              |    |
+              |    +--<tt>testing</tt>
+              |
+              +--(other Yoyodyne software)
+</nowiki></pre></td></tr></table>
+
+<p>With the directories are <em>history files</em> for each file
+under version control.  The name of the history file is
+the name of the corresponding file with &lsquo;<samp>,v</samp>&rsquo;
+appended to the end.  Here is what the repository for
+the &lsquo;<tt>yoyodyne/tc</tt>&rsquo; directory might look like:
+</p><table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>  
<code>$CVSROOT</code>
+    |
+    +--<tt>yoyodyne</tt>
+    |   |
+    |   +--<tt>tc</tt>
+    |   |   |
+            +--<tt>Makefile,v</tt>
+            +--<tt>backend.c,v</tt>
+            +--<tt>driver.c,v</tt>
+            +--<tt>frontend.c,v</tt>
+            +--<tt>parser.c,v</tt>
+            +--<tt>man</tt>
+            |    |
+            |    +--<tt>tc.1,v</tt>
+            |
+            +--<tt>testing</tt>
+                 |
+                 +--<tt>testpgm.t,v</tt>
+                 +--<tt>test2.t,v</tt>
+</nowiki></pre></td></tr></table>
+
+<div id="IDX20"></div>
+<div id="IDX21"></div>
+<p>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 <em>RCS files</em>, because the first program to
+store files in that format was a version control system
+known as <small>RCS</small>.  For a full
+description of the file format, see the <code>man</code> page
+<cite>rcsfile(5)</cite>, distributed with <small>RCS</small>, or the
+file &lsquo;<tt>doc/RCSFILES</tt>&rsquo; in the <small>CVS</small> source
+distribution.  This
+file format has become very common&mdash;many systems other
+than <small>CVS</small> or <small>RCS</small> can at least import history
+files in this format.
+</p>
+<p>The <small>RCS</small> files used in <small>CVS</small> differ in a few
+ways from the standard format.  The biggest difference
+is magic branches; for more information see [[#SEC59|Magic branch numbers]].  
Also in <small>CVS</small> the valid tag names
+are a subset of what <small>RCS</small> accepts; for <small>CVS</small>&rsquo;s
+rules see [[#SEC48|Tags&ndash;Symbolic revisions]].
+</p>
+<hr size="6">
+<div id="File-permissions"></div>
+<div id="SEC13"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC12| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC14| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC11| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== File permissions ====
+<p>All &lsquo;<samp>,v</samp>&rsquo; 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.)
+</p>
+
+<p>This means that you can only control access to files on
+a per-directory basis.
+</p>
+<p>Note that users must also have write access to check
+out files, because <small>CVS</small> needs to create lock files
+(see section [[#SEC88|Several developers simultaneously attempting to run 
CVS]]).  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
+(see section [[#SEC180|The CVSROOT/config configuration file]]).
+</p>
+<p>Also note that users must have write access to the
+&lsquo;<tt>CVSROOT/val-tags</tt>&rsquo; file.  <small>CVS</small> 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).
+</p>
+<p>Each <small>RCS</small> file will be owned by the user who last
+checked it in.  This has little significance; what
+really matters is who owns the directories.
+</p>
+<div id="IDX22"></div>
+<div id="IDX23"></div>
+<p><small>CVS</small> 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 <code>CVSUMASK</code>
+environment variable that will control the file
+permissions which <small>CVS</small> uses in creating directories
+and/or files in the repository.  <code>CVSUMASK</code> 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
+<small>CVS</small> creates them read-only (see the sections on
+watches, [[#SEC90|Telling CVS to watch certain files]]; -r, [[#SEC118|Global 
options]]; or <code>CVSREAD</code>, [[#SEC181|All environment variables which 
affect CVS]]).
+</p>
+<p>Note that using the client/server <small>CVS</small>
+(see section [[#SEC26|Remote repositories]]), there is no good way to
+set <code>CVSUMASK</code>; the setting on the client machine
+has no effect.  If you are connecting with <code>rsh</code>, you
+can set <code>CVSUMASK</code> in &lsquo;<tt>.bashrc</tt>&rsquo; or 
&lsquo;<tt>.cshrc</tt>&rsquo;, as
+described in the documentation for your operating
+system.  This behavior might change in future versions
+of <small>CVS</small>; do not rely on the setting of
+<code>CVSUMASK</code> on the client having no effect.
+</p>
+<p>Using pserver, you will generally need stricter
+permissions on the <small>CVSROOT</small> directory and
+directories above it in the tree; see [[#SEC32|Security considerations with 
password authentication]].
+</p>
+<div id="IDX24"></div>
+<div id="IDX25"></div>
+<div id="IDX26"></div>
+<div id="IDX27"></div>
+<p>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.  <small>CVS</small> was not written to use such
+features and therefore attempting to install <small>CVS</small> 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
+<small>CVS</small>.  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
+([[#SEC32|Security considerations with password authentication]]).
+</p>
+<hr size="6">
+<div id="Windows-permissions"></div>
+<div id="SEC14"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC13| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC15| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC11| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== File Permission issues specific to Windows ====
+
+<p>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&rsquo;m not
+sure).
+</p>
+<p>If you are using local <small>CVS</small> 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&rsquo;t investigated enough to know the
+implications of enabling that option, nor do I know
+whether there is something which <small>CVS</small> could be doing
+differently in order to avoid the problem.  If you find
+something out, please let us know as described in
+[[#SEC188|Dealing with bugs in CVS or this manual]].
+</p>
+<hr size="6">
+<div id="Attic"></div>
+<div id="SEC15"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC14| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC16| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC11| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== The attic ====
+
+<p>You will notice that sometimes <small>CVS</small> stores an
+<small>RCS</small> file in the <code>Attic</code>.  For example, if the
+<small>CVSROOT</small> is &lsquo;<tt>/usr/local/cvsroot</tt>&rsquo; and we are
+talking about the file &lsquo;<tt>backend.c</tt>&rsquo; in the
+directory &lsquo;<tt>yoyodyne/tc</tt>&rsquo;, then the file normally
+would be in
+</p>
+<table><tr><td>&nbsp;</td><td><pre 
class="example"><nowiki>/usr/local/cvsroot/yoyodyne/tc/backend.c,v
+</nowiki></pre></td></tr></table>
+
+<p>but if it goes in the attic, it would be in
+</p>
+<table><tr><td>&nbsp;</td><td><pre 
class="example"><nowiki>/usr/local/cvsroot/yoyodyne/tc/Attic/backend.c,v
+</nowiki></pre></td></tr></table>
+
+<div id="IDX28"></div>
+<p>instead.  It should not matter from a user point of
+view whether a file is in the attic; <small>CVS</small> 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 <code>dead</code>.  A
+<code>dead</code> 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 <code>dead</code> state, and a branch revision in a
+non-<code>dead</code> state.
+</p>
+<hr size="6">
+<div id="CVS-in-repository"></div>
+<div id="SEC16"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC15| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC17| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC11| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== The CVS directory in the repository ====
+
+<p>The &lsquo;<tt>CVS</tt>&rsquo; directory in each repository directory
+contains information such as file attributes (in a file
+called &lsquo;<tt>CVS/fileattr</tt>&rsquo;.  In the
+future additional files may be added to this directory,
+so implementations should silently ignore additional
+files.
+</p>
+<p>This behavior is implemented only by <small>CVS</small> 1.7 and
+later; for details see [[#SEC94|Using watches with old versions of CVS]].
+</p>
+<p>The format of the fileattr file is a series of entries
+of the following form (where &lsquo;<samp>{</samp>&rsquo; and 
&lsquo;<samp>}</samp>&rsquo;
+means the text between the braces can be repeated zero
+or more times):
+</p>
+<p><var>ent-type</var> <var>filename</var> &lt;tab&gt; <var>attrname</var> = 
<var>attrval</var>
+  {; <var>attrname</var> = <var>attrval</var>} &lt;linefeed&gt;
+</p>
+<p><var>ent-type</var> is &lsquo;<samp>F</samp>&rsquo; for a file, in which 
case the entry specifies the
+attributes for that file.
+</p>
+<p><var>ent-type</var> is &lsquo;<samp>D</samp>&rsquo;,
+and <var>filename</var> empty, to specify default attributes
+to be used for newly added files.
+</p>
+<p>Other <var>ent-type</var> are reserved for future expansion.  
<small>CVS</small> 1.9 and older
+will delete them any time it writes file attributes.
+<small>CVS</small> 1.10 and later will preserve them.
+</p>
+<p>Note that the order of the lines is not significant;
+a program writing the fileattr file may
+rearrange them at its convenience.
+</p>
+<p>There is currently no way of quoting tabs or linefeeds in the
+filename, &lsquo;<samp>=</samp>&rsquo; in <var>attrname</var>,
+&lsquo;<samp>;</samp>&rsquo; in <var>attrval</var>, etc.  Note: some 
implementations also
+don&rsquo;t handle a NUL character in any of the fields, but
+implementations are encouraged to allow it.
+</p>
+<p>By convention, <var>attrname</var> starting with 
&lsquo;<samp>_</samp>&rsquo; is for an attribute given
+special meaning by <small>CVS</small>; other <var>attrname</var>s are for 
user-defined attributes
+(or will be, once implementations start supporting user-defined attributes).
+</p>
+<p>Builtin attributes:
+</p>
+<dl compact="compact">
+<dt> <code>_watched</code></dt>
+<dd><p>Present means the file is watched and should be checked out
+read-only.
+</p>
+</dd>
+<dt> <code>_watchers</code></dt>
+<dd><p>Users with watches for this file.  Value is
+<var>watcher</var> &gt; <var>type</var> { , <var>watcher</var> &gt; 
<var>type</var> }
+where <var>watcher</var> is a username, and <var>type</var>
+is zero or more of edit,unedit,commit separated by
+&lsquo;<samp>+</samp>&rsquo; (that is, nothing if none; there is no 
&quot;none&quot; or &quot;all&quot; keyword).
+</p>
+</dd>
+<dt> <code>_editors</code></dt>
+<dd><p>Users editing this file.  Value is
+<var>editor</var> &gt; <var>val</var> { , <var>editor</var> &gt; 
<var>val</var> }
+where <var>editor</var> is a username, and <var>val</var> is
+<var>time</var>+<var>hostname</var>+<var>pathname</var>, where
+<var>time</var> is when the <code>cvs edit</code> command (or
+equivalent) happened,
+and <var>hostname</var> and <var>pathname</var> are for the working directory.
+</p></dd>
+</dl>
+
+<p>Example:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>Ffile1 
_watched=;_watchers=joe&gt;edit,mary&gt;commit
+Ffile2 _watched=;_editors=sue&gt;8 Jan 1975+workstn1+/home/sue/cvs
+D _watched=
+</nowiki></pre></td></tr></table>
+
+<p>means that the file &lsquo;<tt>file1</tt>&rsquo; should be checked out
+read-only.  Furthermore, joe is watching for edits and
+mary is watching for commits.  The file &lsquo;<tt>file2</tt>&rsquo;
+should be checked out read-only; sue started editing it
+on 8 Jan 1975 in the directory &lsquo;<tt>/home/sue/cvs</tt>&rsquo; on
+the machine <code>workstn1</code>.  Future files which are
+added should be checked out read-only.  To represent
+this example here, we have shown a space after
+&lsquo;<samp>D</samp>&rsquo;, &lsquo;<samp>Ffile1</samp>&rsquo;, and 
&lsquo;<samp>Ffile2</samp>&rsquo;, but in fact
+there must be a single tab character there and no spaces.
+</p>
+<hr size="6">
+<div id="Locks"></div>
+<div id="SEC17"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC16| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC18| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC11| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== CVS locks in the repository ====
+
+<p>For an introduction to <small>CVS</small> locks focusing on
+user-visible behavior, see [[#SEC88|Several developers simultaneously 
attempting to run CVS]].  The
+following section is aimed at people who are writing
+tools which want to access a <small>CVS</small> repository without
+interfering with other tools accessing the same
+repository.  If you find yourself confused by concepts
+described here, like <em>read lock</em>, <em>write lock</em>,
+and <em>deadlock</em>, you might consult the literature on
+operating systems or databases.
+</p>
+<div id="IDX29"></div>
+<p>Any file in the repository with a name starting
+with &lsquo;<tt>#cvs.rfl.</tt>&rsquo; is a read lock.  Any file in
+the repository with a name starting with
+&lsquo;<tt>#cvs.wfl</tt>&rsquo; is a write lock.  Old versions of 
<small>CVS</small>
+(before <small>CVS</small> 1.5) also created files with names starting
+with &lsquo;<tt>#cvs.tfl</tt>&rsquo;, but they are not discussed here.
+The directory &lsquo;<tt>#cvs.lock</tt>&rsquo; serves as a master
+lock.  That is, one must obtain this lock first before
+creating any of the other locks.
+</p>
+<p>To obtain a readlock, first create the &lsquo;<tt>#cvs.lock</tt>&rsquo;
+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 &lsquo;<tt>#cvs.lock</tt>&rsquo; lock, create a file
+whose name is &lsquo;<tt>#cvs.rfl.</tt>&rsquo; followed by information
+of your choice (for example, hostname and process
+identification number).  Then remove the
+&lsquo;<tt>#cvs.lock</tt>&rsquo; directory to release the master lock.
+Then proceed with reading the repository.  When you are
+done, remove the &lsquo;<tt>#cvs.rfl</tt>&rsquo; file to release the
+read lock.
+</p>
+<p>To obtain a writelock, first create the
+&lsquo;<tt>#cvs.lock</tt>&rsquo; directory, as with a readlock.  Then
+check that there are no files whose names start with
+&lsquo;<tt>#cvs.rfl.</tt>&rsquo;.  If there are, remove
+&lsquo;<tt>#cvs.lock</tt>&rsquo;, wait for a while, and try again.  If
+there are no readers, then create a file whose name is
+&lsquo;<tt>#cvs.wfl</tt>&rsquo; followed by information of your choice
+(for example, hostname and process identification
+number).  Hang on to the &lsquo;<tt>#cvs.lock</tt>&rsquo; lock.  Proceed
+with writing the repository.  When you are done, first
+remove the &lsquo;<tt>#cvs.wfl</tt>&rsquo; file and then the
+&lsquo;<tt>#cvs.lock</tt>&rsquo; directory. Note that unlike the
+&lsquo;<tt>#cvs.rfl</tt>&rsquo; file, the &lsquo;<tt>#cvs.wfl</tt>&rsquo; file 
is just
+informational; it has no effect on the locking operation
+beyond what is provided by holding on to the
+&lsquo;<tt>#cvs.lock</tt>&rsquo; lock itself.
+</p>
+<p>Note that each lock (writelock or readlock) only locks
+a single directory in the repository, including
+&lsquo;<tt>Attic</tt>&rsquo; and &lsquo;<tt>CVS</tt>&rsquo; 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).
+</p>
+<p>Note also that <small>CVS</small> expects writelocks to control
+access to individual &lsquo;<tt>foo,v</tt>&rsquo; files.  <small>RCS</small> 
has
+a scheme where the &lsquo;<tt>,foo,</tt>&rsquo; file serves as a lock,
+but <small>CVS</small> does not implement it and so taking out a
+<small>CVS</small> writelock is recommended.  See the comments at
+rcs_internal_lockfile in the <small>CVS</small> source code for
+further discussion/rationale.
+</p>
+<hr size="6">
+<div id="CVSROOT-storage"></div>
+<div id="SEC18"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC17| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC19| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC11| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== How files are stored in the CVSROOT directory ====
+
+<p>The &lsquo;<tt>$CVSROOT/CVSROOT</tt>&rsquo; directory contains the
+various administrative files.  In some ways this
+directory is just like any other directory in the
+repository; it contains <small>RCS</small> files whose names end
+in &lsquo;<samp>,v</samp>&rsquo;, and many of the <small>CVS</small> commands 
operate
+on it the same way.  However, there are a few
+differences.
+</p>
+<p>For each administrative file, in addition to the
+<small>RCS</small> file, there is also a checked out copy of the
+file.  For example, there is an <small>RCS</small> file
+&lsquo;<tt>loginfo,v</tt>&rsquo; and a file &lsquo;<tt>loginfo</tt>&rsquo; 
which
+contains the latest revision contained in
+&lsquo;<tt>loginfo,v</tt>&rsquo;.  When you check in an administrative
+file, <small>CVS</small> should print
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs commit: 
Rebuilding administrative file database
+</nowiki></pre></td></tr></table>
+
+<p>and update the checked out copy in
+&lsquo;<tt>$CVSROOT/CVSROOT</tt>&rsquo;.  If it does not, there is
+something wrong (see section [[#SEC188|Dealing with bugs in CVS or this 
manual]]).  To add your own files
+to the files to be updated in this fashion, you can add
+them to the &lsquo;<tt>checkoutlist</tt>&rsquo; administrative file
+(see section [[#SEC177|The checkoutlist file]]).
+</p>
+<div id="IDX30"></div>
+<div id="IDX31"></div>
+<div id="IDX32"></div>
+<p>By default, the &lsquo;<tt>modules</tt>&rsquo; 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&rsquo;m not sure whether this is as much of a
+concern now as when <small>CVS</small> first evolved this
+feature; I haven&rsquo;t seen benchmarks).  Therefore, by
+making appropriate edits to the <small>CVS</small> source code
+one can store the modules file in a database which
+implements the <code>ndbm</code> interface, such as Berkeley
+db or GDBM.  If this option is in use, then the modules
+database will be stored in the files &lsquo;<tt>modules.db</tt>&rsquo;,
+&lsquo;<tt>modules.pag</tt>&rsquo;, and/or &lsquo;<tt>modules.dir</tt>&rsquo;.
+</p>
+<p>For information on the meaning of the various
+administrative files, see [[#SEC157|Reference manual for Administrative 
files]].
+</p>
+<hr size="6">
+<div id="Working-directory-storage"></div>
+<div id="SEC19"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC18| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC20| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC9| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== How data is stored in the working directory ===
+
+
+<p>While we are discussing <small>CVS</small> internals which may
+become visible from time to time, we might as well talk
+about what <small>CVS</small> puts in the &lsquo;<tt>CVS</tt>&rsquo; 
directories
+in the working directories.  As with the repository,
+<small>CVS</small> handles this information and one can usually
+access it via <small>CVS</small> commands.  But in some cases it
+may be useful to look at it, and other programs, such
+as the <code>jCVS</code> graphical user interface or the
+<code>VC</code> 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 <small>CVS</small> client.
+</p>
+<p>The &lsquo;<tt>CVS</tt>&rsquo; 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.
+</p>
+<p>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 <small>CVS</small> probably will not be portable between
+such systems either.
+</p>
+<dl compact="compact">
+<dt> &lsquo;<tt>Root</tt>&rsquo;</dt>
+<dd><p>This file contains the current <small>CVS</small> root, as
+described in [[#SEC10|Telling CVS where your repository is]].
+</p>
+<div id="IDX33"></div>
+<div id="IDX34"></div>
+</dd>
+<dt> &lsquo;<tt>Repository</tt>&rsquo;</dt>
+<dd><p>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;
+<small>CVS</small> 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
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs -d 
:local:/usr/local/cvsroot checkout yoyodyne/tc
+</nowiki></pre></td></tr></table>
+
+<p>&lsquo;<tt>Root</tt>&rsquo; will contain
+</p>
+<table><tr><td>&nbsp;</td><td><pre 
class="example"><nowiki>:local:/usr/local/cvsroot
+</nowiki></pre></td></tr></table>
+
+<p>and &lsquo;<tt>Repository</tt>&rsquo; will contain either
+</p>
+<table><tr><td>&nbsp;</td><td><pre 
class="example"><nowiki>/usr/local/cvsroot/yoyodyne/tc
+</nowiki></pre></td></tr></table>
+
+<p>or
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>yoyodyne/tc
+</nowiki></pre></td></tr></table>
+
+<p>If the particular working directory does not correspond
+to a directory in the repository, then &lsquo;<tt>Repository</tt>&rsquo;
+should contain &lsquo;<tt>CVSROOT/Emptydir</tt>&rsquo;.
+<div id="IDX35"></div>
+<div id="IDX36"></div>
+</p>
+<div id="IDX37"></div>
+<div id="IDX38"></div>
+</dd>
+<dt> &lsquo;<tt>Entries</tt>&rsquo;</dt>
+<dd><p>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.
+</p>
+<p>If the first character is &lsquo;<samp>/</samp>&rsquo;, then the format is:
+</p>
+<table><tr><td>&nbsp;</td><td><pre 
class="example"><nowiki>/<var>name</var>/<var>revision</var>/<var>timestamp</var>[+<var>conflict</var>]/<var>options</var>/<var>tagdate</var>
+</nowiki></pre></td></tr></table>
+
+<p>where &lsquo;<samp>[</samp>&rsquo; and &lsquo;<samp>]</samp>&rsquo; are not 
part of the entry,
+but instead indicate that the &lsquo;<samp>+</samp>&rsquo; and conflict
+marker are optional.  <var>name</var> is the name of the
+file within the directory.  <var>revision</var> is the
+revision that the file in the working derives from, or
+&lsquo;<samp>0</samp>&rsquo; for an added file, or 
&lsquo;<samp>-</samp>&rsquo; followed by a
+revision for a removed file.  <var>timestamp</var> is the
+timestamp of the file at the time that <small>CVS</small> 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, &lsquo;<samp>Sun Apr  7 01:29:26 1996</samp>&rsquo;).  One may
+write a string which is not in that format, for
+example, &lsquo;<samp>Result of merge</samp>&rsquo;, 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 <var>timestamp</var>.
+If there was a conflict, <var>conflict</var> can be set to
+the modification time of the file after the file has been
+written with conflict markers (see section [[#SEC86|Conflicts example]]).
+Thus if <var>conflict</var> is subsequently the same as the actual
+modification time of the file it means that the user
+has obviously not resolved the conflict.  <var>options</var>
+contains sticky options (for example &lsquo;<samp>-kb</samp>&rsquo; for a
+binary file).  <var>tagdate</var> contains &lsquo;<samp>T</samp>&rsquo; 
followed
+by a tag name, or &lsquo;<samp>D</samp>&rsquo; for a date, followed by a
+sticky tag or date.  Note that if <var>timestamp</var>
+contains a pair of timestamps separated by a space,
+rather than a single timestamp, you are dealing with a
+version of <small>CVS</small> earlier than <small>CVS</small> 1.5 (not
+documented here).
+</p>
+<p>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&rsquo;s timestamp is in universal
+time (UT), so the timestamp in CVS/Entries should be
+too.  On <small>VMS</small>, the file&rsquo;s timestamp is in local
+time, so <small>CVS</small> on <small>VMS</small> 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).
+</p>
+<p>If the first character of a line in &lsquo;<tt>Entries</tt>&rsquo; is
+&lsquo;<samp>D</samp>&rsquo;, then it indicates a subdirectory.  
&lsquo;<samp>D</samp>&rsquo;
+on a line all by itself indicates that the program
+which wrote the &lsquo;<tt>Entries</tt>&rsquo; file does record
+subdirectories (therefore, if there is such a line and
+no other lines beginning with &lsquo;<samp>D</samp>&rsquo;, one knows there
+are no subdirectories).  Otherwise, the line looks
+like:
+</p>
+<table><tr><td>&nbsp;</td><td><pre 
class="example"><nowiki>D/<var>name</var>/<var>filler1</var>/<var>filler2</var>/<var>filler3</var>/<var>filler4</var>
+</nowiki></pre></td></tr></table>
+
+<p>where <var>name</var> is the name of the subdirectory, and
+all the <var>filler</var> fields should be silently ignored,
+for future expansion.  Programs which modify
+<code>Entries</code> files should preserve these fields.
+</p>
+<p>The lines in the &lsquo;<tt>Entries</tt>&rsquo; file can be in any order.
+</p>
+<div id="IDX39"></div>
+<div id="IDX40"></div>
+</dd>
+<dt> &lsquo;<tt>Entries.Log</tt>&rsquo;</dt>
+<dd><p>This file does not record any information beyond that
+in &lsquo;<tt>Entries</tt>&rsquo;, but it does provide a way to update
+the information without having to rewrite the entire
+&lsquo;<tt>Entries</tt>&rsquo; file, including the ability to preserve
+the information even if the program writing
+&lsquo;<tt>Entries</tt>&rsquo; and &lsquo;<tt>Entries.Log</tt>&rsquo; abruptly 
aborts.
+Programs which are reading the &lsquo;<tt>Entries</tt>&rsquo; file
+should also check for &lsquo;<tt>Entries.Log</tt>&rsquo;.  If the latter
+exists, they should read &lsquo;<tt>Entries</tt>&rsquo; and then apply
+the changes mentioned in &lsquo;<tt>Entries.Log</tt>&rsquo;.  After
+applying the changes, the recommended practice is to
+rewrite &lsquo;<tt>Entries</tt>&rsquo; and then delete 
&lsquo;<tt>Entries.Log</tt>&rsquo;.
+The format of a line in &lsquo;<tt>Entries.Log</tt>&rsquo; is a single
+character command followed by a space followed by a
+line in the format specified for a line in
+&lsquo;<tt>Entries</tt>&rsquo;.  The single character command is
+&lsquo;<samp>A</samp>&rsquo; to indicate that the entry is being added,
+&lsquo;<samp>R</samp>&rsquo; to indicate that the entry is being removed,
+or any other character to indicate that the entire line
+in &lsquo;<tt>Entries.Log</tt>&rsquo; should be silently ignored (for
+future expansion).  If the second character of the line
+in &lsquo;<tt>Entries.Log</tt>&rsquo; is not a space, then it was
+written by an older version of <small>CVS</small> (not documented
+here).
+</p>
+<p>Programs which are writing rather than reading can
+safely ignore &lsquo;<tt>Entries.Log</tt>&rsquo; if they so choose.
+</p>
+<div id="IDX41"></div>
+<div id="IDX42"></div>
+</dd>
+<dt> &lsquo;<tt>Entries.Backup</tt>&rsquo;</dt>
+<dd><p>This is a temporary file.  Recommended usage is to
+write a new entries file to &lsquo;<tt>Entries.Backup</tt>&rsquo;, and
+then to rename it (atomically, where possible) to 
&lsquo;<tt>Entries</tt>&rsquo;.
+</p>
+<div id="IDX43"></div>
+<div id="IDX44"></div>
+</dd>
+<dt> &lsquo;<tt>Entries.Static</tt>&rsquo;</dt>
+<dd><p>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 <small>CVS</small> will
+not create additional files in that directory.  To
+clear it, use the <code>update</code> command with the
+&lsquo;<samp>-d</samp>&rsquo; option, which will get the additional files
+and remove &lsquo;<tt>Entries.Static</tt>&rsquo;.
+</p>
+<div id="IDX45"></div>
+<div id="IDX46"></div>
+<div id="IDX47"></div>
+<div id="IDX48"></div>
+</dd>
+<dt> &lsquo;<tt>Tag</tt>&rsquo;</dt>
+<dd><p>This file contains per-directory sticky tags or dates.
+The first character is &lsquo;<samp>T</samp>&rsquo; for a branch tag,
+&lsquo;<samp>N</samp>&rsquo; for a non-branch tag, or 
&lsquo;<samp>D</samp>&rsquo; 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 [[#SEC53|Sticky tags]].
+</p>
+<div id="IDX49"></div>
+<div id="IDX50"></div>
+</dd>
+<dt> &lsquo;<tt>Notify</tt>&rsquo;</dt>
+<dd><p>This file stores notifications (for example, for
+<code>edit</code> or <code>unedit</code>) which have not yet been
+sent to the server.  Its format is not yet documented
+here.
+</p>
+<div id="IDX51"></div>
+<div id="IDX52"></div>
+</dd>
+<dt> &lsquo;<tt>Notify.tmp</tt>&rsquo;</dt>
+<dd><p>This file is to &lsquo;<tt>Notify</tt>&rsquo; as 
&lsquo;<tt>Entries.Backup</tt>&rsquo;
+is to &lsquo;<tt>Entries</tt>&rsquo;.  That is, to write 
&lsquo;<tt>Notify</tt>&rsquo;,
+first write the new contents to &lsquo;<tt>Notify.tmp</tt>&rsquo; and
+then (atomically where possible), rename it to
+&lsquo;<tt>Notify</tt>&rsquo;.
+</p>
+<div id="IDX53"></div>
+<div id="IDX54"></div>
+</dd>
+<dt> &lsquo;<tt>Base</tt>&rsquo;</dt>
+<dd><p>If watches are in use, then an <code>edit</code> command
+stores the original copy of the file in the &lsquo;<tt>Base</tt>&rsquo;
+directory.  This allows the <code>unedit</code> command to
+operate even if it is unable to communicate with the
+server.
+</p>
+<div id="IDX55"></div>
+<div id="IDX56"></div>
+</dd>
+<dt> &lsquo;<tt>Baserev</tt>&rsquo;</dt>
+<dd><p>The file lists the revision for each of the files in
+the &lsquo;<tt>Base</tt>&rsquo; directory.  The format is:
+</p>
+<table><tr><td>&nbsp;</td><td><pre 
class="example"><nowiki>B<var>name</var>/<var>rev</var>/<var>expansion</var>
+</nowiki></pre></td></tr></table>
+
+<p>where <var>expansion</var> should be ignored, to allow for
+future expansion.
+</p>
+<div id="IDX57"></div>
+<div id="IDX58"></div>
+</dd>
+<dt> &lsquo;<tt>Baserev.tmp</tt>&rsquo;</dt>
+<dd><p>This file is to &lsquo;<tt>Baserev</tt>&rsquo; as 
&lsquo;<tt>Entries.Backup</tt>&rsquo;
+is to &lsquo;<tt>Entries</tt>&rsquo;.  That is, to write 
&lsquo;<tt>Baserev</tt>&rsquo;,
+first write the new contents to &lsquo;<tt>Baserev.tmp</tt>&rsquo; and
+then (atomically where possible), rename it to
+&lsquo;<tt>Baserev</tt>&rsquo;.
+</p>
+<div id="IDX59"></div>
+<div id="IDX60"></div>
+</dd>
+<dt> &lsquo;<tt>Template</tt>&rsquo;</dt>
+<dd><p>This file contains the template specified by the
+&lsquo;<tt>rcsinfo</tt>&rsquo; file (see section [[#SEC175|Rcsinfo]]).  It is 
only used
+by the client; the non-client/server <small>CVS</small> consults
+&lsquo;<tt>rcsinfo</tt>&rsquo; directly.
+</p></dd>
+</dl>
+
+<hr size="6">
+<div id="Intro-administrative-files"></div>
+<div id="SEC20"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC19| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC21| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC9| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== The administrative files ===
+
+
+<p>The directory &lsquo;<tt>$CVSROOT/CVSROOT</tt>&rsquo; contains some 
<em>administrative
+files</em>.  See section [[#SEC157|Reference manual for Administrative 
files]], for a complete description.
+You can use <small>CVS</small> without any of these files, but
+some commands work better when at least the
+&lsquo;<tt>modules</tt>&rsquo; file is properly set up.
+</p>
+<p>The most important of these files is the &lsquo;<tt>modules</tt>&rsquo;
+file.  It defines all modules in the repository.  This
+is a sample &lsquo;<tt>modules</tt>&rsquo; file.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>CVSROOT         
CVSROOT
+modules         CVSROOT modules
+cvs             gnu/cvs
+rcs             gnu/rcs
+diff            gnu/diff
+tc              yoyodyne/tc
+</nowiki></pre></td></tr></table>
+
+<p>The &lsquo;<tt>modules</tt>&rsquo; file is line oriented.  In its
+simplest form each line contains the name of the
+module, whitespace, and the directory where the module
+resides.  The directory is a path relative to
+<code>$CVSROOT</code>.  The last four lines in the example
+above are examples of such lines.
+</p>
+
+<p>The line that defines the module called &lsquo;<samp>modules</samp>&rsquo;
+uses features that are not explained here.
+See section [[#SEC158|The modules file]], for a full explanation of all the
+available features.
+</p>
+<hr size="6">
+<div id="SEC21"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC20| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC22| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC20| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Editing administrative files ====
+
+<p>You edit the administrative files in the same way that you would edit
+any other module.  Use &lsquo;<samp>cvs checkout CVSROOT</samp>&rsquo; to get 
a working
+copy, edit it, and commit your changes in the normal way.
+</p>
+<p>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.
+</p>
+<hr size="6">
+<div id="Multiple-repositories"></div>
+<div id="SEC22"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC21| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC23| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC9| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Multiple repositories ===
+
+<p>In some situations it is a good idea to have more than
+one repository, for instance if you have two
+development groups that work on separate projects
+without sharing any code.  All you have to do to have
+several repositories is to specify the appropriate
+repository, using the <code>CVSROOT</code> environment
+variable, the &lsquo;<samp>-d</samp>&rsquo; option to <small>CVS</small>, or 
(once
+you have checked out a working directory) by simply
+allowing <small>CVS</small> to use the repository that was used
+to check out the working directory
+(see section [[#SEC10|Telling CVS where your repository is]]).
+</p>
+<p>The big advantage of having multiple repositories is
+that they can reside on different servers.  With <small>CVS</small>
+version 1.10, a single command cannot recurse into
+directories from different repositories.  With development
+versions of <small>CVS</small>, you can check out code from multiple
+servers into your working directory.  <small>CVS</small> 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:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs -d server1:/cvs 
co dir1
+cd dir1
+cvs -d server2:/root co sdir
+cvs update
+</nowiki></pre></td></tr></table>
+
+<p>The <code>cvs co</code> commands set up the working
+directory, and then the <code>cvs update</code> command will
+contact server2, to update the dir1/sdir subdirectory,
+and server1, to update everything else.
+</p>
+
+<hr size="6">
+<div id="Creating-a-repository"></div>
+<div id="SEC23"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC22| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC24| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC9| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Creating a repository ===
+
+
+<p>To set up a <small>CVS</small> 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 [[#SEC27|Server requirements]].
+</p>
+<p>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 <small>CVS</small> for the
+repository (you will eventually outgrow this, but not
+for a while).  On the machines on which the developers
+will be working, you&rsquo;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).
+</p>
+<p>The repository should be accessible
+(directly or via a networked file system) from all
+machines which want to use <small>CVS</small> in server or local
+mode; the client machines need not have any access to
+it other than via the <small>CVS</small> protocol.  It is not
+possible to use <small>CVS</small> to read from a repository
+which one only has read access to; <small>CVS</small> needs to be
+able to create lock files (see section [[#SEC88|Several developers 
simultaneously attempting to run CVS]]).
+</p>
+<div id="IDX61"></div>
+<p>To create a repository, run the <code>cvs init</code>
+command.  It will set up an empty repository in the
+<small>CVS</small> root specified in the usual way
+(see section [[#SEC9|The Repository]]).  For example,
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs -d 
/usr/local/cvsroot init
+</nowiki></pre></td></tr></table>
+
+<p><code>cvs init</code> is careful to never overwrite any
+existing files in the repository, so no harm is done if
+you run <code>cvs init</code> on an already set-up
+repository.
+</p>
+<p><code>cvs init</code> will enable history logging; if you
+don&rsquo;t want that, remove the history file after running
+<code>cvs init</code>.  See section [[#SEC178|The history file]].
+</p>
+<hr size="6">
+<div id="Backing-up"></div>
+<div id="SEC24"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC23| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC25| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC9| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Backing up a repository ===
+
+<p>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.
+</p>
+<div id="IDX62"></div>
+<div id="IDX63"></div>
+<p>The first is that to be paranoid, one should either not
+use <small>CVS</small> during the backup, or have the backup
+program lock <small>CVS</small> while doing the backup.  To not
+use <small>CVS</small>, you might forbid logins to machines which
+can access the repository, turn off your <small>CVS</small>
+server, or similar mechanisms.  The details would
+depend on your operating system and how you have
+<small>CVS</small> set up.  To lock <small>CVS</small>, you would create
+&lsquo;<tt>#cvs.rfl</tt>&rsquo; locks in each repository directory.
+See [[#SEC88|Several developers simultaneously attempting to run CVS]], for 
more on <small>CVS</small> 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.
+</p>
+<p>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 <small>CVS</small>
+in such directories will typically produce an error
+message.  One way to get those changes back into the
+repository is as follows:
+</p>
+<ul>
+<li>
+Get a new working directory.
+
+</li><li>
+Copy the files from the working directory from before
+the failure over to the new working directory (do not
+copy the contents of the &lsquo;<tt>CVS</tt>&rsquo; directories, of
+course).
+
+</li><li>
+Working in the new working directory, use commands such
+as <code>cvs update</code> and <code>cvs diff</code> to figure out
+what has changed, and then when you are ready, commit
+the changes into the repository.
+</li></ul>
+
+<hr size="6">
+<div id="Moving-a-repository"></div>
+<div id="SEC25"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC24| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC26| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC9| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Moving a repository ===
+
+<p>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.
+</p>
+<p>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&rsquo;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&rsquo;t lose any
+changes.  If you really do want to reuse the existing
+working directory, it should be possible with manual
+surgery on the &lsquo;<tt>CVS/Repository</tt>&rsquo; files.  You can
+see [[#SEC19|How data is stored in the working directory]], for information on
+the &lsquo;<tt>CVS/Repository</tt>&rsquo; and &lsquo;<tt>CVS/Root</tt>&rsquo; 
files, but
+unless you are sure you want to bother, it probably
+isn&rsquo;t worth it.
+</p>
+<hr size="6">
+<div id="Remote-repositories"></div>
+<div id="SEC26"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC25| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC27| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC9| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Remote repositories ===
+
+<p>        Your working copy of the sources can be on a
+different machine than the repository.  Using <small>CVS</small>
+in this manner is known as <em>client/server</em>
+operation.  You run <small>CVS</small> on a machine which can
+mount your working directory, known as the
+<em>client</em>, and tell it to communicate to a machine
+which can mount the repository, known as the
+<em>server</em>.  Generally, using a remote
+repository is just like using a local one, except that
+the format of the repository name is:
+</p>
+<table><tr><td>&nbsp;</td><td><pre 
class="example"><nowiki>[:<var>method</var>:][[<var>user</var>][:<var>password</var>address@hidden<var>hostname</var>[:[<var>port</var>]]/path/to/repository
+</nowiki></pre></td></tr></table>
+
+<p>Specifying a password in the repository name is not recommended during
+checkout, since this will cause <small>CVS</small> to store a cleartext copy 
of the
+password in each created directory.  <code>cvs login</code> first instead
+(see section [[#SEC31|Using the client with password authentication]]).
+</p>
+<p>The details of exactly what needs to be set up depend
+on how you are connecting to the server.
+</p>
+<p>If <var>method</var> is not specified, and the repository
+name contains &lsquo;<samp>:</samp>&rsquo;, then the default is 
<code>ext</code>
+or <code>server</code>, depending on your platform; both are
+described in [[#SEC28|Connecting with rsh]].
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC27| Server 
requirements]]::<nowiki>         Memory and other resources for servers
+</nowiki>&bull;[[#SEC28| Connecting via rsh]]::<nowiki>          Using the 
<code>rsh</code> program to connect
+</nowiki>&bull;[[#SEC29| Password authenticated]]::<nowiki>      Direct 
connections using passwords
+</nowiki>&bull;[[#SEC33| GSSAPI authenticated]]::<nowiki>        Direct 
connections using GSSAPI
+</nowiki>&bull;[[#SEC34| Kerberos authenticated]]::<nowiki>      Direct 
connections with kerberos
+</nowiki>&bull;[[#SEC35| Connecting via fork]]::<nowiki>         Using a 
forked <code>cvs server</code> to connect
+</nowiki></pre>
+<hr size="6">
+<div id="Server-requirements"></div>
+<div id="SEC27"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC26| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC28| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC26| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Server requirements ====
+
+<p>The quick answer to what sort of machine is suitable as
+a server is that requirements are modest&mdash;a server
+with 32M of memory or even less can handle a fairly
+large source tree with a fair amount of activity.
+</p>
+<p>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
+[[#SEC188|Dealing with bugs in CVS or this manual]], so we can update this 
documentation).
+</p>
+<p>The first area of big memory consumption is large
+checkouts, when using the <small>CVS</small> 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.
+</p>
+<p>Multiplying the size of each <small>CVS</small> 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.
+</p>
+
+<p>The second area of large memory consumption is
+<code>diff</code>, 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
+<small>CVS</small> 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.
+</p>
+<p>Resource consumption for the client is even more
+modest&mdash;any machine with enough capacity to run the
+operating system in question should have little
+trouble.
+</p>
+<p>For information on disk space requirements, see
+[[#SEC23|Creating a repository]].
+</p>
+<hr size="6">
+<div id="Connecting-via-rsh"></div>
+<div id="SEC28"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC27| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC29| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC26| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Connecting with rsh ====
+
+<p><small>CVS</small> uses the &lsquo;<samp>rsh</samp>&rsquo; protocol to 
perform these
+operations, so the remote user host needs to have a
+&lsquo;<tt>.rhosts</tt>&rsquo; file which grants access to the local
+user. Note that the program that <small>CVS</small> uses for this
+purpose may be specified using the &lsquo;<tt>--with-rsh</tt>&rsquo;
+flag to configure.
+</p>
+<p>For example, suppose you are the user &lsquo;<samp>mozart</samp>&rsquo; on
+the local machine &lsquo;<samp>toe.example.com</samp>&rsquo;, and the
+server machine is &lsquo;<samp>faun.example.org</samp>&rsquo;.  On
+faun, put the following line into the file
+&lsquo;<tt>.rhosts</tt>&rsquo; in &lsquo;<samp>bach</samp>&rsquo;&rsquo;s home 
directory:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>toe.example.com  
mozart
+</nowiki></pre></td></tr></table>
+
+<p>Then test that &lsquo;<samp>rsh</samp>&rsquo; is working with
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>rsh -l bach 
faun.example.org 'echo $PATH'
+</nowiki></pre></td></tr></table>
+
+<div id="IDX64"></div>
+<p>Next you have to make sure that <code>rsh</code> will be able
+to find the server.  Make sure that the path which
+<code>rsh</code> printed in the above example includes the
+directory containing a program named <code>cvs</code> which
+is the server.  You need to set the path in
+&lsquo;<tt>.bashrc</tt>&rsquo;, &lsquo;<tt>.cshrc</tt>&rsquo;, etc., not 
&lsquo;<tt>.login</tt>&rsquo;
+or &lsquo;<tt>.profile</tt>&rsquo;.  Alternately, you can set the
+environment variable <code>CVS_SERVER</code> on the client
+machine to the filename of the server you want to use,
+for example &lsquo;<tt>/usr/local/bin/cvs-1.6</tt>&rsquo;.
+</p>
+<p>There is no need to edit &lsquo;<tt>inetd.conf</tt>&rsquo; or start a
+<small>CVS</small> server daemon.
+</p>
+<div id="IDX65"></div>
+<div id="IDX66"></div>
+<div id="IDX67"></div>
+<div id="IDX68"></div>
+<div id="IDX69"></div>
+<p>There are two access methods that you use in <code>CVSROOT</code>
+for rsh.  <code>:server:</code> specifies an internal rsh
+client, which is supported only by some <small>CVS</small> ports.
+<code>:ext:</code> specifies an external rsh program.  By
+default this is <code>rsh</code> (unless otherwise specified
+by the &lsquo;<tt>--with-rsh</tt>&rsquo; flag to configure) but you may set the
+<code>CVS_RSH</code> environment variable to invoke another
+program which can access the remote server (for
+example, <code>remsh</code> on HP-UX 9 because <code>rsh</code> 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 <code>rsh</code> is not
+suitable since it by default translates between CRLF
+and LF.  The OS/2 <small>CVS</small> port has a hack to pass 
&lsquo;<samp>-b</samp>&rsquo;
+to <code>rsh</code> to get around this, but since this could
+potentially cause problems for programs other than the
+standard <code>rsh</code>, it may change in the future.  If
+you set <code>CVS_RSH</code> to <code>SSH</code> or some other rsh
+replacement, the instructions in the rest of this
+section concerning &lsquo;<tt>.rhosts</tt>&rsquo; and so on are likely
+to be inapplicable; consult the documentation for your rsh
+replacement.
+</p>
+<p>Continuing our example, supposing you want to access
+the module &lsquo;<tt>foo</tt>&rsquo; in the repository
+&lsquo;<tt>/usr/local/cvsroot/</tt>&rsquo;, on machine
+&lsquo;<tt>faun.example.org</tt>&rsquo;, you are ready to go:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs -d 
:ext:address@hidden:/usr/local/cvsroot checkout foo
+</nowiki></pre></td></tr></table>
+
+<p>(The &lsquo;<tt>bach@</tt>&rsquo; can be omitted if the username is
+the same on both the local and remote hosts.)
+</p>
+
+<hr size="6">
+<div id="Password-authenticated"></div>
+<div id="SEC29"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC28| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC30| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC26| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Direct connection with password authentication ====
+
+<p>The <small>CVS</small> client can also connect to the server
+using a password protocol.  This is particularly useful
+if using <code>rsh</code> is not feasible (for example,
+the server is behind a firewall), and Kerberos also is
+not available.
+</p>
+<p>        To use this method, it is necessary to make
+some adjustments on both the server and client sides.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC30| Password 
authentication server]]::<nowiki>     Setting up the server
+</nowiki>&bull;[[#SEC31| Password authentication client]]::<nowiki>     Using 
the client
+</nowiki>&bull;[[#SEC32| Password authentication security]]::<nowiki>   What 
this method does and does not do
+</nowiki></pre>
+<hr size="6">
+<div id="Password-authentication-server"></div>
+<div id="SEC30"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC29| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC31| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC29| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+===== Setting up the server for password authentication =====
+
+<p>First of all, you probably want to tighten the
+permissions on the &lsquo;<tt>$CVSROOT</tt>&rsquo; and
+&lsquo;<tt>$CVSROOT/CVSROOT</tt>&rsquo; directories.  See [[#SEC32|Security 
considerations with password authentication]], for more details.
+</p>
+<div id="IDX70"></div>
+<div id="IDX71"></div>
+<div id="IDX72"></div>
+<div id="IDX73"></div>
+<div id="IDX74"></div>
+<div id="IDX75"></div>
+<div id="IDX76"></div>
+<div id="IDX77"></div>
+<div id="IDX78"></div>
+<div id="IDX79"></div>
+<div id="IDX80"></div>
+<div id="IDX81"></div>
+<p>On the server side, the file &lsquo;<tt>/etc/inetd.conf</tt>&rsquo;
+needs to be edited so <code>inetd</code> knows to run the
+command <code>cvs pserver</code> when it receives a
+connection on the right port.  By default, the port
+number is 2401; it would be different if your client
+were compiled with <code>CVS_AUTH_PORT</code> defined to
+something else, though.  This can also be specified in the CVSROOT variable
+(see section [[#SEC26|Remote repositories]]) or overridden with the 
CVS_CLIENT_PORT
+environment variable (see section [[#SEC181|All environment variables which 
affect CVS]]).
+</p>
+<p>        If your <code>inetd</code> allows raw port numbers in
+&lsquo;<tt>/etc/inetd.conf</tt>&rsquo;, then the following (all on a
+single line in &lsquo;<tt>inetd.conf</tt>&rsquo;) should be sufficient:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>2401  stream  tcp  
nowait  root  /usr/local/bin/cvs
+cvs -f --allow-root=/usr/cvsroot pserver
+</nowiki></pre></td></tr></table>
+
+<p>(You could also use the
+&lsquo;<samp>-T</samp>&rsquo; option to specify a temporary directory.)
+</p>
+<p>The &lsquo;<samp>--allow-root</samp>&rsquo; option specifies the allowable
+<small>CVSROOT</small> directory.  Clients which attempt to use a
+different <small>CVSROOT</small> directory will not be allowed to
+connect.  If there is more than one <small>CVSROOT</small>
+directory which you want to allow, repeat the option.
+(Unfortunately, many versions of <code>inetd</code> 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 <code>inetd</code> run a shell script which then invokes
+<small>CVS</small> with the necessary arguments.)
+</p>
+<p>        If your <code>inetd</code> wants a symbolic service
+name instead of a raw port number, then put this in
+&lsquo;<tt>/etc/services</tt>&rsquo;:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvspserver      
2401/tcp
+</nowiki></pre></td></tr></table>
+
+<p>and put <code>cvspserver</code> instead of <code>2401</code> in 
&lsquo;<tt>inetd.conf</tt>&rsquo;.
+</p>
+<p>If your system uses <code>xinetd</code> instead of <code>inetd</code>,
+the procedure is slightly different.
+Create a file called &lsquo;<tt>/etc/xinetd.d/cvspserver</tt>&rsquo; 
containing the following:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>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
+}
+</nowiki></pre></td></tr></table>
+
+<p>(If <code>cvspserver</code> is defined in 
&lsquo;<tt>/etc/services</tt>&rsquo;, you can omit
+the <code>port</code> line.)
+</p>
+<p>        Once the above is taken care of, restart your
+<code>inetd</code>, or do whatever is necessary to force it
+to reread its initialization files.
+</p>
+<p>If you are having trouble setting this up, see
+[[#SEC185|Trouble making a connection to a CVS server]].
+</p>
+<div id="IDX82"></div>
+<div id="IDX83"></div>
+<p>Because the client stores and transmits passwords in
+cleartext (almost&mdash;see [[#SEC32|Security considerations with password 
authentication]], for details), a separate <small>CVS</small> password
+file is generally used, so people don&rsquo;t compromise
+their regular passwords when they access the
+repository.  This file is
+&lsquo;<tt>$CVSROOT/CVSROOT/passwd</tt>&rsquo; (see section [[#SEC20|The 
administrative files]]).  It uses a colon-separated
+format, similar to &lsquo;<tt>/etc/passwd</tt>&rsquo; on Unix systems,
+except that it has fewer fields: <small>CVS</small> username,
+optional password, and an optional system username for
+<small>CVS</small> to run as if authentication succeeds.  Here is
+an example &lsquo;<tt>passwd</tt>&rsquo; file with five entries:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>anonymous:
+bach:ULtgRLXo7NRxs
+spwang:1sOp854gDF3DY
+melissa:tGX1fS8sun6rY:pubcvs
+qproj:XR4EZcEs0szik:pubcvs
+</nowiki></pre></td></tr></table>
+
+<p>(The passwords are encrypted according to the standard
+Unix <code>crypt()</code> function, so it is possible to
+paste in passwords directly from regular Unix
+&lsquo;<tt>/etc/passwd</tt>&rsquo; files.)
+</p>
+<p>The first line in the example will grant access to any
+<small>CVS</small> client attempting to authenticate as user
+<code>anonymous</code>, 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 &quot;read-only&quot; part, see
+[[#SEC36|Read-only repository access]].)
+</p>
+<p>The second and third lines will grant access to
+<code>bach</code> and <code>spwang</code> if they supply their
+respective plaintext passwords.
+</p>
+<div id="IDX84"></div>
+<p>The fourth line will grant access to <code>melissa</code>, if
+she supplies the correct password, but her <small>CVS</small>
+operations will actually run on the server side under
+the system user <code>pubcvs</code>.  Thus, there need not be
+any system user named <code>melissa</code>, but there
+<em>must</em> be one named <code>pubcvs</code>.
+</p>
+<p>The fifth line shows that system user identities can be
+shared: any client who successfully authenticates as
+<code>qproj</code> will actually run as <code>pubcvs</code>, just
+as <code>melissa</code> 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 &lsquo;<tt>$CVSROOT/CVSROOT/passwd</tt>&rsquo; file.  The 
<small>CVS</small>
+username on each line would be different, but the
+system username would be the same.  The reason to have
+different <small>CVS</small> usernames is that <small>CVS</small> will log 
their
+actions under those names: when <code>melissa</code> commits
+a change to a project, the checkin is recorded in the
+project&rsquo;s history under the name <code>melissa</code>, not
+<code>pubcvs</code>.  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.
+</p>
+<p>If the system-user field is present, all
+password-authenticated <small>CVS</small> commands run as that
+user; if no system user is specified, <small>CVS</small> simply
+takes the <small>CVS</small> 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 <small>CVS</small>
+operation will fail (regardless of whether the client
+supplied a valid password).
+</p>
+<p>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 &lsquo;<tt>$CVSROOT/CVSROOT/passwd</tt>&rsquo; file:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>anonymous::pubcvs
+fish:rKa5jzULzmhOo:kfogel
+sussman:1sOp854gDF3DY
+</nowiki></pre></td></tr></table>
+
+<p>When the password field is omitted or empty, then the
+client&rsquo;s authentication attempt will succeed with any
+password, including the empty string.  However, the
+colon after the <small>CVS</small> username is always necessary,
+even if the password is empty.
+</p>
+<p><small>CVS</small> can also fall back to use system authentication.
+When authenticating a password, the server first checks
+for the user in the &lsquo;<tt>$CVSROOT/CVSROOT/passwd</tt>&rsquo;
+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 <small>CVS</small> &lsquo;<tt>passwd</tt>&rsquo; file
+does not exist, then the server can try to authenticate
+the username and password using the operating system&rsquo;s
+user-lookup routines (this &quot;fallback&quot; behavior can be
+disabled by setting <code>SystemAuth=no</code> in the
+<small>CVS</small> &lsquo;<tt>config</tt>&rsquo; file, see section 
[[#SEC180|The CVSROOT/config configuration file]]).
+</p>
+<p>The default fallback behaviour is to look in 
+&lsquo;<tt>/etc/passwd</tt>&rsquo; for this system password unless your
+system has PAM (Pluggable Authentication Modules)
+and your <small>CVS</small> server executable was configured to
+use it at compile time (using <code>./configure --enable-pam</code> - see the
+INSTALL file for more).  In this case, PAM will be consulted instead.
+This means that <small>CVS</small> 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 &lsquo;<tt>/etc/pam.conf</tt>&rsquo;
+or possibly &lsquo;<tt>/etc/pam.d/cvs</tt>&rsquo;).  See your PAM documentation
+for more details on PAM configuration.
+</p>
+<p>Note that PAM is an experimental feature in <small>CVS</small> and feedback 
is
+encouraged.  Please send a mail to one of the <small>CVS</small> mailing lists
+(<code>address@hidden</code> or <code>address@hidden</code>) if you use the 
+<small>CVS</small> PAM support.
+</p>
+<p><strong>WARNING: Using PAM gives the system administrator much more 
+flexibility about how <small>CVS</small> users are authenticated but 
+no more security than other methods.  See below for more.</strong> 
+</p>
+<p>CVS needs an &quot;auth&quot; and &quot;account&quot; module in the 
+PAM configuration file. A typical PAM configuration 
+would therefore have the following lines 
+in &lsquo;<tt>/etc/pam.conf</tt>&rsquo; to emulate the standard 
<small>CVS</small> 
+system &lsquo;<tt>/etc/passwd</tt>&rsquo; authentication:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs auth        
required    pam_unix.so
+cvs    account     required    pam_unix.so
+</nowiki></pre></td></tr></table>
+
+<p>The the equivalent &lsquo;<tt>/etc/pam.d/cvs</tt>&rsquo; would contain
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>auth            
required    pam_unix.so
+account            required    pam_unix.so
+</nowiki></pre></td></tr></table>
+
+<p>Some systems require a full path to the module so that
+&lsquo;<tt>pam_unix.so</tt>&rsquo; (Linux) would become something like 
+&lsquo;<tt>/usr/lib/security/$ISA/pam_unix.so.1</tt>&rsquo; (Sun Solaris).
+See the &lsquo;<tt>contrib/pam</tt>&rsquo; subdirectory of the 
<small>CVS</small>
+source distribution for further example configurations.
+</p>
+<p>The PAM service name given above as &quot;cvs&quot; is just
+the service name in the default configuration amd can be
+set using
+<code>./configure 
--with-hardcoded-pam-service-name=&lt;pam-service-name&gt;</code>
+before compiling.  <small>CVS</small> can also be configured to use whatever
+name it is invoked as as its PAM service name using
+<code>./configure --without-hardcoded-pam-service-name</code>, but this
+feature should not be used if you may not have control of the name
+<small>CVS</small> will be invoked as.
+</p>
+<p>Be aware, also, that falling back to system
+authentication might be a security risk: <small>CVS</small>
+operations would then be authenticated with that user&rsquo;s
+regular login password, and the password flies across
+the network in plaintext.  See [[#SEC32|Security considerations with password 
authentication]] 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.
+</p>
+<p>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.
+</p>
+<p>In the non-PAM configuration where the password is stored in the
+&lsquo;<tt>CVSROOT/passwd</tt>&rsquo; 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.
+</p>
+<p>Note that PAM administrators should probably avoid configuring
+one-time-passwords (OTP) for <small>CVS</small> 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
+see section [[#SEC26|Remote repositories]] for a list of other methods.
+</p>
+<p>Right now, the only way to put a password in the
+<small>CVS</small> &lsquo;<tt>passwd</tt>&rsquo; file is to paste it there from
+somewhere else.  Someday, there may be a <code>cvs
+passwd</code> command.
+</p>
+<p>Unlike many of the files in &lsquo;<tt>$CVSROOT/CVSROOT</tt>&rsquo;, it
+is normal to edit the &lsquo;<tt>passwd</tt>&rsquo; file in-place,
+rather than via <small>CVS</small>.  This is because of the
+possible security risks of having the &lsquo;<tt>passwd</tt>&rsquo;
+file checked out to people&rsquo;s working copies.  If you do
+want to include the &lsquo;<tt>passwd</tt>&rsquo; file in checkouts of
+&lsquo;<tt>$CVSROOT/CVSROOT</tt>&rsquo;, see [[#SEC177|The checkoutlist file]].
+</p>
+
+<hr size="6">
+<div id="Password-authentication-client"></div>
+<div id="SEC31"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC30| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC32| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC29| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+===== Using the client with password authentication =====
+<p>To run a <small>CVS</small> command on a remote repository via
+the password-authenticating server, one specifies the
+<code>pserver</code> protocol, optional username, repository host, an
+optional port number, and path to the repository.  For example:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs -d 
:pserver:faun.example.org:/usr/local/cvsroot checkout someproj
+</nowiki></pre></td></tr></table>
+
+<p>or
+</p>
+<table><tr><td>&nbsp;</td><td><pre 
class="example"><nowiki>CVSROOT=:pserver:address@hidden:2401/usr/local/cvsroot
+cvs checkout someproj
+</nowiki></pre></td></tr></table>
+
+<p>However, unless you&rsquo;re connecting to a public-access
+repository (i.e., one where that username doesn&rsquo;t
+require a password), you&rsquo;ll need to supply a password or <em>log in</em> 
first.
+Logging in verifies your password with the repository and stores it in a file.
+It&rsquo;s done with the <code>login</code> command, which will
+prompt you interactively for the password if you didn&rsquo;t supply one as 
part of
+<var>$CVSROOT</var>:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs -d 
:pserver:address@hidden:/usr/local/cvsroot login
+CVS password:
+</nowiki></pre></td></tr></table>
+
+<p>or
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs -d 
:pserver:bach:address@hidden:/usr/local/cvsroot login
+</nowiki></pre></td></tr></table>
+
+<p>After you enter the password, <small>CVS</small> 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&rsquo;t require you to run <code>cvs
+login</code>.  (If verification fails, <small>CVS</small> will exit
+complaining that the password was incorrect, and
+nothing will be recorded.)
+</p>
+<p>The records are stored, by default, in the file
+&lsquo;<tt>$HOME/.cvspass</tt>&rsquo;.  That file&rsquo;s format is
+human-readable, and to a degree human-editable, but
+note that the passwords are not stored in
+cleartext&mdash;they are trivially encoded to protect them
+from &quot;innocent&quot; compromise (i.e., inadvertent viewing
+by a system administrator or other non-malicious
+person).
+</p>
+<div id="IDX85"></div>
+<p>You can change the default location of this file by
+setting the <code>CVS_PASSFILE</code> environment variable.
+If you use this variable, make sure you set it
+<em>before</em> <code>cvs login</code> is run.  If you were to
+set it after running <code>cvs login</code>, then later
+<small>CVS</small> commands would be unable to look up the
+password for transmission to the server.
+</p>  
+<p>Once you have logged in, all <small>CVS</small> commands using
+that remote repository and username will authenticate
+with the stored password.  So, for example
+</p>  
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs -d 
:pserver:address@hidden:/usr/local/cvsroot checkout foo
+</nowiki></pre></td></tr></table>
+
+<p>should just work (unless the password changes on the
+server side, in which case you&rsquo;ll have to re-run
+<code>cvs login</code>).
+</p>
+<p>Note that if the &lsquo;<samp>:pserver:</samp>&rsquo; were not present in
+the repository specification, <small>CVS</small> would assume it
+should use <code>rsh</code> to connect with the server
+instead (see section [[#SEC28|Connecting with rsh]]).
+</p>
+<p>Of course, once you have a working copy checked out and
+are running <small>CVS</small> commands from within it, there is
+no longer any need to specify the repository
+explicitly, because <small>CVS</small> can deduce the repository
+from the working copy&rsquo;s &lsquo;<tt>CVS</tt>&rsquo; subdirectory.
+</p>
+<div id="IDX86"></div>
+<p>The password for a given remote repository can be
+removed from the <code>CVS_PASSFILE</code> by using the
+<code>cvs logout</code> command.
+</p>
+<hr size="6">
+<div id="Password-authentication-security"></div>
+<div id="SEC32"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC31| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC33| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC29| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+===== Security considerations with password authentication =====
+
+<p>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.
+</p>
+<p>The separate <small>CVS</small> password file (see section [[#SEC30|Setting 
up the server for password authentication]]) 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 <small>CVS</small> to prevent that,
+but no one has done so as of this writing.
+</p>
+<p>Note that because the &lsquo;<tt>$CVSROOT/CVSROOT</tt>&rsquo; directory
+contains &lsquo;<tt>passwd</tt>&rsquo; and other files which are used
+to check security, you must control the permissions on
+this directory as tightly as the permissions on
+&lsquo;<tt>/etc</tt>&rsquo;.  The same applies to the 
&lsquo;<tt>$CVSROOT</tt>&rsquo;
+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.
+</p>
+<p>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.
+</p>
+<hr size="6">
+<div id="GSSAPI-authenticated"></div>
+<div id="SEC33"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC32| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC34| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC26| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Direct connection with GSSAPI ====
+
+<p>GSSAPI is a generic interface to network security
+systems such as Kerberos 5.
+If you have a working GSSAPI library, you can have
+<small>CVS</small> connect via a direct <small>TCP</small> connection,
+authenticating with GSSAPI.
+</p>
+<p>To do this, <small>CVS</small> needs to be compiled with GSSAPI
+support; when configuring <small>CVS</small> it tries to detect
+whether GSSAPI libraries using kerberos version 5 are
+present.  You can also use the &lsquo;<tt>--with-gssapi</tt>&rsquo;
+flag to configure.
+</p>
+<p>The connection is authenticated using GSSAPI, but the
+message stream is <em>not</em> authenticated by default.
+You must use the <code>-a</code> global option to request
+stream authentication.
+</p>
+<p>The data transmitted is <em>not</em> encrypted by
+default.  Encryption support must be compiled into both
+the client and the server; use the
+&lsquo;<tt>--enable-encrypt</tt>&rsquo; configure option to turn it on.
+You must then use the <code>-x</code> global option to
+request encryption.
+</p>
+<p>GSSAPI connections are handled on the server side by
+the same server which handles the password
+authentication server; see [[#SEC30|Setting up the server for password 
authentication]].  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 &lsquo;<tt>CVSROOT/passwd</tt>&rsquo; password file, and set
+<code>SystemAuth=no</code> in the config file
+(see section [[#SEC180|The CVSROOT/config configuration file]]).
+</p>
+<p>The GSSAPI server uses a principal name of
+cvs/<var>hostname</var>, where <var>hostname</var> is the
+canonical name of the server host.  You will have to
+set this up as required by your GSSAPI mechanism.
+</p>
+<p>To connect using GSSAPI, use &lsquo;<samp>:gserver:</samp>&rsquo;.  For
+example,
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs -d 
:gserver:faun.example.org:/usr/local/cvsroot checkout foo
+</nowiki></pre></td></tr></table>
+
+<hr size="6">
+<div id="Kerberos-authenticated"></div>
+<div id="SEC34"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC33| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC35| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC26| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Direct connection with kerberos ====
+
+<p>The easiest way to use kerberos is to use the kerberos
+<code>rsh</code>, as described in [[#SEC28|Connecting with 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 <small>TCP</small> connection,
+authenticating with kerberos.
+</p>
+<p>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.
+</p>
+<p>To do this, <small>CVS</small> needs to be compiled with kerberos
+support; when configuring <small>CVS</small> it tries to detect
+whether kerberos is present or you can use the
+&lsquo;<tt>--with-krb4</tt>&rsquo; flag to configure.
+</p>
+<p>The data transmitted is <em>not</em> encrypted by
+default.  Encryption support must be compiled into both
+the client and server; use the
+&lsquo;<tt>--enable-encryption</tt>&rsquo; configure option to turn it
+on.  You must then use the <code>-x</code> global option to
+request encryption.
+</p>
+<div id="IDX87"></div>
+<p>You need to edit &lsquo;<tt>inetd.conf</tt>&rsquo; on the server
+machine to run <code>cvs kserver</code>.  The client uses
+port 1999 by default; if you want to use another port
+specify it in the <code>CVSROOT</code> (see section [[#SEC26|Remote 
repositories]])
+or the <code>CVS_CLIENT_PORT</code> environment variable
+(see section [[#SEC181|All environment variables which affect CVS]]) on the 
client.
+</p>
+<div id="IDX88"></div>
+<p>When you want to use <small>CVS</small>, get a ticket in the
+usual way (generally <code>kinit</code>); it must be a ticket
+which allows you to log into the server machine.  Then
+you are ready to go:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs -d 
:kserver:faun.example.org:/usr/local/cvsroot checkout foo
+</nowiki></pre></td></tr></table>
+
+<p>Previous versions of <small>CVS</small> would fall back to a
+connection via rsh; this version will not do so.
+</p>
+<hr size="6">
+<div id="Connecting-via-fork"></div>
+<div id="SEC35"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC34| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC36| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC26| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Connecting with fork ====
+
+<p>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
+<code>:local:</code>, but various quirks, bugs and the like are
+those of the remote <small>CVS</small> rather than the local
+<small>CVS</small>.
+</p>
+<p>For day-to-day operations you might prefer either
+<code>:local:</code> or <code>:fork:</code>, depending on your
+preferences.  Of course <code>:fork:</code> comes in
+particularly handy in testing or
+debugging <code>cvs</code> 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.
+</p>
+<p>To connect using the <code>fork</code> method, use
+&lsquo;<samp>:fork:</samp>&rsquo; and the pathname to your local
+repository.  For example:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs -d 
:fork:/usr/local/cvsroot checkout foo
+</nowiki></pre></td></tr></table>
+
+<div id="IDX89"></div>
+<p>As with <code>:ext:</code>, the server is called 
&lsquo;<samp>cvs</samp>&rsquo;
+by default, or the value of the <code>CVS_SERVER</code>
+environment variable.
+</p>
+<hr size="6">
+<div id="Read_002donly-access"></div>
+<div id="SEC36"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC35| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC37| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC9| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Read-only repository access ===
+
+<p>        It is possible to grant read-only repository
+access to people using the password-authenticated
+server (see section [[#SEC29|Direct connection with password 
authentication]]).  (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.)
+</p>
+<p>        A user who has read-only access can do only
+those <small>CVS</small> operations which do not modify the
+repository, except for certain &ldquo;administrative&rdquo; files
+(such as lock files and the history file).  It may be
+desirable to use this feature in conjunction with
+user-aliasing (see section [[#SEC30|Setting up the server for password 
authentication]]).
+</p>
+<p>Unlike with previous versions of <small>CVS</small>, 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 <em>known</em> 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.
+</p>
+<p>        There are two ways to specify read-only access
+for a user: by inclusion, and by exclusion.
+</p>
+<p>        &quot;Inclusion&quot; means listing that user
+specifically in the &lsquo;<tt>$CVSROOT/CVSROOT/readers</tt>&rsquo;
+file, which is simply a newline-separated list of
+users.  Here is a sample &lsquo;<tt>readers</tt>&rsquo; file:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>melissa
+splotnik
+jrandom
+</nowiki></pre></td></tr></table>
+
+<p>        (Don&rsquo;t forget the newline after the last user.)
+</p>
+<p>        &quot;Exclusion&quot; means explicitly listing everyone
+who has <em>write</em> access&mdash;if the file
+</p>
+<table><tr><td>&nbsp;</td><td><pre 
class="example"><nowiki>$CVSROOT/CVSROOT/writers
+</nowiki></pre></td></tr></table>
+
+<p>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
+<small>CVS</small> &lsquo;<tt>passwd</tt>&rsquo; file).  The
+&lsquo;<tt>writers</tt>&rsquo; file has the same format as the
+&lsquo;<tt>readers</tt>&rsquo; file.
+</p>
+<p>        Note: if your <small>CVS</small> &lsquo;<tt>passwd</tt>&rsquo;
+file maps cvs users onto system users (see section [[#SEC30|Setting up the 
server for password authentication]]), make sure you deny or grant
+read-only access using the <em>cvs</em> usernames, not
+the system usernames.  That is, the &lsquo;<tt>readers</tt>&rsquo; and
+&lsquo;<tt>writers</tt>&rsquo; files contain cvs usernames, which may
+or may not be the same as system usernames.
+</p>
+<p>        Here is a complete description of the server&rsquo;s
+behavior in deciding whether to grant read-only or
+read-write access:
+</p>
+<p>        If &lsquo;<tt>readers</tt>&rsquo; exists, and this user is
+listed in it, then she gets read-only access.  Or if
+&lsquo;<tt>writers</tt>&rsquo; exists, and this user is NOT listed in
+it, then she also gets read-only access (this is true
+even if &lsquo;<tt>readers</tt>&rsquo; exists but she is not listed
+there).  Otherwise, she gets full read-write access.
+</p>
+<p>        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.
+</p>
+<hr size="6">
+<div id="Server-temporary-directory"></div>
+<div id="SEC37"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC36| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC9| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Temporary directories for the server ===
+
+<p>While running, the <small>CVS</small> server creates temporary
+directories.  They are named
+</p>
+<table><tr><td>&nbsp;</td><td><pre 
class="example"><nowiki>cvs-serv<var>pid</var>
+</nowiki></pre></td></tr></table>
+
+<p>where <var>pid</var> is the process identification number of
+the server.
+They are located in the directory specified by 
+the &lsquo;<samp>-T</samp>&rsquo; global option (see section [[#SEC118|Global 
options]]), 
+the <code>TMPDIR</code> environment variable (see section [[#SEC181|All 
environment variables which affect CVS]]), 
+or, failing that, &lsquo;<tt>/tmp</tt>&rsquo;.
+</p>
+<p>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:
+</p>
+<ul>
+<li>
+If the server aborts due to an internal server error,
+it may preserve the directory to aid in debugging
+
+</li><li>
+If the server is killed in a way that it has no way of
+cleaning up (most notably, &lsquo;<samp>kill -KILL</samp>&rsquo; on unix).
+
+</li><li>
+If the system shuts down without an orderly shutdown,
+which tells the server to clean up.
+</li></ul>
+
+<p>In cases such as this, you will need to manually remove
+the &lsquo;<tt>cvs-serv<var>pid</var></tt>&rsquo; directories.  As long as
+there is no server running with process identification
+number <var>pid</var>, it is safe to do so.
+</p>
+<hr size="6">
+<div id="Starting-a-new-project"></div>
+<div id="SEC38"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC37| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC39| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC9| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC44| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== Starting a project with CVS ==
+
+<p>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 <small>CVS</small> does have some
+quirks particularly in the area of renaming
+directories.  See section [[#SEC70|Moving and renaming files]].
+</p>
+<p>What to do next depends on the situation at hand.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC39| Setting up the 
files]]::<nowiki>        Getting the files into the repository
+</nowiki>&bull;[[#SEC43| Defining the module]]::<nowiki>         How to make a 
module of the files
+</nowiki></pre>
+<hr size="6">
+<div id="Setting-up-the-files"></div>
+<div id="SEC39"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC38| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC40| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC38| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC44| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Setting up the files ===
+
+<p>The first step is to create the files inside the repository.  This can
+be done in a couple of different ways.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC40| From 
files]]::<nowiki>                  This method is useful with old projects
+                                where files already exists.
+</nowiki>&bull;[[#SEC41| From other version control systems]]::<nowiki>  Old 
projects where you want to
+                                        preserve history from another system.
+</nowiki>&bull;[[#SEC42| From scratch]]::<nowiki>                Creating a 
directory tree from scratch.
+</nowiki></pre>
+<hr size="6">
+<div id="From-files"></div>
+<div id="SEC40"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC39| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC41| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC38| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC39| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC44| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Creating a directory tree from a number of files ====
+
+<p>When you begin using <small>CVS</small>, you will probably already have 
several
+projects that can be
+put under <small>CVS</small> control.  In these cases the easiest way is to 
use the
+<code>import</code> command.  An example is probably the easiest way to
+explain how to use it.  If the files you want to install in
+<small>CVS</small> reside in &lsquo;<tt><var>wdir</var></tt>&rsquo;, and you 
want them to appear in the
+repository as &lsquo;<tt>$CVSROOT/yoyodyne/<var>rdir</var></tt>&rsquo;, you 
can do this:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cd <var>wdir</var>
+$ cvs import -m &quot;Imported sources&quot; yoyodyne/<var>rdir</var> yoyo 
start
+</nowiki></pre></td></tr></table>
+
+<p>Unless you supply a log message with the &lsquo;<samp>-m</samp>&rsquo;
+flag, <small>CVS</small> starts an editor and prompts for a
+message.  The string &lsquo;<samp>yoyo</samp>&rsquo; is a <em>vendor tag</em>,
+and &lsquo;<samp>start</samp>&rsquo; is a <em>release tag</em>.  They may fill
+no purpose in this context, but since <small>CVS</small> requires
+them they must be present.  See section [[#SEC105|Tracking third-party 
sources]], for
+more information about them.
+</p>
+<p>You can now verify that it worked, and remove your
+original source directory.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cd ..
+$ cvs checkout yoyodyne/<var>rdir</var>       # <span 
class="roman">Explanation below</span>
+$ diff -r <var>wdir</var> yoyodyne/<var>rdir</var>
+$ rm -r <var>wdir</var>
+</nowiki></pre></td></tr></table>
+
+<p>Erasing the original sources is a good idea, to make sure that you do
+not accidentally edit them in <var>wdir</var>, bypassing <small>CVS</small>.
+Of course, it would be wise to make sure that you have
+a backup of the sources before you remove them.
+</p>
+<p>The <code>checkout</code> command can either take a module
+name as argument (as it has done in all previous
+examples) or a path name relative to <code>$CVSROOT</code>,
+as it did in the example above.
+</p>
+<p>It is a good idea to check that the permissions
+<small>CVS</small> sets on the directories inside <code>$CVSROOT</code>
+are reasonable, and that they belong to the proper
+groups.  See section [[#SEC13|File permissions]].
+</p>
+<p>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.  See section [[#SEC165|The cvswrappers 
file]].
+</p>
+<hr size="6">
+<div id="From-other-version-control-systems"></div>
+<div id="SEC41"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC40| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC42| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC38| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC39| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC44| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Creating Files From Other Version Control Systems ====
+
+<p>If you have a project which you are maintaining with
+another version control system, such as <small>RCS</small>, you
+may wish to put the files from that project into
+<small>CVS</small>, and preserve the revision history of the
+files.
+</p>
+<dl compact="compact">
+<dd><div id="IDX90"></div>
+</dd>
+<dt> From RCS</dt>
+<dd><p>If you have been using <small>RCS</small>, find the <small>RCS</small>
+files&mdash;usually a file named &lsquo;<tt>foo.c</tt>&rsquo; will have its
+<small>RCS</small> file in &lsquo;<tt>RCS/foo.c,v</tt>&rsquo; (but it could be
+other places; consult the <small>RCS</small> documentation for
+details).  Then create the appropriate directories in
+<small>CVS</small> if they do not already exist.  Then copy the
+files into the appropriate directories in the <small>CVS</small>
+repository (the name in the repository must be the name
+of the source file with &lsquo;<samp>,v</samp>&rsquo; added; the files go
+directly in the appropriate directory of the repository,
+not in an &lsquo;<tt>RCS</tt>&rsquo; subdirectory).  This is one of the
+few times when it is a good idea to access the <small>CVS</small>
+repository directly, rather than using <small>CVS</small>
+commands.  Then you are ready to check out a new
+working directory.
+</p>
+<p>The <small>RCS</small> file should not be locked when you move it
+into <small>CVS</small>; if it is, <small>CVS</small> will have trouble
+letting you operate on it.
+</p>
+</dd>
+<dt> From another version control system</dt>
+<dd><p>Many version control systems have the ability to export
+<small>RCS</small> files in the standard format.  If yours does,
+export the <small>RCS</small> files and then follow the above
+instructions.
+</p>
+<p>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 <small>CVS</small>.
+The &lsquo;<tt>sccs2rcs</tt>&rsquo; script mentioned below may be a
+useful example to follow.
+</p>
+<div id="IDX91"></div>
+</dd>
+<dt> From SCCS</dt>
+<dd><p>There is a script in the &lsquo;<tt>contrib</tt>&rsquo; directory of
+the <small>CVS</small> source distribution called 
&lsquo;<tt>sccs2rcs</tt>&rsquo;
+which converts <small>SCCS</small> files to <small>RCS</small> files.
+Note: you must run it on a machine which has both
+<small>SCCS</small> and <small>RCS</small> installed, and like everything
+else in contrib it is unsupported (your mileage may
+vary).
+</p>
+<div id="IDX92"></div>
+</dd>
+<dt> From PVCS</dt>
+<dd><p>There is a script in the &lsquo;<tt>contrib</tt>&rsquo; directory of
+the <small>CVS</small> source distribution called 
&lsquo;<tt>pvcs_to_rcs</tt>&rsquo;
+which converts <small>PVCS</small> archives to <small>RCS</small> files.
+You must run it on a machine which has both
+<small>PVCS</small> and <small>RCS</small> installed, and like everything
+else in contrib it is unsupported (your mileage may
+vary).  See the comments in the script for details.
+</p></dd>
+</dl>
+
+<hr size="6">
+<div id="From-scratch"></div>
+<div id="SEC42"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC41| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC43| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC38| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC39| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC44| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Creating a directory tree from scratch ====
+
+<p>For a new project, the easiest thing to do is probably
+to create an empty directory structure, like this:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ mkdir tc
+$ mkdir tc/man
+$ mkdir tc/testing
+</nowiki></pre></td></tr></table>
+
+<p>After that, you use the <code>import</code> command to create
+the corresponding (empty) directory structure inside
+the repository:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cd tc
+$ cvs import -m &quot;Created directory structure&quot; 
yoyodyne/<var>dir</var> yoyo start
+</nowiki></pre></td></tr></table>
+
+<p>Then, use <code>add</code> to add files (and new directories)
+as they appear.
+</p>
+<p>Check that the permissions <small>CVS</small> sets on the
+directories inside <code>$CVSROOT</code> are reasonable.
+</p>
+<hr size="6">
+<div id="Defining-the-module"></div>
+<div id="SEC43"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC42| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC44| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC38| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC38| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC44| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Defining the module ===
+
+<p>The next step is to define the module in the
+&lsquo;<tt>modules</tt>&rsquo; file.  This is not strictly necessary,
+but modules can be convenient in grouping together
+related files and directories.
+</p>
+<p>In simple cases these steps are sufficient to define a module.
+</p>
+<ol>
+<li>
+Get a working copy of the modules file.
+
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs checkout 
CVSROOT/modules
+$ cd CVSROOT
+</nowiki></pre></td></tr></table>
+
+</li><li>
+Edit the file and insert a line that defines the module.  See section 
[[#SEC20|The administrative files]], for an introduction.  See section 
[[#SEC158|The modules file]], for a full
+description of the modules file.  You can use the
+following line to define the module &lsquo;<samp>tc</samp>&rsquo;:
+
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>tc   yoyodyne/tc
+</nowiki></pre></td></tr></table>
+
+</li><li>
+Commit your changes to the modules file.
+
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs commit -m 
&quot;Added the tc module.&quot; modules
+</nowiki></pre></td></tr></table>
+
+</li><li>
+Release the modules module.
+
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cd ..
+$ cvs release -d CVSROOT
+</nowiki></pre></td></tr></table>
+</li></ol>
+
+<hr size="6">
+<div id="Revisions"></div>
+<div id="SEC44"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC43| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC45| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC38| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC54| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== Revisions ==
+
+<p>For many uses of <small>CVS</small>, one doesn&rsquo;t need to worry
+too much about revision numbers; <small>CVS</small> assigns
+numbers such as <code>1.1</code>, <code>1.2</code>, and so on, and
+that is all one needs to know.  However, some people
+prefer to have more knowledge and control concerning
+how <small>CVS</small> assigns revision numbers.
+</p>
+<p>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 <em>tag</em>,
+which is a symbolic revision which can be assigned to a
+numeric revision in each file.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC45| Revision 
numbers]]::<nowiki>            The meaning of a revision number
+</nowiki>&bull;[[#SEC46| Versions revisions releases]]::<nowiki>  Terminology 
used in this manual
+</nowiki>&bull;[[#SEC47| Assigning revisions]]::<nowiki>         Assigning 
revisions
+</nowiki>&bull;[[#SEC48| Tags]]::<nowiki>                        
Tags--Symbolic revisions
+</nowiki>&bull;[[#SEC49| Tagging the working directory]]::<nowiki>  The cvs 
tag command
+</nowiki>&bull;[[#SEC50| Tagging by date/tag]]::<nowiki>         The cvs rtag 
command
+</nowiki>&bull;[[#SEC51| Modifying tags]]::<nowiki>              Adding, 
renaming, and deleting tags
+</nowiki>&bull;[[#SEC52| Tagging add/remove]]::<nowiki>          Tags with 
adding and removing files
+</nowiki>&bull;[[#SEC53| Sticky tags]]::<nowiki>                 Certain tags 
are persistent
+</nowiki></pre>
+<hr size="6">
+<div id="Revision-numbers"></div>
+<div id="SEC45"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC44| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC46| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC44| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC44| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC54| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Revision numbers ===
+
+<p>Each version of a file has a unique <em>revision
+number</em>.  Revision numbers look like &lsquo;<samp>1.1</samp>&rsquo;,
+&lsquo;<samp>1.2</samp>&rsquo;, &lsquo;<samp>1.3.2.2</samp>&rsquo; or even 
&lsquo;<samp>1.3.2.2.4.5</samp>&rsquo;.
+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.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>       +-----+    
+-----+    +-----+    +-----+    +-----+
+       ! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 !
+       +-----+    +-----+    +-----+    +-----+    +-----+
+</nowiki></pre></td></tr></table>
+
+<p>It is also possible to end up with numbers containing
+more than one period, for example &lsquo;<samp>1.3.2.2</samp>&rsquo;.  Such
+revisions represent revisions on branches
+(see section [[#SEC54|Branching and merging]]); such revision numbers
+are explained in detail in [[#SEC58|Branches and revisions]].
+</p>
+<hr size="6">
+<div id="Versions-revisions-releases"></div>
+<div id="SEC46"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC45| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC47| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC44| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC44| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC54| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Versions, revisions and releases ===
+
+<p>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 &lsquo;<samp>4.1.1</samp>&rsquo;.
+</p>
+<p>Versions in the first sense are called <em>revisions</em>
+in this document, and versions in the second sense are
+called <em>releases</em>.  To avoid confusion, the word
+<em>version</em> is almost never used in this document.
+</p>
+<hr size="6">
+<div id="Assigning-revisions"></div>
+<div id="SEC47"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC46| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC48| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC44| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC44| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC54| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Assigning revisions ===
+
+<p>By default, <small>CVS</small> will assign numeric revisions by
+leaving the first number the same and incrementing the
+second number.  For example, <code>1.1</code>, <code>1.2</code>,
+<code>1.3</code>, etc.
+</p>
+<p>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 <code>1.7</code>, <code>3.1</code>,
+and <code>4.12</code>, then an added file will be given the
+numeric revision <code>4.1</code>.
+</p>
+<p>Normally there is no reason to care
+about the revision numbers&mdash;it is easier to treat them
+as internal numbers that <small>CVS</small> maintains, and tags
+provide a better way to distinguish between things like
+release 1 versus release 2 of your product
+(see section [[#SEC48|Tags&ndash;Symbolic revisions]]).  However, if you want 
to set the
+numeric revisions, the &lsquo;<samp>-r</samp>&rsquo; option to <code>cvs
+commit</code> can do that.  The &lsquo;<samp>-r</samp>&rsquo; option implies 
the
+&lsquo;<samp>-f</samp>&rsquo; option, in the sense that it causes the
+files to be committed even if they are not modified.
+</p>
+<p>For example, to bring all your files up to
+revision 3.0 (including those that haven&rsquo;t changed),
+you might invoke:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs commit -r 3.0
+</nowiki></pre></td></tr></table>
+
+<p>Note that the number you specify with &lsquo;<samp>-r</samp>&rsquo; must be
+larger than any existing revision number.  That is, if
+revision 3.0 exists, you cannot &lsquo;<samp>cvs commit
+-r 1.3</samp>&rsquo;.  If you want to maintain several releases in
+parallel, you need to use a branch (see section [[#SEC54|Branching and 
merging]]).
+</p>
+<hr size="6">
+<div id="Tags"></div>
+<div id="SEC48"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC47| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC49| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC44| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC44| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC54| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Tags&ndash;Symbolic revisions ===
+
+<p>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 <small>CVS</small> the revision numbers might change several 
times
+between two releases.  As an example, some of the
+source files that make up <small>RCS</small> 5.6 have the following
+revision numbers:
+<div id="IDX93"></div>
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>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
+</nowiki></pre></td></tr></table>
+
+<div id="IDX94"></div>
+<div id="IDX95"></div>
+<div id="IDX96"></div>
+<div id="IDX97"></div>
+<div id="IDX98"></div>
+<div id="IDX99"></div>
+<p>You can use the <code>tag</code> command to give a symbolic name to a
+certain revision of a file.  You can use the &lsquo;<samp>-v</samp>&rsquo; 
flag to the
+<code>status</code> 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,
+&lsquo;<samp>-</samp>&rsquo;, and &lsquo;<samp>_</samp>&rsquo;.  The two tag 
names <code>BASE</code>
+and <code>HEAD</code> are reserved for use by <small>CVS</small>.  It
+is expected that future names which are special to
+<small>CVS</small> will be specially named, for example by
+starting with &lsquo;<samp>.</samp>&rsquo;, rather than being named 
analogously to
+<code>BASE</code> and <code>HEAD</code>, to avoid conflicts with
+actual tag names.
+</p>
+<p>You&rsquo;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 &lsquo;<samp>.</samp>&rsquo; changed to
+&lsquo;<samp>-</samp>&rsquo;, so that <small>CVS</small> 1.9 would be tagged 
with the name
+<code>cvs1-9</code>.  If you choose a consistent convention,
+then you won&rsquo;t constantly be guessing whether a tag is
+<code>cvs-1-9</code> or <code>cvs1_9</code> or what.  You might
+even want to consider enforcing your convention in the
+taginfo file (see section [[#SEC78|User-defined logging]]).
+</p>
+<div id="IDX100"></div>
+<div id="IDX101"></div>
+<p>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 &lsquo;<tt>backend.c</tt>&rsquo;
+resides.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ 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)
+
+</nowiki></pre></td></tr></table>
+
+<p>For a complete summary of the syntax of <code>cvs tag</code>,
+including the various options, see [[#SEC156|Quick reference to CVS commands]].
+</p>
+<p>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.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs tag rel-1-0 .
+cvs tag: Tagging .
+T Makefile
+T backend.c
+T driver.c
+T frontend.c
+T parser.c
+</nowiki></pre></td></tr></table>
+
+<p>(When you give <small>CVS</small> 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.  See section [[#SEC65|Recursive 
behavior]].)
+</p>
+<div id="IDX102"></div>
+<div id="IDX103"></div>
+<p>The <code>checkout</code> command has a flag, 
&lsquo;<samp>-r</samp>&rsquo;, 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 
&lsquo;<samp>tc</samp>&rsquo; at
+any time in the future:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs checkout -r 
rel-1-0 tc
+</nowiki></pre></td></tr></table>
+
+<p>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.
+</p>
+<p>You can also check out a module as it was at any given date.
+See section [[#SEC123|checkout options]].  When specifying 
&lsquo;<samp>-r</samp>&rsquo; to
+any of these commands, you will need beware of sticky
+tags; see [[#SEC53|Sticky tags]].
+</p>
+<p>When you tag more than one file with the same tag you
+can think about the tag as &quot;a curve drawn through a
+matrix of filename vs. revision number.&quot;  Say we have 5
+files with the following revisions:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>        file1   
file2   file3   file4   file5
+
+        1.1     1.1     1.1     1.1  /--1.1*      &lt;-*-  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
+</nowiki></pre></td></tr></table>
+
+<p>At some time in the past, the <code>*</code> versions were tagged.
+You can think of the tag as a handle attached to the curve
+drawn through the tagged revisions.  When you pull on
+the handle, you get all the tagged revisions.  Another
+way to look at it is that you &quot;sight&quot; through a set of
+revisions that is &quot;flat&quot; along the tagged revisions,
+like this:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>        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     (--- &lt;--- Look here
+        1.3             1.6     1.3              \_
+        1.4                     1.4
+                                1.5
+</nowiki></pre></td></tr></table>
+
+<hr size="6">
+<div id="Tagging-the-working-directory"></div>
+<div id="SEC49"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC48| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC50| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC44| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC44| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC54| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Specifying what to tag from the working directory ===
+
+<p>The example in the previous section demonstrates one of
+the most common ways to choose which revisions to tag.
+Namely, running the <code>cvs tag</code> command without
+arguments causes <small>CVS</small> to select the revisions which
+are checked out in the current working directory.  For
+example, if the copy of &lsquo;<tt>backend.c</tt>&rsquo; in working
+directory was checked out from revision 1.4, then
+<small>CVS</small> 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 <code>cvs commit</code> to transfer
+that modification to the repository.
+</p>
+<p>One potentially surprising aspect of the fact that
+<code>cvs tag</code> 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
+&lsquo;<samp>-c</samp>&rsquo; option to <code>cvs tag</code>.  If there are any
+locally modified files, <small>CVS</small> will abort with an
+error before it tags any files:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs tag -c rel-0-4
+cvs tag: backend.c is locally modified
+cvs [tag aborted]: correct the above errors first!
+</nowiki></pre></td></tr></table>
+
+<hr size="6">
+<div id="Tagging-by-date_002ftag"></div>
+<div id="SEC50"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC49| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC51| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC44| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC44| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC54| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Specifying what to tag by date or revision ===
+
+<p>The <code>cvs rtag</code> command tags the repository as of a
+certain date or time (or can be used to tag the latest
+revision).  <code>rtag</code> works directly on the
+repository contents (it requires no prior checkout and
+does not look for a working directory).
+</p>
+<p>The following options specify which date or revision to
+tag.  See [[#SEC119|Common command options]], for a complete
+description of them.
+</p>
+<dl compact="compact">
+<dt> <code>-D <var>date</var></code></dt>
+<dd><p>Tag the most recent revision no later than <var>date</var>.
+</p>
+</dd>
+<dt> <code>-f</code></dt>
+<dd><p>Only useful with the &lsquo;<samp>-D <var>date</var></samp>&rsquo; or 
&lsquo;<samp>-r <var>tag</var></samp>&rsquo;
+flags.  If no matching revision is found, use the most
+recent revision (instead of ignoring the file).
+</p>
+</dd>
+<dt> <code>-r <var>tag</var></code></dt>
+<dd><p>Only tag those files that contain existing tag <var>tag</var>.
+</p></dd>
+</dl>
+
+<p>The <code>cvs tag</code> command also allows one to specify
+files by revision or date, using the same &lsquo;<samp>-r</samp>&rsquo;,
+&lsquo;<samp>-D</samp>&rsquo;, and &lsquo;<samp>-f</samp>&rsquo; options.  
However, this
+feature is probably not what you want.  The reason is
+that <code>cvs tag</code> 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 <code>cvs
+rtag</code>.  The exceptions might be cases like:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs tag -r 1.4 
stable backend.c
+</nowiki></pre></td></tr></table>
+
+<hr size="6">
+<div id="Modifying-tags"></div>
+<div id="SEC51"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC50| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC52| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC44| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC44| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC54| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Deleting, moving, and renaming tags ===
+
+
+<p>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.
+</p>
+<p>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.
+</p>
+<p><strong>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 <small>CVS</small>
+administrator, you may consider restricting these
+commands with taginfo (see section [[#SEC78|User-defined logging]]).</strong>
+</p>
+<div id="IDX104"></div>
+<div id="IDX105"></div>
+<div id="IDX106"></div>
+<div id="IDX107"></div>
+<div id="IDX108"></div>
+<div id="IDX109"></div>
+<p>To delete a tag, specify the &lsquo;<samp>-d</samp>&rsquo; option to either
+<code>cvs tag</code> or <code>cvs rtag</code>.  For example:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs rtag -d rel-0-4 
tc
+</nowiki></pre></td></tr></table>
+
+<p>deletes the non-branch tag <code>rel-0-4</code> from the module 
<code>tc</code>.
+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 <code>-B</code> 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.
+</p>
+<p><strong>WARNING: Moving branch tags is very dangerous!  If you think
+you need the <code>-B</code> option, think again and ask your 
<small>CVS</small>
+administrator about it (if that isn&rsquo;t you).  There is almost certainly
+another way to accomplish what you want to accomplish.</strong>
+</p>
+<div id="IDX110"></div>
+<div id="IDX111"></div>
+<div id="IDX112"></div>
+<div id="IDX113"></div>
+<p>When we say <em>move</em> a tag, we mean to make the same
+name point to different revisions.  For example, the
+<code>stable</code> tag may currently point to revision 1.4
+of &lsquo;<tt>backend.c</tt>&rsquo; and perhaps we want to make it
+point to revision 1.6.  To move a non-branch tag, specify the
+&lsquo;<samp>-F</samp>&rsquo; option to either <code>cvs tag</code> or 
<code>cvs
+rtag</code>.  For example, the task just mentioned might be
+accomplished as:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs tag -r 1.6 -F 
stable backend.c
+</nowiki></pre></td></tr></table>
+
+<p>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 <code>-B</code> option may be specified.
+In that case, non-branch tags encountered with the given
+name are ignored with a warning message.
+</p>
+<p><strong>WARNING: Moving branch tags is very dangerous!  If you think you
+need the <code>-B</code> option, think again and ask your <small>CVS</small>
+administrator about it (if that isn&rsquo;t you).  There is almost certainly
+another way to accomplish what you want to accomplish.</strong>
+</p>
+<div id="IDX114"></div>
+<div id="IDX115"></div>
+<p>When we say <em>rename</em> 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 &lsquo;<samp>-r</samp>&rsquo; option to
+<code>cvs rtag</code>, 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:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs rtag -r 
old-name-0-4 rel-0-4 tc
+cvs rtag -d old-name-0-4 tc
+</nowiki></pre></td></tr></table>
+
+<hr size="6">
+<div id="Tagging-add_002fremove"></div>
+<div id="SEC52"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC51| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC53| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC44| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC44| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC54| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Tagging and adding and removing files ===
+
+<p>The subject of exactly how tagging interacts with
+adding and removing files is somewhat obscure; for the
+most part <small>CVS</small> 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 <small>CVS</small> knows to treat the absence
+of a tag as meaning that the file didn&rsquo;t exist as of
+that tag.
+</p>
+<p>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 &lsquo;<samp>-r</samp>&rsquo; option to <code>cvs 
rtag</code>,
+then <small>CVS</small> tags the files which have been removed,
+and thereby avoids this problem.  For example, one
+might specify <code>-r HEAD</code> to tag the head.
+</p>
+<p>On the subject of adding and removing files, the
+<code>cvs rtag</code> command has a &lsquo;<samp>-a</samp>&rsquo; 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 &lsquo;<samp>-F</samp>&rsquo; when
+moving a tag.  If one moved a tag without &lsquo;<samp>-a</samp>&rsquo;,
+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&rsquo;t think this is
+necessary if &lsquo;<samp>-r</samp>&rsquo; is specified, as noted above.
+</p>
+<hr size="6">
+<div id="Sticky-tags"></div>
+<div id="SEC53"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC52| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC54| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC44| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC44| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC54| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Sticky tags ===
+
+
+<p>Sometimes a working copy&rsquo;s revision has extra data
+associated with it, for example it might be on a branch
+(see section [[#SEC54|Branching and merging]]), or restricted to
+versions prior to a certain date by &lsquo;<samp>checkout -D</samp>&rsquo;
+or &lsquo;<samp>update -D</samp>&rsquo;.  Because this data persists &ndash;
+that is, it applies to subsequent commands in the
+working copy &ndash; we refer to it as <em>sticky</em>.
+</p>
+<p>Most of the time, stickiness is an obscure aspect of
+<small>CVS</small> that you don&rsquo;t need to think about.  However,
+even if you don&rsquo;t want to use the feature, you may need
+to know <em>something</em> about sticky tags (for
+example, how to avoid them!).
+</p>
+<p>You can use the <code>status</code> command to see if any
+sticky tags or dates are set:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ 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)
+
+</nowiki></pre></td></tr></table>
+
+<div id="IDX116"></div>
+<div id="IDX117"></div>
+<div id="IDX118"></div>
+<p>The sticky tags will remain on your working files until
+you delete them with &lsquo;<samp>cvs update -A</samp>&rsquo;.  The
+&lsquo;<samp>-A</samp>&rsquo; option merges local changes into the version of 
the
+file from the head of the trunk, removing any sticky tags,
+dates, or options.  See [[#SEC153|update&mdash;Bring work tree in sync with 
repository]] for more on the operation
+of <code>cvs update</code>.
+</p>
+<div id="IDX119"></div>
+<p>The most common use of sticky tags is to identify which
+branch one is working on, as described in
+[[#SEC57|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 <code>cvs
+update</code>.  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 <code>cvs update</code>
+commands will
+not retrieve the latest revision until you reset the
+tag with <code>cvs update -A</code>.  Likewise, use of the
+&lsquo;<samp>-D</samp>&rsquo; option to <code>update</code> or 
<code>checkout</code>
+sets a <em>sticky date</em>, which, similarly, causes that
+date to be used for future retrievals.
+</p>
+<p>People often want to retrieve an old version of
+a file without setting a sticky tag.  This can
+be done with the &lsquo;<samp>-p</samp>&rsquo; option to <code>checkout</code> 
or
+<code>update</code>, which sends the contents of the file to
+standard output.  For example:
+</p><table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs update -p 
-r 1.1 file1 &gt;file1
+===================================================================
+Checking out file1
+RCS:  /tmp/cvs-sanity/cvsroot/first-dir/Attic/file1,v
+VERS: 1.1
+***************
+$
+</nowiki></pre></td></tr></table>
+
+<p>However, this isn&rsquo;t the easiest way, if you are asking
+how to undo a previous checkin (in this example, put
+&lsquo;<tt>file1</tt>&rsquo; back to the way it was as of revision
+1.1).  In that case you are better off using the
+&lsquo;<samp>-j</samp>&rsquo; option to <code>update</code>; for further
+discussion see [[#SEC62|Merging differences between any two revisions]].
+</p>
+<hr size="6">
+<div id="Branching-and-merging"></div>
+<div id="SEC54"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC53| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC55| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC44| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC65| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== Branching and merging ==
+
+<p><small>CVS</small> allows you to isolate changes onto a separate
+line of development, known as a <em>branch</em>.  When you
+change files on a branch, those changes do not appear
+on the main trunk or other branches.
+</p>
+<p>Later you can move changes from one branch to another
+branch (or the main trunk) by <em>merging</em>.  Merging
+involves first running <code>cvs update -j</code>, to merge
+the changes into the working directory.
+You can then commit that revision, and thus effectively
+copy the changes onto another branch.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC55| Branches 
motivation]]::<nowiki>         What branches are good for
+</nowiki>&bull;[[#SEC56| Creating a branch]]::<nowiki>           Creating a 
branch
+</nowiki>&bull;[[#SEC57| Accessing branches]]::<nowiki>          Checking out 
and updating branches
+</nowiki>&bull;[[#SEC58| Branches and revisions]]::<nowiki>      Branches are 
reflected in revision numbers
+</nowiki>&bull;[[#SEC59| Magic branch numbers]]::<nowiki>        Magic branch 
numbers
+</nowiki>&bull;[[#SEC60| Merging a branch]]::<nowiki>            Merging an 
entire branch
+</nowiki>&bull;[[#SEC61| Merging more than once]]::<nowiki>      Merging from 
a branch several times
+</nowiki>&bull;[[#SEC62| Merging two revisions]]::<nowiki>       Merging 
differences between two revisions
+</nowiki>&bull;[[#SEC63| Merging adds and removals]]::<nowiki>   What if files 
are added or removed?
+</nowiki>&bull;[[#SEC64| Merging and keywords]]::<nowiki>        Avoiding 
conflicts due to keyword substitution
+</nowiki></pre>
+<hr size="6">
+<div id="Branches-motivation"></div>
+<div id="SEC55"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC54| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC56| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC54| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC54| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC65| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== What branches are good for ===
+
+<p>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 (see section [[#SEC48|Tags&ndash;Symbolic revisions]]) 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.
+</p>
+<p>The thing to do in a situation like this is to create a <em>branch</em> 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.
+</p>
+<hr size="6">
+<div id="Creating-a-branch"></div>
+<div id="SEC56"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC55| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC57| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC54| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC54| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC65| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Creating a branch ===
+
+<p>You can create a branch with <code>tag -b</code>; for
+example, assuming you&rsquo;re in a working copy:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs tag -b 
rel-1-0-patches
+</nowiki></pre></td></tr></table>
+
+
+<p>This splits off a branch based on the current revisions
+in the working copy, assigning that branch the name
+&lsquo;<samp>rel-1-0-patches</samp>&rsquo;.
+</p>
+<p>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 <em>not</em> automatically switch the working
+copy to be on the new branch.  For information on how
+to do that, see [[#SEC57|Accessing branches]].
+</p>
+<p>You can also create a branch without reference to any
+working copy, by using <code>rtag</code>:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs rtag -b -r 
rel-1-0 rel-1-0-patches tc
+</nowiki></pre></td></tr></table>
+
+<p>&lsquo;<samp>-r rel-1-0</samp>&rsquo; says that this branch should be
+rooted at the revision that
+corresponds to the tag &lsquo;<samp>rel-1-0</samp>&rsquo;.  It need not
+be the most recent revision &ndash; it&rsquo;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).
+</p>
+<p>As with &lsquo;<samp>tag</samp>&rsquo;, the &lsquo;<samp>-b</samp>&rsquo; 
flag tells
+<code>rtag</code> to create a branch (rather than just a
+symbolic revision name).  Note that the numeric
+revision number that matches &lsquo;<samp>rel-1-0</samp>&rsquo; will
+probably be different from file to file.
+</p>
+<p>So, the full effect of the command is to create a new
+branch &ndash; named &lsquo;<samp>rel-1-0-patches</samp>&rsquo; &ndash; in 
module
+&lsquo;<samp>tc</samp>&rsquo;, rooted in the revision tree at the point tagged
+by &lsquo;<samp>rel-1-0</samp>&rsquo;.
+</p>
+<hr size="6">
+<div id="Accessing-branches"></div>
+<div id="SEC57"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC56| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC58| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC54| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC54| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC65| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Accessing branches ===
+
+<p>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.
+</p>
+<p>To check out a branch from the repository, invoke
+&lsquo;<samp>checkout</samp>&rsquo; with the &lsquo;<samp>-r</samp>&rsquo; 
flag, followed by
+the tag name of the branch (see section [[#SEC56|Creating a branch]]):
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs checkout -r 
rel-1-0-patches tc
+</nowiki></pre></td></tr></table>
+
+<p>Or, if you already have a working copy, you can switch
+it to a given branch with &lsquo;<samp>update -r</samp>&rsquo;:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs update -r 
rel-1-0-patches tc
+</nowiki></pre></td></tr></table>
+
+<p>or equivalently:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cd tc
+$ cvs update -r rel-1-0-patches
+</nowiki></pre></td></tr></table>
+
+<p>It does not matter if the working copy was originally
+on the main trunk or on some other branch &ndash; the above
+command will switch it to the named branch.  And
+similarly to a regular &lsquo;<samp>update</samp>&rsquo; command,
+&lsquo;<samp>update -r</samp>&rsquo; merges any changes you have made,
+notifying you of conflicts where they occur.
+</p>
+<p>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.
+</p>
+<div id="IDX120"></div>
+<p>To find out what branch a working copy is on, you can
+use the &lsquo;<samp>status</samp>&rsquo; command.  In its output, look for
+the field named &lsquo;<samp>Sticky tag</samp>&rsquo; (see section 
[[#SEC53|Sticky tags]])
+&ndash; that&rsquo;s <small>CVS</small>&rsquo;s way of telling you the branch, 
if
+any, of the current working files:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ 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)
+
+</nowiki></pre></td></tr></table>
+
+<p>Don&rsquo;t be confused by the fact that the branch numbers
+for each file are different (&lsquo;<samp>1.7.2</samp>&rsquo; and
+&lsquo;<samp>1.4.2</samp>&rsquo; respectively).  The branch tag is the
+same, &lsquo;<samp>rel-1-0-patches</samp>&rsquo;, and the files are
+indeed on the same branch.  The numbers simply reflect
+the point in each file&rsquo;s revision history at which the
+branch was made.  In the above example, one can deduce
+that &lsquo;<samp>driver.c</samp>&rsquo; had been through more changes than
+&lsquo;<samp>backend.c</samp>&rsquo; before this branch was created.
+</p>
+<p>See [[#SEC58|Branches and revisions]] for details about how
+branch numbers are constructed.
+</p>
+<hr size="6">
+<div id="Branches-and-revisions"></div>
+<div id="SEC58"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC57| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC59| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC54| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC54| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC65| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Branches and revisions ===
+
+<p>Ordinarily, a file&rsquo;s revision history is a linear
+series of increments (see section [[#SEC45|Revision numbers]]):
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>       +-----+    
+-----+    +-----+    +-----+    +-----+
+       ! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 !
+       +-----+    +-----+    +-----+    +-----+    +-----+
+</nowiki></pre></td></tr></table>
+
+<p>However, <small>CVS</small> is not limited to linear development.  The
+<em>revision tree</em> can be split into <em>branches</em>,
+where each branch is a self-maintained line of
+development.  Changes made on one branch can easily be
+moved back to the main trunk.
+</p>
+<p>Each branch has a <em>branch number</em>, 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.
+</p>
+<p>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.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>                    
                                  +-------------+
+                           Branch 1.2.2.3.2 -&gt;        ! 1.2.2.3.2.1 !
+                                                    / +-------------+
+                                                   /
+                                                  /
+                 +---------+    +---------+    +---------+
+Branch 1.2.2 -&gt; _! 1.2.2.1 !----! 1.2.2.2 !----! 1.2.2.3 !
+               / +---------+    +---------+    +---------+
+              /
+             /
++-----+    +-----+    +-----+    +-----+    +-----+
+! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 !  &lt;- The main trunk
++-----+    +-----+    +-----+    +-----+    +-----+
+                !
+                !
+                !   +---------+    +---------+    +---------+
+Branch 1.2.4 -&gt; +---! 1.2.4.1 !----! 1.2.4.2 !----! 1.2.4.3 !
+                    +---------+    +---------+    +---------+
+
+</nowiki></pre></td></tr></table>
+
+
+
+<p>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
+<small>CVS</small> 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 <small>CVS</small>
+(see section [[#SEC59|Magic branch numbers]]).  The branch 1.1.1 has a
+special meaning.  See section [[#SEC105|Tracking third-party sources]].
+</p>
+<hr size="6">
+<div id="Magic-branch-numbers"></div>
+<div id="SEC59"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC58| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC60| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC54| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC54| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC65| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Magic branch numbers ===
+
+
+<p>This section describes a <small>CVS</small> feature called
+<em>magic branches</em>.  For most purposes, you need not
+worry about magic branches; <small>CVS</small> 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.
+</p>
+<p>Externally, branch numbers consist of an odd number of
+dot-separated decimal integers.  See section [[#SEC45|Revision numbers]].  
That is not the whole truth, however.  For
+efficiency reasons <small>CVS</small> 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).
+</p>
+<p><small>CVS</small> does a pretty good job at hiding these so
+called magic branches, but in a few places the hiding
+is incomplete:
+</p>
+<ul>
+<li>
+The magic branch number appears in the output from
+<code>cvs log</code>.
+
+</li><li>
+You cannot specify a symbolic branch name to <code>cvs
+admin</code>.
+
+</li></ul>
+
+<p>You can use the <code>admin</code> command to reassign a
+symbolic name to a branch the way <small>RCS</small> expects it
+to be.  If <code>R4patches</code> is assigned to the branch
+1.4.2 (magic branch number 1.4.0.2) in file
+&lsquo;<tt>numbers.c</tt>&rsquo; you can do this:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs admin 
-NR4patches:1.4.2 numbers.c
+</nowiki></pre></td></tr></table>
+
+<p>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).
+</p>
+<hr size="6">
+<div id="Merging-a-branch"></div>
+<div id="SEC60"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC59| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC61| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC54| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC54| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC65| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Merging an entire branch ===
+
+<p>You can merge changes made on a branch into your working copy by giving
+the &lsquo;<samp>-j <var>branchname</var></samp>&rsquo; flag to the 
<code>update</code> subcommand.  With one
+&lsquo;<samp>-j <var>branchname</var></samp>&rsquo; 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.
+</p>
+<div id="IDX121"></div>
+<p>The &lsquo;<samp>-j</samp>&rsquo; stands for &ldquo;join&rdquo;.
+</p>
+<div id="IDX122"></div>
+<div id="IDX123"></div>
+<div id="IDX124"></div>
+<p>Consider this revision tree:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>+-----+    +-----+  
  +-----+    +-----+
+! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !      &lt;- The main trunk
++-----+    +-----+    +-----+    +-----+
+                !
+                !
+                !   +---------+    +---------+
+Branch R1fix -&gt; +---! 1.2.2.1 !----! 1.2.2.2 !
+                    +---------+    +---------+
+</nowiki></pre></td></tr></table>
+
+<p>The branch 1.2.2 has been given the tag (symbolic name) 
&lsquo;<samp>R1fix</samp>&rsquo;.  The
+following example assumes that the module &lsquo;<samp>mod</samp>&rsquo; 
contains only one
+file, &lsquo;<tt>m.c</tt>&rsquo;.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs checkout mod  
             # <span class="roman">Retrieve the latest revision, 1.4</span>
+
+$ cvs update -j R1fix m.c        # <span class="roman">Merge all changes made 
on the branch,</span>
+                                 # <span class="roman">i.e. the changes 
between revision 1.2</span>
+                                 # <span class="roman">and 1.2.2.2, into your 
working copy</span>
+                                 # <span class="roman">of the file.</span>
+
+$ cvs commit -m &quot;Included R1fix&quot; # <span class="roman">Create 
revision 1.5.</span>
+</nowiki></pre></td></tr></table>
+
+<p>A conflict can result from a merge operation.  If that
+happens, you should resolve it before committing the
+new revision.  See section [[#SEC86|Conflicts example]].
+</p>
+<p>If your source files contain keywords (see section [[#SEC98|Keyword 
substitution]]),
+you might be getting more conflicts than strictly necessary.  See
+[[#SEC64|Merging and keywords]], for information on how to avoid this.
+</p>
+<p>The <code>checkout</code> command also supports the &lsquo;<samp>-j 
<var>branchname</var></samp>&rsquo; flag.  The
+same effect as above could be achieved with this:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs checkout -j 
R1fix mod
+$ cvs commit -m &quot;Included R1fix&quot;
+</nowiki></pre></td></tr></table>
+
+<p>It should be noted that <code>update -j <var>tagname</var></code> will also 
work but may
+not produce the desired result.  See section [[#SEC63|Merging can add or 
remove files]], for more.
+</p>
+<hr size="6">
+<div id="Merging-more-than-once"></div>
+<div id="SEC61"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC60| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC62| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC54| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC54| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC65| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Merging from a branch several times ===
+
+<p>Continuing our example, the revision tree now looks
+like this:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>+-----+    +-----+  
  +-----+    +-----+    +-----+
+! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 !   &lt;- The main trunk
++-----+    +-----+    +-----+    +-----+    +-----+
+                !                           *
+                !                          *
+                !   +---------+    +---------+
+Branch R1fix -&gt; +---! 1.2.2.1 !----! 1.2.2.2 !
+                    +---------+    +---------+
+</nowiki></pre></td></tr></table>
+
+<p>where the starred line represents the merge from the
+&lsquo;<samp>R1fix</samp>&rsquo; branch to the main trunk, as just
+discussed.
+</p>
+<p>Now suppose that development continues on the
+&lsquo;<samp>R1fix</samp>&rsquo; branch:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>+-----+    +-----+  
  +-----+    +-----+    +-----+
+! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 !   &lt;- The main trunk
++-----+    +-----+    +-----+    +-----+    +-----+
+                !                           *
+                !                          *
+                !   +---------+    +---------+    +---------+
+Branch R1fix -&gt; +---! 1.2.2.1 !----! 1.2.2.2 !----! 1.2.2.3 !
+                    +---------+    +---------+    +---------+
+</nowiki></pre></td></tr></table>
+
+<p>and then you want to merge those new changes onto the
+main trunk.  If you just use the <code>cvs update -j
+R1fix m.c</code> command again, <small>CVS</small> will attempt to
+merge again the changes which you have already merged,
+which can have undesirable side effects.
+</p>
+<p>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
+&lsquo;<samp>-j</samp>&rsquo; options, and <small>CVS</small> merges the 
changes from
+the first revision to the second revision.  For
+example, in this case the simplest way would be
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs update -j 
1.2.2.2 -j R1fix m.c    # <span class="roman">Merge changes from 1.2.2.2 to 
the</span>
+                                      # <span class="roman">head of the R1fix 
branch</span>
+</nowiki></pre></td></tr></table>
+
+<p>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:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs update -j 
R1fix:yesterday -j R1fix m.c
+</nowiki></pre></td></tr></table>
+
+<p>Better yet, tag the R1fix branch after every merge into
+the trunk, and then use that tag for subsequent merges:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs update -j 
merged_from_R1fix_to_trunk -j R1fix m.c
+</nowiki></pre></td></tr></table>
+
+<hr size="6">
+<div id="Merging-two-revisions"></div>
+<div id="SEC62"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC61| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC63| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC54| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC54| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC65| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Merging differences between any two revisions ===
+
+<p>With two &lsquo;<samp>-j <var>revision</var></samp>&rsquo; flags, the 
<code>update</code>
+(and <code>checkout</code>) command can merge the differences
+between any two revisions into your working file.
+</p>
+<div id="IDX125"></div>
+<div id="IDX126"></div>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs update -j 1.5 
-j 1.3 backend.c
+</nowiki></pre></td></tr></table>
+
+<p>will undo all changes made between revision
+1.3 and 1.5.  Note the order of the revisions!
+</p>
+<p>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.
+</p>
+<div id="IDX127"></div>
+<div id="IDX128"></div>
+<p>Specifying two &lsquo;<samp>-j</samp>&rsquo; options can also undo file
+removals or additions.  For example, suppose you have
+a file
+named &lsquo;<tt>file1</tt>&rsquo; 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:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ 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  &lt;--  file1
+new revision: 1.3; previous revision: 1.2
+done
+$
+</nowiki></pre></td></tr></table>
+
+<hr size="6">
+<div id="Merging-adds-and-removals"></div>
+<div id="SEC63"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC62| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC64| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC54| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC54| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC65| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Merging can add or remove files ===
+
+<p>If the changes which you are merging involve removing
+or adding some files, <code>update -j</code> will reflect
+such additions or removals.
+</p>
+<p>For example:
+</p><table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs update -A
+touch a b c
+cvs add a b c ; cvs ci -m &quot;added&quot; a b c
+cvs tag -b branchtag
+cvs update -r branchtag
+touch d ; cvs add d
+rm a ; cvs rm a
+cvs ci -m &quot;added d, removed a&quot;
+cvs update -A
+cvs update -jbranchtag
+</nowiki></pre></td></tr></table>
+
+<p>After these commands are executed and a &lsquo;<samp>cvs 
commit</samp>&rsquo; is done,
+file &lsquo;<tt>a</tt>&rsquo; will be removed and file 
&lsquo;<tt>d</tt>&rsquo; added in the main branch.
+</p>
+<p>Note that using a single static tag (&lsquo;<samp>-j 
<var>tagname</var></samp>&rsquo;)
+rather than a dynamic tag (&lsquo;<samp>-j 
<var>branchname</var></samp>&rsquo;) to merge
+changes from a branch will usually not remove files which were removed on the
+branch since <small>CVS</small> 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.
+</p>
+<hr size="6">
+<div id="Merging-and-keywords"></div>
+<div id="SEC64"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC63| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC65| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC54| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC54| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC65| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Merging and keywords ===
+
+<p>If you merge files containing keywords (see section [[#SEC98|Keyword 
substitution]]), you will normally get numerous
+conflicts during the merge, because the keywords are
+expanded differently in the revisions which you are
+merging.
+</p>
+<p>Therefore, you will often want to specify the
+&lsquo;<samp>-kk</samp>&rsquo; (see section [[#SEC102|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.
+</p>
+<p>For example, suppose you have a file like this:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>       +---------+
+      _! 1.1.2.1 !   &lt;-  br1
+     / +---------+
+    /
+   /
++-----+    +-----+
+! 1.1 !----! 1.2 !
++-----+    +-----+
+</nowiki></pre></td></tr></table>
+
+<p>and your working directory is currently on the trunk
+(revision 1.2).  Then you might get the following
+results from a merge:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cat file1
+key $<i></i>Revision: 1.2 $
+. . .
+$ 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
+&lt;&lt;&lt;&lt;&lt;&lt;&lt; file1
+key $<i></i>Revision: 1.2 $
+=======
+key $<i></i>Revision: 1.1.2.1 $
+&gt;&gt;&gt;&gt;&gt;&gt;&gt; 1.1.2.1
+. . .
+</nowiki></pre></td></tr></table>
+
+<p>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
+<code>Revision: 1.1</code> to <code>Revision: 1.1.2.1</code>,
+<small>CVS</small> tried to merge that change into your working
+directory, which conflicted with the fact that your
+working directory had contained <code>Revision: 1.2</code>.
+</p>
+<p>Here is what happens if you had used &lsquo;<samp>-kk</samp>&rsquo;:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cat file1
+key $<i></i>Revision: 1.2 $
+. . .
+$ 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 $<i></i>Revision$
+. . .
+</nowiki></pre></td></tr></table>
+
+<p>What is going on here is that revision 1.1 and 1.1.2.1
+both expand as plain <code>Revision</code>, and therefore
+merging the changes between them into the working
+directory need not change anything.  Therefore, there
+is no conflict.
+</p>
+<p><strong>WARNING: In versions of <small>CVS</small> prior to 1.12.2, there 
was a
+major problem with using &lsquo;<samp>-kk</samp>&rsquo; on merges.  Namely, 
&lsquo;<samp>-kk</samp>&rsquo;
+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 &lsquo;<samp>-kb</samp>&rsquo;).  Therefore, when a repository contained 
binary files,
+conflicts had to be dealt with manually rather than using 
&lsquo;<samp>-kk</samp>&rsquo; in
+a merge command.</strong>
+</p>
+<p>In <small>CVS</small> version 1.12.2 and later, the keyword expansion mode
+provided on the command line to any <small>CVS</small> command no longer
+overrides the &lsquo;<samp>-kb</samp>&rsquo; keyword expansion mode setting 
for binary
+files, though it will still override other default keyword expansion
+modes.  You can now safely merge using &lsquo;<samp>-kk</samp>&rsquo; to avoid 
spurious conflicts
+on lines containing RCS keywords, even when your repository contains
+binary files.
+</p>
+<hr size="6">
+<div id="Recursive-behavior"></div>
+<div id="SEC65"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC64| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC66| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC54| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC66| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== Recursive behavior ==
+
+<p>Almost all of the subcommands of <small>CVS</small> work
+recursively when you specify a directory as an
+argument.  For instance, consider this directory
+structure:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>      
<code>$HOME</code>
+        |
+        +--<tt>tc</tt>
+        |   |
+            +--<tt>CVS</tt>
+            |      (internal CVS files)
+            +--<tt>Makefile</tt>
+            +--<tt>backend.c</tt>
+            +--<tt>driver.c</tt>
+            +--<tt>frontend.c</tt>
+            +--<tt>parser.c</tt>
+            +--<tt>man</tt>
+            |    |
+            |    +--<tt>CVS</tt>
+            |    |  (internal CVS files)
+            |    +--<tt>tc.1</tt>
+            |
+            +--<tt>testing</tt>
+                 |
+                 +--<tt>CVS</tt>
+                 |  (internal CVS files)
+                 +--<tt>testpgm.t</tt>
+                 +--<tt>test2.t</tt>
+</nowiki></pre></td></tr></table>
+
+<p>If &lsquo;<tt>tc</tt>&rsquo; is the current working directory, the
+following is true:
+</p>
+<ul>
+<li>
+&lsquo;<samp>cvs update testing</samp>&rsquo; is equivalent to
+
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs update 
testing/testpgm.t testing/test2.t
+</nowiki></pre></td></tr></table>
+
+</li><li>
+&lsquo;<samp>cvs update testing man</samp>&rsquo; updates all files in the
+subdirectories
+
+</li><li>
+&lsquo;<samp>cvs update .</samp>&rsquo; or just &lsquo;<samp>cvs 
update</samp>&rsquo; updates
+all files in the <code>tc</code> directory
+</li></ul>
+
+<p>If no arguments are given to <code>update</code> it will
+update all files in the current working directory and
+all its subdirectories.  In other words, &lsquo;<tt>.</tt>&rsquo; is a
+default argument to <code>update</code>.  This is also true
+for most of the <small>CVS</small> subcommands, not only the
+<code>update</code> command.
+</p>
+<p>The recursive behavior of the <small>CVS</small> subcommands can be
+turned off with the &lsquo;<samp>-l</samp>&rsquo; option.
+Conversely, the &lsquo;<samp>-R</samp>&rsquo; option can be used to force 
recursion if
+&lsquo;<samp>-l</samp>&rsquo; is specified in &lsquo;<tt>~/.cvsrc</tt>&rsquo; 
(see section [[#SEC117|Default options and the ~/.cvsrc file]]).
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs update -l     
    # <span class="roman">Don't update files in subdirectories</span>
+</nowiki></pre></td></tr></table>
+
+<hr size="6">
+<div id="Adding-and-removing"></div>
+<div id="SEC66"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC65| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC67| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC65| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC75| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== Adding, removing, and renaming files and directories ==
+
+<p>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 <small>CVS</small> to record the
+fact that a change has taken place, just as with
+modifying an existing file.  The exact mechanisms to do
+this in <small>CVS</small> vary depending on the situation.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC67| Adding 
files]]::<nowiki>                Adding files
+</nowiki>&bull;[[#SEC68| Removing files]]::<nowiki>              Removing files
+</nowiki>&bull;[[#SEC69| Removing directories]]::<nowiki>        Removing 
directories
+</nowiki>&bull;[[#SEC70| Moving files]]::<nowiki>                Moving and 
renaming files
+</nowiki>&bull;[[#SEC74| Moving directories]]::<nowiki>          Moving and 
renaming directories
+</nowiki></pre>
+<hr size="6">
+<div id="Adding-files"></div>
+<div id="SEC67"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC66| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC68| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC66| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC66| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC75| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Adding files to a directory ===
+
+<p>To add a new file to a directory, follow these steps.
+</p>
+<ul>
+<li>
+You must have a working copy of the directory.
+See section [[#SEC5|Getting the source]].
+
+</li><li>
+Create the new file inside your working copy of the directory.
+
+</li><li>
+Use &lsquo;<samp>cvs add <var>filename</var></samp>&rsquo; to tell 
<small>CVS</small> that you
+want to version control the file.  If the file contains
+binary data, specify &lsquo;<samp>-kb</samp>&rsquo; (see section 
[[#SEC80|Handling binary files]]).
+
+</li><li>
+Use &lsquo;<samp>cvs commit <var>filename</var></samp>&rsquo; to actually check
+in the file into the repository.  Other developers
+cannot see the file until you perform this step.
+</li></ul>
+
+<p>You can also use the <code>add</code> command to add a new
+directory.
+</p>
+<p>Unlike most other commands, the <code>add</code> command is
+not recursive.  You cannot even type &lsquo;<samp>cvs add
+foo/bar</samp>&rsquo;!  Instead, you have to
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cd foo
+$ cvs add bar
+</nowiki></pre></td></tr></table>
+
+<div id="IDX129"></div>
+<dl>
+<dt><u>Command:</u> <b>cvs add</b><i> [<code>-k</code> kflag] [<code>-m</code> 
message] files &hellip;</i>
+<div id="IDX130"></div>
+</dt>
+<dd><p>Schedule <var>files</var> to be added to the repository.
+The files or directories specified with <code>add</code> 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 <code>import</code> command instead.  See section 
[[#SEC139|import&mdash;Import sources into CVS, using vendor branches]].
+</p>
+<p>The added files are not placed in the source repository
+until you use <code>commit</code> to make the change
+permanent.  Doing an <code>add</code> on a file that was
+removed with the <code>remove</code> command will undo the
+effect of the <code>remove</code>, unless a <code>commit</code>
+command intervened.  See section [[#SEC68|Removing files]], for an
+example.
+</p>
+<p>The &lsquo;<samp>-k</samp>&rsquo; option specifies the default way that
+this file will be checked out; for more information see
+[[#SEC102|Substitution modes]].
+</p>
+<p>The &lsquo;<samp>-m</samp>&rsquo; option specifies a description for the
+file.  This description appears in the history log (if
+it is enabled, see section [[#SEC178|The history file]]).  It will also be
+saved in the version history inside the repository when
+the file is committed.  The <code>log</code> command displays
+this description.  The description can be changed using
+&lsquo;<samp>admin -t</samp>&rsquo;.  See section 
[[#SEC120|admin&mdash;Administration]].  If you omit the
+&lsquo;<samp>-m <var>description</var></samp>&rsquo; flag, an empty string will
+be used.  You will not be prompted for a description.
+</p></dd></dl>
+
+<p>For example, the following commands add the file
+&lsquo;<tt>backend.c</tt>&rsquo; to the repository:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs add backend.c
+$ cvs commit -m &quot;Early version. Not yet compilable.&quot; backend.c
+</nowiki></pre></td></tr></table>
+
+<p>When you add a file it is added only on the branch
+which you are working on (see section [[#SEC54|Branching and merging]]).  You 
can
+later merge the additions to another branch if you want
+(see section [[#SEC63|Merging can add or remove files]]).
+</p>
+<hr size="6">
+<div id="Removing-files"></div>
+<div id="SEC68"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC67| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC69| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC66| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC66| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC75| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Removing files ===
+
+<p>Directories change.  New files are added, and old files
+disappear.  Still, you want to be able to retrieve an
+exact copy of old releases.
+</p>
+<p>Here is what you can do to remove a file,
+but remain able to retrieve old revisions:
+</p>
+<ul>
+<li>
+Make sure that you have not made any uncommitted
+modifications to the file.  See section [[#SEC8|Viewing differences]],
+for one way to do that.  You can also use the
+<code>status</code> or <code>update</code> 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.
+
+</li><li>
+Remove the file from your working copy of the directory.
+You can for instance use <code>rm</code>.
+
+</li><li>
+Use &lsquo;<samp>cvs remove <var>filename</var></samp>&rsquo; to tell 
<small>CVS</small> that
+you really want to delete the file.
+
+</li><li>
+Use &lsquo;<samp>cvs commit <var>filename</var></samp>&rsquo; to actually
+perform the removal of the file from the repository.
+</li></ul>
+
+<p>When you commit the removal of the file, <small>CVS</small>
+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.  <small>CVS</small> will correctly create or not create
+the file, based on the &lsquo;<samp>-r</samp>&rsquo; and 
&lsquo;<samp>-D</samp>&rsquo; options
+specified to <code>checkout</code> or <code>update</code>.
+</p>
+<div id="IDX131"></div>
+<dl>
+<dt><u>Command:</u> <b>cvs remove</b><i> [options] files &hellip;</i>
+<div id="IDX132"></div>
+</dt>
+<dd><p>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 [[#SEC156|Quick reference to CVS commands]].
+</p></dd></dl>
+
+<p>Here is an example of removing several files:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ 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 &quot;Removed unneeded files&quot;
+cvs commit: Examining .
+cvs commit: Committing .
+</nowiki></pre></td></tr></table>
+
+<p>As a convenience you can remove the file and <code>cvs
+remove</code> it in one step, by specifying the &lsquo;<samp>-f</samp>&rsquo;
+option.  For example, the above example could also be
+done like this:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ 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 &quot;Removed unneeded files&quot;
+cvs commit: Examining .
+cvs commit: Committing .
+</nowiki></pre></td></tr></table>
+
+<p>If you execute <code>remove</code> for a file, and then
+change your mind before you commit, you can undo the
+<code>remove</code> with an <code>add</code> command.
+</p>
+
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ 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
+</nowiki></pre></td></tr></table>
+
+<p>If you realize your mistake before you run the
+<code>remove</code> command you can use <code>update</code> to
+resurrect the file:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ rm oj.c
+$ cvs update oj.c
+cvs update: warning: oj.c was lost
+U oj.c
+</nowiki></pre></td></tr></table>
+
+<p>When you remove a file it is removed only on the branch
+which you are working on (see section [[#SEC54|Branching and merging]]).  You 
can
+later merge the removals to another branch if you want
+(see section [[#SEC63|Merging can add or remove files]]).
+</p>
+<hr size="6">
+<div id="Removing-directories"></div>
+<div id="SEC69"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC68| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC70| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC66| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC66| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC75| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Removing directories ===
+
+<p>In concept removing directories is somewhat similar to
+removing files&mdash;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.
+</p>
+<p>The way that you remove a directory is to remove all
+the files in it.  You don&rsquo;t remove the directory
+itself; there is no way to do that.
+Instead you specify the &lsquo;<samp>-P</samp>&rsquo; option to
+<code>cvs update</code> or <code>cvs checkout</code>,
+which will cause <small>CVS</small> to remove empty
+directories from working directories.
+(Note that <code>cvs export</code> always removes empty directories.)
+Probably the
+best way to do this is to always specify &lsquo;<samp>-P</samp>&rsquo;; if
+you want an empty directory then put a dummy file (for
+example &lsquo;<tt>.keepme</tt>&rsquo;) in it to prevent 
&lsquo;<samp>-P</samp>&rsquo; from
+removing it.
+</p>
+<p>Note that &lsquo;<samp>-P</samp>&rsquo; is implied by the 
&lsquo;<samp>-r</samp>&rsquo; or &lsquo;<samp>-D</samp>&rsquo;
+options of <code>checkout</code>.  This way
+<small>CVS</small> 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.
+</p>
+<hr size="6">
+<div id="Moving-files"></div>
+<div id="SEC70"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC69| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC71| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC66| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC66| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC75| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Moving and renaming files ===
+
+<p>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.  See section [[#SEC74|Moving and renaming 
directories]].).
+</p>
+<p>The examples below assume that the file <var>old</var> is renamed to
+<var>new</var>.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC71| 
Outside]]::<nowiki>                     The normal way to Rename
+</nowiki>&bull;[[#SEC72| Inside]]::<nowiki>                      A tricky, 
alternative way
+</nowiki>&bull;[[#SEC73| Rename by copying]]::<nowiki>           Another 
tricky, alternative way
+</nowiki></pre>
+<hr size="6">
+<div id="Outside"></div>
+<div id="SEC71"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC70| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC72| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC66| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC70| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC75| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== The Normal way to Rename ====
+
+
+<p>The normal way to move a file is to copy <var>old</var> to
+<var>new</var>, and then issue the normal <small>CVS</small> commands
+to remove <var>old</var> from the repository, and add
+<var>new</var> to it.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ mv <var>old</var> 
<var>new</var>
+$ cvs remove <var>old</var>
+$ cvs add <var>new</var>
+$ cvs commit -m &quot;Renamed <var>old</var> to <var>new</var>&quot; 
<var>old</var> <var>new</var>
+</nowiki></pre></td></tr></table>
+
+<p>This is the simplest way to move a file, it is not
+error-prone, and it preserves the history of what was
+done.  Note that to access the history of the file you
+must specify the old or the new name, depending on what
+portion of the history you are accessing.  For example,
+<code>cvs log <var>old</var></code> will give the log up until the
+time of the rename.
+</p>
+<p>When <var>new</var> is committed its revision numbers will
+start again, usually at 1.1, so if that bothers you,
+use the &lsquo;<samp>-r rev</samp>&rsquo; option to commit.  For more
+information see [[#SEC47|Assigning revisions]].
+</p>
+<hr size="6">
+<div id="Inside"></div>
+<div id="SEC72"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC71| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC73| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC66| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC70| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC75| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Moving the history file ====
+
+<p>This method is more dangerous, since it involves moving
+files inside the repository.  Read this entire section
+before trying it out!
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cd 
$CVSROOT/<var>dir</var>
+$ mv <var>old</var>,v <var>new</var>,v
+</nowiki></pre></td></tr></table>
+
+<p>Advantages:
+</p>
+<ul>
+<li>
+The log of changes is maintained intact.
+
+</li><li>
+The revision numbers are not affected.
+</li></ul>
+
+<p>Disadvantages:
+</p>
+<ul>
+<li>
+Old releases cannot easily be fetched from the
+repository.  (The file will show up as <var>new</var> even
+in revisions from the time before it was renamed).
+
+</li><li>
+There is no log information of when the file was renamed.
+
+</li><li>
+Nasty things might happen if someone accesses the history file
+while you are moving it.  Make sure no one else runs any of the 
<small>CVS</small>
+commands while you move it.
+</li></ul>
+
+<hr size="6">
+<div id="Rename-by-copying"></div>
+<div id="SEC73"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC72| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC74| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC66| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC70| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC75| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Copying the history file ====
+
+<p>This way also involves direct modifications to the
+repository.  It is safe, but not without drawbacks.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki># <span 
class="roman">Copy the RCS file inside the repository</span>
+$ cd $CVSROOT/<var>dir</var>
+$ cp <var>old</var>,v <var>new</var>,v
+# <span class="roman">Remove the old file</span>
+$ cd ~/<var>dir</var>
+$ rm <var>old</var>
+$ cvs remove <var>old</var>
+$ cvs commit <var>old</var>
+# <span class="roman">Remove all tags from <var>new</var></span>
+$ cvs update <var>new</var>
+$ cvs log <var>new</var>             # <span class="roman">Remember the 
non-branch tag names</span>
+$ cvs tag -d <var>tag1</var> <var>new</var>
+$ cvs tag -d <var>tag2</var> <var>new</var>
+&hellip;
+</nowiki></pre></td></tr></table>
+
+<p>By removing the tags you will be able to check out old
+revisions.
+</p>
+<p>Advantages:
+</p>
+<ul>
+<li>
+Checking out old revisions works correctly, as long as
+you use &lsquo;<samp>-r<var>tag</var></samp>&rsquo; and not 
&lsquo;<samp>-D<var>date</var></samp>&rsquo;
+to retrieve the revisions.
+
+</li><li>
+The log of changes is maintained intact.
+
+</li><li>
+The revision numbers are not affected.
+</li></ul>
+
+<p>Disadvantages:
+</p>
+<ul>
+<li>
+You cannot easily see the history of the file across the rename.
+
+</li></ul>
+
+<hr size="6">
+<div id="Moving-directories"></div>
+<div id="SEC74"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC73| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC75| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC66| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC66| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC75| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Moving and renaming directories ===
+
+<p>The normal way to rename or move a directory is to
+rename or move each file within it as described in
+[[#SEC71|The Normal way to Rename]].  Then check out with the 
&lsquo;<samp>-P</samp>&rsquo;
+option, as described in [[#SEC69|Removing directories]].
+</p>
+<p>If you really want to hack the repository to rename or
+delete a directory in the repository, you can do it
+like this:
+</p>
+<ol>
+<li>
+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.
+
+</li><li>
+Rename the directory inside the repository.
+
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cd 
$CVSROOT/<var>parent-dir</var>
+$ mv <var>old-dir</var> <var>new-dir</var>
+</nowiki></pre></td></tr></table>
+
+</li><li>
+Fix the <small>CVS</small> administrative files, if necessary (for
+instance if you renamed an entire module).
+
+</li><li>
+Tell everyone that they can check out again and continue
+working.
+
+</li></ol>
+
+<p>If someone had a working copy the <small>CVS</small> commands will
+cease to work for him, until he removes the directory
+that disappeared inside the repository.
+</p>
+<p>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.
+</p>
+<hr size="6">
+<div id="History-browsing"></div>
+<div id="SEC75"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC74| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC76| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC66| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC80| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== History browsing ==
+
+
+<p>Once you have used <small>CVS</small> to store a version control
+history&mdash;what files have changed when, how, and by
+whom, there are a variety of mechanisms for looking
+through the history.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC76| log 
messages]]::<nowiki>                Log messages
+</nowiki>&bull;[[#SEC77| history database]]::<nowiki>            The history 
database
+</nowiki>&bull;[[#SEC78| user-defined logging]]::<nowiki>        User-defined 
logging
+</nowiki>&bull;[[#SEC79| annotate]]::<nowiki>                    What revision 
modified each line of a file?
+</nowiki></pre>
+<hr size="6">
+<div id="log-messages"></div>
+<div id="SEC76"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC75| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC77| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC75| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC75| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC80| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Log messages ===
+
+<p>Whenever you commit a file you specify a log message.
+</p>
+<p>To look through the log messages which have been
+specified for every revision which has been committed,
+use the <code>cvs log</code> command (see section [[#SEC143|log&mdash;Print 
out log information for files]]).
+</p>
+<hr size="6">
+<div id="history-database"></div>
+<div id="SEC77"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC76| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC78| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC75| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC75| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC80| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== The history database ===
+
+<p>You can use the history file (see section [[#SEC178|The history file]]) to
+log various <small>CVS</small> actions.  To retrieve the
+information from the history file, use the <code>cvs
+history</code> command (see section [[#SEC137|history&mdash;Show status of 
files and users]]).
+</p>
+<p>Note: you can control what is logged to this file by using the
+&lsquo;<samp>LogHistory</samp>&rsquo; keyword in the 
&lsquo;<tt>CVSROOT/config</tt>&rsquo; file
+(see section [[#SEC180|The CVSROOT/config configuration file]]).
+</p>
+
+<hr size="6">
+<div id="user_002ddefined-logging"></div>
+<div id="SEC78"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC77| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC79| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC75| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC75| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC80| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== User-defined logging ===
+
+<p>You can customize <small>CVS</small> 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 &lsquo;<tt>loginfo</tt>&rsquo; file (see section 
[[#SEC172|Loginfo]]).
+To log commits, checkouts, exports, and tags,
+respectively, you can also use the &lsquo;<samp>-i</samp>&rsquo;,
+&lsquo;<samp>-o</samp>&rsquo;, &lsquo;<samp>-e</samp>&rsquo;, and 
&lsquo;<samp>-t</samp>&rsquo; options in the
+modules file.  For a more flexible way of giving
+notifications to various users, which requires less in
+the way of keeping centralized scripts up to date, use
+the <code>cvs watch add</code> command (see section [[#SEC91|Telling CVS to 
notify you]]); this command is useful even if you are not
+using <code>cvs watch on</code>.
+</p>
+<div id="IDX133"></div>
+<div id="IDX134"></div>
+<p>The &lsquo;<tt>taginfo</tt>&rsquo; file defines programs to execute
+when someone executes a <code>tag</code> or <code>rtag</code>
+command.  The &lsquo;<tt>taginfo</tt>&rsquo; file has the standard form
+for administrative files (see section [[#SEC157|Reference manual for 
Administrative files]]), where each line is a regular expression
+followed by a command to execute.  The arguments passed
+to the command are, in order, the <var>tagname</var>,
+<var>operation</var> (<code>add</code> for <code>tag</code>,
+<code>mov</code> for <code>tag -F</code>, and <code>del</code> for
+<code>tag -d</code>), <var>repository</var>, and any remaining are
+pairs of <var>filename</var> <var>revision</var>.  A non-zero
+exit of the filter program will cause the tag to be
+aborted.
+</p>
+<p>Here is an example of using taginfo to log tag and rtag
+commands.  In the taginfo file put:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>ALL 
/usr/local/cvsroot/CVSROOT/loggit
+</nowiki></pre></td></tr></table>
+
+<p>Where &lsquo;<tt>/usr/local/cvsroot/CVSROOT/loggit</tt>&rsquo; contains the
+following script:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>#!/bin/sh
+echo &quot;$@&quot; &gt;&gt;/home/kingdon/cvsroot/CVSROOT/taglog
+</nowiki></pre></td></tr></table>
+
+<hr size="6">
+<div id="annotate"></div>
+<div id="SEC79"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC78| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC80| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC75| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC75| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC80| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Annotate command ===
+
+<dl>
+<dt><u>Command:</u> <b>cvs annotate</b><i> [<code>-FflR</code>] [<code>-r 
rev</code>|<code>-D date</code>] files &hellip;</i>
+<div id="IDX135"></div>
+</dt>
+<dd><p>For each file in <var>files</var>, print the head revision
+of the trunk, together with information on the last
+modification for each line.  For example:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs annotate 
ssfile
+Annotations for ssfile
+***************
+1.1          (mary     27-Mar-96): ssfile line 1
+1.2          (joe      28-Mar-96): ssfile line 2
+</nowiki></pre></td></tr></table>
+
+<p>The file &lsquo;<tt>ssfile</tt>&rsquo; currently contains two lines.
+The <code>ssfile line 1</code> line was checked in by
+<code>mary</code> on March 27.  Then, on March 28, <code>joe</code>
+added a line <code>ssfile line 2</code>, without modifying
+the <code>ssfile line 1</code> line.  This report doesn&rsquo;t
+tell you anything about lines which have been deleted
+or replaced; you need to use <code>cvs diff</code> for that
+(see section [[#SEC130|diff&mdash;Show differences between revisions]]).
+</p>
+</dd></dl>
+
+<p>The options to <code>cvs annotate</code> are listed in
+[[#SEC156|Quick reference to CVS commands]], and can be used to select the 
files
+and revisions to annotate.  The options are described
+in more detail there and in [[#SEC119|Common command options]].
+</p>
+
+<hr size="6">
+<div id="Binary-files"></div>
+<div id="SEC80"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC79| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC81| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC75| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC83| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== Handling binary files ==
+
+<p>The most common use for <small>CVS</small> is to store text
+files.  With text files, <small>CVS</small> 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, <small>CVS</small> can store binary files.  For
+example, one might store a web site in <small>CVS</small>
+including both text files and binary images.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC81| Binary 
why]]::<nowiki>     More details on issues with binary files
+</nowiki>&bull;[[#SEC82| Binary howto]]::<nowiki>   How to store them
+</nowiki></pre>
+<hr size="6">
+<div id="Binary-why"></div>
+<div id="SEC81"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC80| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC82| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC80| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC80| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC83| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== The issues with binary files ===
+
+<p>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.
+</p>
+<p>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,
+<small>CVS</small> provides this functionality via the <code>cvs
+diff</code> command.  For binary files, it may be possible to
+extract the two revisions and then compare them with a
+tool external to <small>CVS</small> (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.
+</p>
+<p>Another ability of a version control system is the
+ability to merge two revisions.  For <small>CVS</small> this
+happens in two contexts.  The first is when users make
+changes in separate working directories
+(see section [[#SEC83|Multiple developers]]).  The second is when one
+merges explicitly with the &lsquo;<samp>update -j</samp>&rsquo; command
+(see section [[#SEC54|Branching and merging]]).
+</p>
+<p>In the case of text
+files, <small>CVS</small> can merge changes made independently,
+and signal a conflict if the changes conflict.  With
+binary files, the best that <small>CVS</small> 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.
+</p>
+<p>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
+[[#SEC83|Multiple developers]].  To avoid the merges
+resulting from branches, restrict use of branches.
+</p>
+<hr size="6">
+<div id="Binary-howto"></div>
+<div id="SEC82"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC81| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC83| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC80| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC80| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC83| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== How to store binary files ===
+
+<p>There are two issues with using <small>CVS</small> to store
+binary files.  The first is that <small>CVS</small> 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).
+</p>
+<p>The second is that a binary file might happen to
+contain data which looks like a keyword (see section [[#SEC98|Keyword 
substitution]]), so keyword expansion must be turned
+off.
+</p>
+
+<p>The &lsquo;<samp>-kb</samp>&rsquo; option available with some 
<small>CVS</small>
+commands insures that neither line ending conversion
+nor keyword expansion will be done.
+</p>
+<p>Here is an example of how you can create a new file
+using the &lsquo;<samp>-kb</samp>&rsquo; flag:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ echo 
'$<i></i>Id$' &gt; kotest
+$ cvs add -kb -m&quot;A test file&quot; kotest
+$ cvs ci -m&quot;First checkin; contains a keyword&quot; kotest
+</nowiki></pre></td></tr></table>
+
+<p>If a file accidentally gets added without &lsquo;<samp>-kb</samp>&rsquo;,
+one can use the <code>cvs admin</code> command to recover.
+For example:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ echo 
'$<i></i>Id$' &gt; kotest
+$ cvs add -m&quot;A test file&quot; kotest
+$ cvs ci -m&quot;First checkin; contains a keyword&quot; kotest
+$ cvs admin -kb kotest
+$ cvs update -A kotest
+# <span class="roman">For non-unix systems:</span>
+# <span class="roman">Copy in a good copy of the file from outside CVS</span>
+$ cvs commit -m &quot;make it binary&quot; kotest
+</nowiki></pre></td></tr></table>
+
+<p>When you check in the file &lsquo;<tt>kotest</tt>&rsquo; the file is
+not preserved as a binary file, because you did not
+check it in as a binary file.  The <code>cvs
+admin -kb</code> 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
+<small>CVS</small> on a non-unix system), then you need to
+check in a new copy of the file, as shown by the
+<code>cvs commit</code> command above.
+On unix, the <code>cvs update -A</code> command suffices.
+(Note that you can use <code>cvs log</code> to determine the default keyword
+substitution method for a file and <code>cvs status</code> to determine
+the keyword substitution method for a working copy.)
+</p>
+<p>However, in using <code>cvs admin -k</code> 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,
+<small>CVS</small> 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.
+</p>
+<p>You can also set a default for whether <code>cvs add</code>
+and <code>cvs import</code> treat a file as binary based on
+its name; for example you could say that files who
+names end in &lsquo;<samp>.exe</samp>&rsquo; are binary.  See section 
[[#SEC165|The cvswrappers file]].
+There is currently no way to have <small>CVS</small> 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.
+</p>
+<hr size="6">
+<div id="Multiple-developers"></div>
+<div id="SEC83"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC82| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC84| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC80| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC96| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== Multiple developers ==
+
+<p>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 <em>file locking</em> or <em>reserved checkouts</em>, is
+to allow only one person to edit each file at a time.
+This is the only solution with some version control
+systems, including <small>RCS</small> and <small>SCCS</small>.  Currently
+the usual way to get reserved checkouts with <small>CVS</small>
+is the <code>cvs admin -l</code> command (see section [[#SEC121|admin 
options]]).  This is not as nicely integrated into
+<small>CVS</small> 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.
+</p>
+<p>The default model with <small>CVS</small> is known as
+<em>unreserved checkouts</em>.  In this model, developers
+can edit their own <em>working copy</em> 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 <small>CVS</small> commands to bring their working copy
+up to date with the repository revision.  This process
+is almost automatic.
+</p>
+<p><small>CVS</small> also supports mechanisms which facilitate
+various kinds of communication, without actually
+enforcing rules like reserved checkouts do.
+</p>
+<p>The rest of this chapter describes how these various
+models work, and some of the issues involved in
+choosing between them.
+</p>
+
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC84| File 
status]]::<nowiki>                 A file can be in several states
+</nowiki>&bull;[[#SEC85| Updating a file]]::<nowiki>             Bringing a 
file up-to-date
+</nowiki>&bull;[[#SEC86| Conflicts example]]::<nowiki>           An 
informative example
+</nowiki>&bull;[[#SEC87| Informing others]]::<nowiki>            To cooperate 
you must inform
+</nowiki>&bull;[[#SEC88| Concurrency]]::<nowiki>                 Simultaneous 
repository access
+</nowiki>&bull;[[#SEC89| Watches]]::<nowiki>                     Mechanisms to 
track who is editing files
+</nowiki>&bull;[[#SEC95| Choosing a model]]::<nowiki>            Reserved or 
unreserved checkouts?
+</nowiki></pre>
+<hr size="6">
+<div id="File-status"></div>
+<div id="SEC84"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC83| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC85| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC83| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC83| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC96| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== File status ===
+
+<p>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 <code>status</code> command, are:
+</p>
+<dl compact="compact">
+<dd><div id="IDX136"></div>
+</dd>
+<dt> Up-to-date</dt>
+<dd><p>The file is identical with the latest revision in the
+repository for the branch in use.
+</p>
+</dd>
+<dt> Locally Modified</dt>
+<dd><div id="IDX137"></div>
+<p>You have edited the file, and not yet committed your changes.
+</p>
+</dd>
+<dt> Locally Added</dt>
+<dd><div id="IDX138"></div>
+<p>You have added the file with <code>add</code>, and not yet
+committed your changes.
+</p>
+</dd>
+<dt> Locally Removed</dt>
+<dd><div id="IDX139"></div>
+<p>You have removed the file with <code>remove</code>, and not yet
+committed your changes.
+</p>
+</dd>
+<dt> Needs Checkout</dt>
+<dd><div id="IDX140"></div>
+<p>Someone else has committed a newer revision to the
+repository.  The name is slightly misleading; you will
+ordinarily use <code>update</code> rather than
+<code>checkout</code> to get that newer revision.
+</p>
+</dd>
+<dt> Needs Patch</dt>
+<dd><div id="IDX141"></div>
+<p>Like Needs Checkout, but the <small>CVS</small> server will send
+a patch rather than the entire file.  Sending a patch or
+sending an entire file accomplishes the same thing.
+</p>
+</dd>
+<dt> Needs Merge</dt>
+<dd><div id="IDX142"></div>
+<p>Someone else has committed a newer revision to the repository, and you
+have also made modifications to the file.
+</p>
+</dd>
+<dt> Unresolved Conflict</dt>
+<dd><div id="IDX143"></div>
+<p>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 <code>update</code> to complete.
+</p>
+</dd>
+<dt> File had conflicts on merge</dt>
+<dd><div id="IDX144"></div>
+<p>This is like Locally Modified, except that a previous
+<code>update</code> command gave a conflict.  If you have not
+already done so, you need to
+resolve the conflict as described in [[#SEC86|Conflicts example]].
+</p>
+</dd>
+<dt> Unknown</dt>
+<dd><div id="IDX145"></div>
+<p><small>CVS</small> doesn&rsquo;t know anything about this file.  For
+example, you have created a new file and have not run
+<code>add</code>.
+</p>
+</dd>
+</dl>
+
+<p>To help clarify the file status, <code>status</code> also
+reports the <code>Working revision</code> which is the
+revision that the file in the working directory derives
+from, and the <code>Repository revision</code> which is the
+latest revision in the repository for the branch in
+use.
+</p>
+<p>The options to <code>status</code> are listed in
+[[#SEC156|Quick reference to CVS commands]].  For information on its 
<code>Sticky tag</code>
+and <code>Sticky date</code> output, see [[#SEC53|Sticky tags]].
+For information on its <code>Sticky options</code> output,
+see the &lsquo;<samp>-k</samp>&rsquo; option in [[#SEC154|update options]].
+</p>
+<p>You can think of the <code>status</code> and <code>update</code>
+commands as somewhat complementary.  You use
+<code>update</code> to bring your files up to date, and you
+can use <code>status</code> to give you some idea of what an
+<code>update</code> would do (of course, the state of the
+repository might change before you actually run
+<code>update</code>).  In fact, if you want a command to
+display file status in a more brief format than is
+displayed by the <code>status</code> command, you can invoke
+</p>
+<div id="IDX146"></div>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs -n -q update
+</nowiki></pre></td></tr></table>
+
+<p>The &lsquo;<samp>-n</samp>&rsquo; option means to not actually do the
+update, but merely to display statuses; the &lsquo;<samp>-q</samp>&rsquo;
+option avoids printing the name of each directory.  For
+more information on the <code>update</code> command, and
+these options, see [[#SEC156|Quick reference to CVS commands]].
+</p>
+<hr size="6">
+<div id="Updating-a-file"></div>
+<div id="SEC85"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC84| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC86| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC83| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC83| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC96| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Bringing a file up to date ===
+
+<p>When you want to update or merge a file, use the <code>update</code>
+command.  For files that are not up to date this is roughly equivalent
+to a <code>checkout</code> command: the newest revision of the file is
+extracted from the repository and put in your working directory.
+</p>
+<p>Your modifications to a file are never lost when you
+use <code>update</code>.  If no newer revision exists,
+running <code>update</code> has no effect.  If you have
+edited the file, and a newer revision is available,
+<small>CVS</small> will merge all changes into your working copy.
+</p>
+<p>For instance, imagine that you checked out revision 1.4 and started
+editing it.  In the meantime someone else committed revision 1.5, and
+shortly after that revision 1.6.  If you run <code>update</code> on the file
+now, <small>CVS</small> will incorporate all changes between revision 1.4 and 
1.6 into
+your file.
+</p>
+<div id="IDX147"></div>
+<p>If any of the changes between 1.4 and 1.6 were made too
+close to any of the changes you have made, an
+<em>overlap</em> occurs.  In such cases a warning is
+printed, and the resulting file includes both
+versions of the lines that overlap, delimited by
+special markers.
+See section [[#SEC153|update&mdash;Bring work tree in sync with repository]], 
for a complete description of the
+<code>update</code> command.
+</p>
+<hr size="6">
+<div id="Conflicts-example"></div>
+<div id="SEC86"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC85| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC87| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC83| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC83| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC96| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Conflicts example ===
+
+<p>Suppose revision 1.4 of &lsquo;<tt>driver.c</tt>&rsquo; contains this:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>#include 
&lt;stdio.h&gt;
+
+void main()
+{
+    parse();
+    if (nerr == 0)
+        gencode();
+    else
+        fprintf(stderr, &quot;No code generated.\n&quot;);
+    exit(nerr == 0 ? 0 : 1);
+}
+</nowiki></pre></td></tr></table>
+
+<p>Revision 1.6 of &lsquo;<tt>driver.c</tt>&rsquo; contains this:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>#include 
&lt;stdio.h&gt;
+
+int main(int argc,
+         char **argv)
+{
+    parse();
+    if (argc != 1)
+    {
+        fprintf(stderr, &quot;tc: No args expected.\n&quot;);
+        exit(1);
+    }
+    if (nerr == 0)
+        gencode();
+    else
+        fprintf(stderr, &quot;No code generated.\n&quot;);
+    exit(!!nerr);
+}
+</nowiki></pre></td></tr></table>
+
+<p>Your working copy of &lsquo;<tt>driver.c</tt>&rsquo;, based on revision
+1.4, contains this before you run &lsquo;<samp>cvs update</samp>&rsquo;:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>#include 
&lt;stdlib.h&gt;
+#include &lt;stdio.h&gt;
+
+void main()
+{
+    init_scanner();
+    parse();
+    if (nerr == 0)
+        gencode();
+    else
+        fprintf(stderr, &quot;No code generated.\n&quot;);
+    exit(nerr == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+</nowiki></pre></td></tr></table>
+
+<p>You run &lsquo;<samp>cvs update</samp>&rsquo;:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ 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
+</nowiki></pre></td></tr></table>
+
+<div id="IDX148"></div>
+<p><small>CVS</small> tells you that there were some conflicts.
+Your original working file is saved unmodified in
+&lsquo;<tt>.#driver.c.1.4</tt>&rsquo;.  The new version of
+&lsquo;<tt>driver.c</tt>&rsquo; contains this:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>#include 
&lt;stdlib.h&gt;
+#include &lt;stdio.h&gt;
+
+int main(int argc,
+         char **argv)
+{
+    init_scanner();
+    parse();
+    if (argc != 1)
+    {
+        fprintf(stderr, &quot;tc: No args expected.\n&quot;);
+        exit(1);
+    }
+    if (nerr == 0)
+        gencode();
+    else
+        fprintf(stderr, &quot;No code generated.\n&quot;);
+&lt;&lt;&lt;&lt;&lt;&lt;&lt; driver.c
+    exit(nerr == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
+=======
+    exit(!!nerr);
+&gt;&gt;&gt;&gt;&gt;&gt;&gt; 1.6
+}
+</nowiki></pre></td></tr></table>
+
+<div id="IDX149"></div>
+<div id="IDX150"></div>
+<div id="IDX151"></div>
+<div id="IDX152"></div>
+<div id="IDX153"></div>
+
+<p>Note how all non-overlapping modifications are incorporated in your working
+copy, and that the overlapping section is clearly marked with
+&lsquo;<samp>&lt;&lt;&lt;&lt;&lt;&lt;&lt;</samp>&rsquo;, 
&lsquo;<samp>=======</samp>&rsquo; and 
&lsquo;<samp>&gt;&gt;&gt;&gt;&gt;&gt;&gt;</samp>&rsquo;.
+</p>
+<div id="IDX154"></div>
+<div id="IDX155"></div>
+<p>You resolve the conflict by editing the file, removing the markers and
+the erroneous line.  Suppose you end up with this file:
+</p><table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>#include 
&lt;stdlib.h&gt;
+#include &lt;stdio.h&gt;
+
+int main(int argc,
+         char **argv)
+{
+    init_scanner();
+    parse();
+    if (argc != 1)
+    {
+        fprintf(stderr, &quot;tc: No args expected.\n&quot;);
+        exit(1);
+    }
+    if (nerr == 0)
+        gencode();
+    else
+        fprintf(stderr, &quot;No code generated.\n&quot;);
+    exit(nerr == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+</nowiki></pre></td></tr></table>
+
+<p>You can now go ahead and commit this as revision 1.7.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs commit -m 
&quot;Initialize scanner. Use symbolic exit values.&quot; driver.c
+Checking in driver.c;
+/usr/local/cvsroot/yoyodyne/tc/driver.c,v  &lt;--  driver.c
+new revision: 1.7; previous revision: 1.6
+done
+</nowiki></pre></td></tr></table>
+
+<p>For your protection, <small>CVS</small> 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 <small>CVS</small>, you also needed to
+insure that the file contains no conflict markers.
+Because
+your file may legitimately contain conflict markers (that
+is, occurrences of &lsquo;<samp>&gt;&gt;&gt;&gt;&gt;&gt;&gt; </samp>&rsquo; at 
the start of a
+line that don&rsquo;t mark a conflict), the current
+version of <small>CVS</small> will print a warning and proceed to
+check in the file.
+</p>
+<div id="IDX156"></div>
+<p>If you use release 1.04 or later of pcl-cvs (a <small>GNU</small>
+Emacs front-end for <small>CVS</small>) you can use an Emacs
+package called emerge to help you resolve conflicts.
+See the documentation for pcl-cvs.
+</p>
+<hr size="6">
+<div id="Informing-others"></div>
+<div id="SEC87"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC86| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC88| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC83| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC83| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC96| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Informing others about commits ===
+
+<p>It is often useful to inform others when you commit a
+new revision of a file.  The &lsquo;<samp>-i</samp>&rsquo; option of the
+&lsquo;<tt>modules</tt>&rsquo; file, or the &lsquo;<tt>loginfo</tt>&rsquo; 
file, can be
+used to automate this process.  See section [[#SEC158|The modules file]].
+See section [[#SEC172|Loginfo]].  You can use these features of 
<small>CVS</small>
+to, for instance, instruct <small>CVS</small> to mail a
+message to all developers, or post a message to a local
+newsgroup.
+</p>
+<hr size="6">
+<div id="Concurrency"></div>
+<div id="SEC88"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC87| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC89| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC83| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC83| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC96| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Several developers simultaneously attempting to run CVS ===
+
+<p>If several developers try to run <small>CVS</small> at the same
+time, one may get the following message:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>[11:43:23] waiting 
for bach's lock in /usr/local/cvsroot/foo
+</nowiki></pre></td></tr></table>
+
+<div id="IDX157"></div>
+<div id="IDX158"></div>
+<div id="IDX159"></div>
+<p><small>CVS</small> 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&rsquo;t running a cvs
+command, look in the repository directory mentioned in
+the message and remove files which they own whose names
+start with &lsquo;<tt>#cvs.rfl</tt>&rsquo;,
+&lsquo;<tt>#cvs.wfl</tt>&rsquo;, or &lsquo;<tt>#cvs.lock</tt>&rsquo;.
+</p>
+<p>Note that these locks are to protect <small>CVS</small>&rsquo;s
+internal data structures and have no relationship to
+the word <em>lock</em> in the sense used by
+<small>RCS</small>&mdash;which refers to reserved checkouts
+(see section [[#SEC83|Multiple developers]]).
+</p>
+<p>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.
+</p>
+<div id="IDX160"></div>
+<div id="IDX161"></div>
+<p>One might hope for the following property:
+</p>
+<blockquote><p>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.
+</p></blockquote>
+
+<p>but <small>CVS</small> does <em>not</em> have this property.  For
+example, given the files
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>a/one.c
+a/two.c
+b/three.c
+b/four.c
+</nowiki></pre></td></tr></table>
+
+<p>if someone runs
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs ci a/two.c 
b/three.c
+</nowiki></pre></td></tr></table>
+
+<p>and someone else runs <code>cvs update</code> at the same
+time, the person running <code>update</code> might get only
+the change to &lsquo;<tt>b/three.c</tt>&rsquo; and not the change to
+&lsquo;<tt>a/two.c</tt>&rsquo;.
+</p>
+<hr size="6">
+<div id="Watches"></div>
+<div id="SEC89"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC88| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC90| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC83| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC83| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC96| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Mechanisms to track who is editing files ===
+
+<p>For many groups, use of <small>CVS</small> 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.
+</p>
+<p>For maximum benefit developers should use <code>cvs
+edit</code> (not <code>chmod</code>) to make files read-write to
+edit them, and <code>cvs release</code> (not <code>rm</code>) to
+discard a working directory which is no longer in use,
+but <small>CVS</small> is not able to enforce this behavior.
+</p>
+
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC90| Setting a 
watch]]::<nowiki>             Telling CVS to watch certain files
+</nowiki>&bull;[[#SEC91| Getting Notified]]::<nowiki>            Telling CVS 
to notify you
+</nowiki>&bull;[[#SEC92| Editing files]]::<nowiki>               How to edit a 
file which is being watched
+</nowiki>&bull;[[#SEC93| Watch information]]::<nowiki>           Information 
about who is watching and editing
+</nowiki>&bull;[[#SEC94| Watches Compatibility]]::<nowiki>       Watches 
interact poorly with CVS 1.6 or earlier
+</nowiki></pre>
+<hr size="6">
+<div id="Setting-a-watch"></div>
+<div id="SEC90"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC89| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC91| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC83| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC89| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC96| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Telling CVS to watch certain files ====
+
+<p>To enable the watch features, you first specify that
+certain files are to be watched.
+</p>
+<div id="IDX162"></div>
+<dl>
+<dt><u>Command:</u> <b>cvs watch on</b><i> [<code>-lR</code>] 
[<var>files</var>]&hellip;</i>
+<div id="IDX163"></div>
+</dt>
+<dd><div id="IDX164"></div>
+<p>Specify that developers should run <code>cvs edit</code>
+before editing <var>files</var>.  <small>CVS</small> will create working
+copies of <var>files</var> read-only, to remind developers
+to run the <code>cvs edit</code> command before working on
+them.
+</p>
+<p>If <var>files</var> includes the name of a directory, <small>CVS</small>
+arranges to watch all files added to the corresponding
+repository directory, and sets a default for files
+added in the future; this allows the user to set
+notification policies on a per-directory basis.  The
+contents of the directory are processed recursively,
+unless the <code>-l</code> option is given.
+The <code>-R</code> option can be used to force recursion if the 
<code>-l</code>
+option is set in &lsquo;<tt>~/.cvsrc</tt>&rsquo; (see section 
[[#SEC117|Default options and the ~/.cvsrc file]]).
+</p>
+<p>If <var>files</var> is omitted, it defaults to the current directory.
+</p>
+<div id="IDX165"></div>
+</dd></dl>
+
+<dl>
+<dt><u>Command:</u> <b>cvs watch off</b><i> [<code>-lR</code>] 
[<var>files</var>]&hellip;</i>
+<div id="IDX166"></div>
+</dt>
+<dd><p>Do not create <var>files</var> read-only on checkout; thus,
+developers will not be reminded to use <code>cvs edit</code>
+and <code>cvs unedit</code>.
+</p>
+<p>The <var>files</var> and options are processed as for <code>cvs
+watch on</code>.
+</p>
+</dd></dl>
+
+<hr size="6">
+<div id="Getting-Notified"></div>
+<div id="SEC91"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC90| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC92| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC83| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC89| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC96| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Telling CVS to notify you ====
+
+<p>You can tell <small>CVS</small> that you want to receive
+notifications about various actions taken on a file.
+You can do this without using <code>cvs watch on</code> for
+the file, but generally you will want to use <code>cvs
+watch on</code>, to remind developers to use the <code>cvs edit</code>
+command.
+</p>
+<div id="IDX167"></div>
+<dl>
+<dt><u>Command:</u> <b>cvs watch add</b><i> [<code>-lR</code>] 
[<code>-a</code> <var>action</var>]&hellip; [<var>files</var>]&hellip;</i>
+<div id="IDX168"></div>
+</dt>
+<dd><p>Add the current user to the list of people to receive notification of
+work done on <var>files</var>.
+</p>
+<p>The <code>-a</code> option specifies what kinds of events 
<small>CVS</small> should notify
+the user about.  <var>action</var> is one of the following:
+</p>
+<dl compact="compact">
+<dt> <code>edit</code></dt>
+<dd><p>Another user has applied the <code>cvs edit</code> command (described
+below) to a watched file.
+</p>
+</dd>
+<dt> <code>commit</code></dt>
+<dd><p>Another user has committed changes to one of the named <var>files</var>.
+</p>
+</dd>
+<dt> <code>unedit</code></dt>
+<dd><p>Another user has abandoned editing a file (other than by committing 
changes).
+They can do this in several ways, by:
+</p>
+<ul>
+<li>
+applying the <code>cvs unedit</code> command (described below) to the file
+
+</li><li>
+applying the <code>cvs release</code> command (see section 
[[#SEC149|release&mdash;Indicate that a Module is no longer in use]]) to the 
file&rsquo;s parent directory
+(or recursively to a directory more than one level up)
+
+</li><li>
+deleting the file and allowing <code>cvs update</code> to recreate it
+
+</li></ul>
+
+</dd>
+<dt> <code>all</code></dt>
+<dd><p>All of the above.
+</p>
+</dd>
+<dt> <code>none</code></dt>
+<dd><p>None of the above.  (This is useful with <code>cvs edit</code>,
+described below.)
+</p>
+</dd>
+</dl>
+
+<p>The <code>-a</code> option may appear more than once, or not at all.  If
+omitted, the action defaults to <code>all</code>.
+</p>
+<p>The <var>files</var> and options are processed as for
+<code>cvs watch on</code>.
+</p>
+</dd></dl>
+
+
+<div id="IDX169"></div>
+<dl>
+<dt><u>Command:</u> <b>cvs watch remove</b><i> [<code>-lR</code>] 
[<code>-a</code> <var>action</var>]&hellip; [<var>files</var>]&hellip;</i>
+<div id="IDX170"></div>
+</dt>
+<dd><p>Remove a notification request established using <code>cvs watch 
add</code>;
+the arguments are the same.  If the <code>-a</code> option is present, only
+watches for the specified actions are removed.
+</p>
+</dd></dl>
+
+<div id="IDX171"></div>
+<p>When the conditions exist for notification, <small>CVS</small>
+calls the &lsquo;<tt>notify</tt>&rsquo; administrative file.  Edit
+&lsquo;<tt>notify</tt>&rsquo; as one edits the other administrative
+files (see section [[#SEC20|The administrative files]]).  This
+file follows the usual conventions for administrative
+files (see section [[#SEC167|The common syntax]]), where each line is a regular
+expression followed by a command to execute.  The
+command should contain a single occurrence of &lsquo;<samp>%s</samp>&rsquo;
+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 <code>notify</code> file is the
+single line:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>ALL mail %s -s 
&quot;CVS notification&quot;
+</nowiki></pre></td></tr></table>
+
+<p>This causes users to be notified by electronic mail.
+</p>
+<div id="IDX172"></div>
+<p>Note that if you set this up in the straightforward
+way, users receive notifications on the server machine.
+One could of course write a &lsquo;<tt>notify</tt>&rsquo; script which
+directed notifications elsewhere, but to make this
+easy, <small>CVS</small> allows you to associate a notification
+address for each user.  To do so create a file
+&lsquo;<tt>users</tt>&rsquo; in &lsquo;<tt>CVSROOT</tt>&rsquo; with a line for 
each
+user in the format <var>user</var>:<var>value</var>.  Then
+instead of passing the name of the user to be notified
+to &lsquo;<tt>notify</tt>&rsquo;, <small>CVS</small> will pass the 
<var>value</var>
+(normally an email address on some other machine).
+</p>
+<p><small>CVS</small> 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.
+</p>
+<hr size="6">
+<div id="Editing-files"></div>
+<div id="SEC92"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC91| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC93| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC83| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC89| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC96| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== How to edit a file which is being watched ====
+
+<p>Since a file which is being watched is checked out
+read-only, you cannot simply edit it.  To make it
+read-write, and inform others that you are planning to
+edit it, use the <code>cvs edit</code> command.  Some systems
+call this a <em>checkout</em>, but <small>CVS</small> uses that term
+for obtaining a copy of the sources (see section [[#SEC5|Getting the 
source]]), an operation which those systems call a
+<em>get</em> or a <em>fetch</em>.
+</p>
+<div id="IDX173"></div>
+<dl>
+<dt><u>Command:</u> <b>cvs edit</b><i> [<code>-lR</code>] [<code>-a</code> 
<var>action</var>]&hellip; [<var>files</var>]&hellip;</i>
+<div id="IDX174"></div>
+</dt>
+<dd><p>Prepare to edit the working files <var>files</var>.  <small>CVS</small> 
makes the
+<var>files</var> read-write, and notifies users who have requested
+<code>edit</code> notification for any of <var>files</var>.
+</p>
+<p>The <code>cvs edit</code> command accepts the same options as the
+<code>cvs watch add</code> command, and establishes a temporary watch for the
+user on <var>files</var>; <small>CVS</small> will remove the watch when 
<var>files</var> are
+<code>unedit</code>ed or <code>commit</code>ted.  If the user does not wish to
+receive notifications, she should specify <code>-a none</code>.
+</p>
+<p>The <var>files</var> and the options are processed as for the <code>cvs
+watch</code> commands.
+</p>
+
+</dd></dl>
+
+<p>Normally when you are done with a set of changes, you
+use the <code>cvs commit</code> command, which checks in your
+changes and returns the watched files to their usual
+read-only state.  But if you instead decide to abandon
+your changes, or not to make any changes, you can use
+the <code>cvs unedit</code> command.
+</p>
+<div id="IDX175"></div>
+<div id="IDX176"></div>
+<div id="IDX177"></div>
+<dl>
+<dt><u>Command:</u> <b>cvs unedit</b><i> [<code>-lR</code>] 
[<var>files</var>]&hellip;</i>
+<div id="IDX178"></div>
+</dt>
+<dd><p>Abandon work on the working files <var>files</var>, and revert them to 
the
+repository versions on which they are based.  <small>CVS</small> makes those
+<var>files</var> read-only for which users have requested notification using
+<code>cvs watch on</code>.  <small>CVS</small> notifies users who have 
requested <code>unedit</code>
+notification for any of <var>files</var>.
+</p>
+<p>The <var>files</var> and options are processed as for the
+<code>cvs watch</code> commands.
+</p>
+<p>If watches are not in use, the <code>unedit</code> command
+probably does not work, and the way to revert to the
+repository version is with the command <code>cvs update -C file</code>
+(see section [[#SEC153|update&mdash;Bring work tree in sync with repository]]).
+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.
+</p></dd></dl>
+
+<p>When using client/server <small>CVS</small>, you can use the
+<code>cvs edit</code> and <code>cvs unedit</code> commands even if
+<small>CVS</small> is unable to successfully communicate with the
+server; the notifications will be sent upon the next
+successful <small>CVS</small> command.
+</p>
+<hr size="6">
+<div id="Watch-information"></div>
+<div id="SEC93"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC92| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC94| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC83| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC89| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC96| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Information about who is watching and editing ====
+
+<dl>
+<dt><u>Command:</u> <b>cvs watchers</b><i> [<code>-lR</code>] 
[<var>files</var>]&hellip;</i>
+<div id="IDX179"></div>
+</dt>
+<dd><p>List the users currently watching changes to <var>files</var>.  The 
report
+includes the files being watched, and the mail address of each watcher.
+</p>
+<p>The <var>files</var> and options are processed as for the
+<code>cvs watch</code> commands.
+</p>
+</dd></dl>
+
+
+<div id="IDX180"></div>
+<dl>
+<dt><u>Command:</u> <b>cvs editors</b><i> [<code>-lR</code>] 
[<var>files</var>]&hellip;</i>
+<div id="IDX181"></div>
+</dt>
+<dd><p>List the users currently working on <var>files</var>.  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.
+</p>
+<p>The <var>files</var> and options are processed as for the
+<code>cvs watch</code> commands.
+</p>
+</dd></dl>
+
+<hr size="6">
+<div id="Watches-Compatibility"></div>
+<div id="SEC94"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC93| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC95| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC83| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC89| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC96| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Using watches with old versions of CVS ====
+
+<p>If you use the watch features on a repository, it
+creates &lsquo;<tt>CVS</tt>&rsquo; directories in the repository and
+stores the information about watches in that directory.
+If you attempt to use <small>CVS</small> 1.6 or earlier with the
+repository, you get an error message such as the
+following (all on one line):
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs update: cannot 
open CVS/Entries for reading:
+No such file or directory
+</nowiki></pre></td></tr></table>
+
+<p>and your operation will likely be aborted.  To use the
+watch features, you must upgrade all copies of <small>CVS</small>
+which use that repository in local or server mode.  If
+you cannot upgrade, use the <code>watch off</code> and
+<code>watch remove</code> commands to remove all watches, and
+that will restore the repository to a state which
+<small>CVS</small> 1.6 can cope with.
+</p>
+<hr size="6">
+<div id="Choosing-a-model"></div>
+<div id="SEC95"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC94| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC96| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC83| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC83| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC96| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Choosing between reserved or unreserved checkouts ===
+
+<p>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&rsquo; working
+styles, but here is a brief description of some of the
+issues.  There are many ways to organize a team of
+developers.  <small>CVS</small> does not try to enforce a certain
+organization.  It is a tool that can be used in several
+ways.
+</p>
+<p>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.
+</p>
+<p>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.
+</p>
+<p>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 <em>any</em> source management regimen, developers
+must agree on the general design of the system; given this agreement,
+overlapping changes are usually straightforward to merge.
+</p>
+<p>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.
+</p>
+<p>The watches features described above in [[#SEC89|Mechanisms to track who is 
editing files]]
+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.
+</p>
+<hr size="6">
+<div id="Revision-management"></div>
+<div id="SEC96"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC95| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC97| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC83| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC98| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== Revision management ==
+
+
+<p>If you have read this far, you probably have a pretty
+good grasp on what <small>CVS</small> can do for you.  This
+chapter talks a little about things that you still have
+to decide.
+</p>
+<p>If you are doing development on your own using <small>CVS</small>
+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.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC97| When to 
commit]]::<nowiki>              Some discussion on the subject
+</nowiki></pre>
+<hr size="6">
+<div id="When-to-commit"></div>
+<div id="SEC97"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC96| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC98| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC96| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC96| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC98| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== When to commit? ===
+
+<p>Your group should decide which policy to use regarding
+commits.  Several policies are possible, and as your
+experience with <small>CVS</small> grows you will probably find
+out what works for you.
+</p>
+<p>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.
+</p>
+<p>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
+(see section [[#SEC168|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.
+</p>
+<hr size="6">
+<div id="Keyword-substitution"></div>
+<div id="SEC98"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC97| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC99| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC96| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC105| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== Keyword substitution ==
+
+
+<p>As long as you edit source files inside a working
+directory you can always find out the state of
+your files via &lsquo;<samp>cvs status</samp>&rsquo; and &lsquo;<samp>cvs 
log</samp>&rsquo;.
+But as soon as you export the files from your
+development environment it becomes harder to identify
+which revisions they are.
+</p>
+<p><small>CVS</small> can use a mechanism known as <em>keyword
+substitution</em> (or <em>keyword expansion</em>) to help
+identifying the files.  Embedded strings of the form
+<code>$<var>keyword</var>$</code> and
+<code>$<var>keyword</var>:&hellip;$</code> in a file are replaced
+with strings of the form
+<code>$<var>keyword</var>:<var>value</var>$</code> whenever you obtain
+a new revision of the file.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC99| Keyword 
list]]::<nowiki>                   Keywords
+</nowiki>&bull;[[#SEC100| Using keywords]]::<nowiki>                 Using 
keywords
+</nowiki>&bull;[[#SEC101| Avoiding substitution]]::<nowiki>          Avoiding 
substitution
+</nowiki>&bull;[[#SEC102| Substitution modes]]::<nowiki>             
Substitution modes
+</nowiki>&bull;[[#SEC103| Configuring keyword expansion]]::<nowiki>  
Configuring keyword expansion
+</nowiki>&bull;[[#SEC104| Log keyword]]::<nowiki>                    Problems 
with the $<i></i>Log$ keyword.
+</nowiki></pre>
+<hr size="6">
+<div id="Keyword-list"></div>
+<div id="SEC99"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC98| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC100| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC98| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC98| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC105| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Keyword List ===
+
+
+<p>This is a list of the keywords:
+</p>
+<dl compact="compact">
+<dd><div id="IDX182"></div>
+</dd>
+<dt> <code>$<i></i>Author$</code></dt>
+<dd><p>The login name of the user who checked in the revision.
+</p>
+<div id="IDX183"></div>
+</dd>
+<dt> <code>$<i></i>CVSHeader</code></dt>
+<dd><p>A standard header (similar to $<i></i>Header$, but with
+the CVS root stripped off). It contains the relative
+pathname of the <small>RCS</small> 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 <small>CVS</small>.
+</p>
+<p>Note that this keyword has only been recently
+introduced to <small>CVS</small> and may cause problems with
+existing installations if $<i></i>CVSHeader$ is already
+in the files for a different purpose. This keyword may
+be excluded using the <code>KeywordExpansion=eCVSHeader</code>
+in the &lsquo;<tt>CVSROOT/config</tt>&rsquo; file. 
+See [[#SEC103|Configuring Keyord Expansion]] for more details.
+</p>
+<div id="IDX184"></div>
+</dd>
+<dt> <code>$<i></i>Date$</code></dt>
+<dd><p>The date and time (UTC) the revision was checked in.
+</p>
+<div id="IDX185"></div>
+</dd>
+<dt> <code>$<i></i>Header$</code></dt>
+<dd><p>A standard header containing the full pathname of the
+<small>RCS</small> 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 <small>CVS</small>.
+</p>
+<div id="IDX186"></div>
+</dd>
+<dt> <code>$<i></i>Id$</code></dt>
+<dd><p>Same as <code>$<i></i>Header$</code>, except that the <small>RCS</small>
+filename is without a path.
+</p>
+<div id="IDX187"></div>
+</dd>
+<dt> <code>$<i></i>Name$</code></dt>
+<dd><p>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 <code>cvs
+co -r first</code>, the keyword expands to &lsquo;<samp>Name: 
first</samp>&rsquo;.
+</p>
+<div id="IDX188"></div>
+</dd>
+<dt> <code>$<i></i>Locker$</code></dt>
+<dd><p>The login name of the user who locked the revision
+(empty if not locked, which is the normal case unless
+<code>cvs admin -l</code> is in use).
+</p>
+<div id="IDX189"></div>
+</dd>
+<dt> <code>$<i></i>Log$</code></dt>
+<dd><p>The log message supplied during commit, preceded by a
+header containing the <small>RCS</small> filename, the revision
+number, the author, and the date (UTC).  Existing log
+messages are <em>not</em> replaced.  Instead, the new log
+message is inserted after <code>$<i></i>Log:&hellip;$</code>.
+Each new line is prefixed with the same string which
+precedes the <code>$Log</code> keyword.  For example, if the
+file contains:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>  /* Here is what 
people have been up to:
+   *
+   * $<i></i>Log: frob.c,v $
+   * Revision 1.1  1997/01/03 14:23:51  joe
+   * Add the superfrobnicate option
+   *
+   */
+</nowiki></pre></td></tr></table>
+
+<p>then additional lines which are added when expanding
+the <code>$Log</code> keyword will be preceded by &lsquo;<samp>   * 
</samp>&rsquo;.
+Unlike previous versions of <small>CVS</small> and <small>RCS</small>, the
+<em>comment leader</em> from the <small>RCS</small> file is not used.
+The <code>$Log</code> keyword is useful for
+accumulating a complete change log in a source file,
+but for several reasons it can be problematic.
+See section [[#SEC104|Problems with the $<i></i>Log$ keyword.]].
+</p>
+<div id="IDX190"></div>
+</dd>
+<dt> <code>$<i></i>RCSfile$</code></dt>
+<dd><p>The name of the RCS file without a path.
+</p>
+<div id="IDX191"></div>
+</dd>
+<dt> <code>$<i></i>Revision$</code></dt>
+<dd><p>The revision number assigned to the revision.
+</p>
+<div id="IDX192"></div>
+</dd>
+<dt> <code>$<i></i>Source$</code></dt>
+<dd><p>The full pathname of the RCS file.
+</p>
+<div id="IDX193"></div>
+</dd>
+<dt> <code>$<i></i>State$</code></dt>
+<dd><p>The state assigned to the revision.  States can be
+assigned with <code>cvs admin -s</code>&mdash;see [[#SEC121|admin options]].
+</p>
+<div id="IDX194"></div>
+</dd>
+<dt> <code>Local keyword</code></dt>
+<dd><p>The <code>LocalKeyword</code> option in the 
&lsquo;<tt>CVSROOT/config</tt>&rsquo; 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 &lsquo;<tt>CVSROOT/config</tt>&rsquo; file contains
+a line with <code>LocalKeyword=MYBSD=CVSHeader</code>, then a
+file with the local keyword $<i></i>MYBSD$ will be
+expanded as if it were a $<i></i>CVSHeader$ keyword. If
+the src/frob.c file contained this keyword, it might
+look something like this:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>  /*
+   * $<i></i>MYBSD: src/frob.c,v 1.1 2003/05/04 09:27:45 john Exp $ 
+   */
+</nowiki></pre></td></tr></table>
+
+<p>Many repositories make use of a such a &ldquo;local
+keyword&rdquo; feature. An old patch to <small>CVS</small> provided
+the <code>LocalKeyword</code> feature using a <code>tag=</code>
+option and called this the &ldquo;custom tag&rdquo; or &ldquo;local
+tag&rdquo; feature. It was used in conjunction with the
+what they called the <code>tagexpand=</code> option. In
+<small>CVS</small> this other option is known as the
+<code>KeywordExpand</code> option. 
+See [[#SEC103|Configuring Keyord Expansion]] for more
+details.
+</p>
+<p>Examples from popular projects include:
+$<i></i>FreeBSD$, $<i></i>NetBSD$,
+$<i></i>OpenBSD$, $<i></i>XFree86$,
+$<i></i>Xorg$.
+</p>
+<p>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.
+</p>
+<p>All keyword expansion except the local keyword may be
+disabled using the <code>KeywordExpansion</code> option in
+the &lsquo;<tt>CVSROOT/config</tt>&rsquo; file&mdash;see 
+[[#SEC103|Configuring Keyord Expansion]] for more details.
+</p>
+</dd>
+</dl>
+
+<hr size="6">
+<div id="Using-keywords"></div>
+<div id="SEC100"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC99| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC101| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC98| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC98| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC105| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Using keywords ===
+
+<p>To include a keyword string you simply include the
+relevant text string, such as <code>$<i></i>Id$</code>, inside the
+file, and commit the file.  <small>CVS</small> will automatically
+expand the string as part of the commit operation.
+</p>
+<p>It is common to embed the <code>$<i></i>Id$</code> 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 <code>#pragma ident</code>
+directive.  Or a document management system might
+provide a way to pass a string through to generated
+files.
+</p>
+
+<div id="IDX195"></div>
+<p>The <code>ident</code> command (which is part of the <small>RCS</small>
+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.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ ident samp.c
+samp.c:
+     $<i></i>Id: samp.c,v 1.5 1993/10/19 14:57:32 ceder Exp $
+$ gcc samp.c
+$ ident a.out
+a.out:
+     $<i></i>Id: samp.c,v 1.5 1993/10/19 14:57:32 ceder Exp $
+</nowiki></pre></td></tr></table>
+
+<div id="IDX196"></div>
+<p>S<small>CCS</small> is another popular revision control system.
+It has a command, <code>what</code>, which is very similar to
+<code>ident</code> and used for the same purpose.  Many sites
+without <small>RCS</small> have <small>SCCS</small>.  Since <code>what</code>
+looks for the character sequence <code>@(#)</code> it is
+easy to include keywords that are detected by either
+command.  Simply prefix the keyword with the
+magic <small>SCCS</small> phrase, like this:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>static char 
*id=&quot;@(#) $<i></i>Id: ab.c,v 1.5 1993/10/19 14:57:32 ceder Exp $&quot;;
+</nowiki></pre></td></tr></table>
+
+<hr size="6">
+<div id="Avoiding-substitution"></div>
+<div id="SEC101"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC100| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC102| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC98| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC98| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC105| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Avoiding substitution ===
+
+<p>Keyword substitution has its disadvantages.  Sometimes
+you might want the literal text string
+&lsquo;<samp>$<i></i>Author$</samp>&rsquo; to appear inside a file without
+<small>CVS</small> interpreting it as a keyword and expanding it
+into something like &lsquo;<samp>$<i></i>Author: ceder $</samp>&rsquo;.
+</p>
+<p>There is unfortunately no way to selectively turn off
+keyword substitution.  You can use &lsquo;<samp>-ko</samp>&rsquo;
+(see section [[#SEC102|Substitution modes]]) to turn off keyword
+substitution entirely.
+</p>
+<p>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 &lsquo;<samp>address@hidden</samp>&rsquo; whenever the text
+&lsquo;<samp>$<i></i>Author$</samp>&rsquo; should appear.  In 
<code>nroff</code>
+and <code>troff</code> you can embed the null-character
+<code>\&amp;</code> inside the keyword for a similar effect.
+</p>
+<p>It is also possible to specify an explicit list of
+keywords to include or exclude using the
+<code>KeywordExpand</code> option in the
+&lsquo;<tt>CVSROOT/config</tt>&rsquo; file&ndash;see [[#SEC103|Configuring 
Keyord Expansion]]
+for more details. This feature is intended primarily
+for use with the <code>LocalKeyword</code> option&ndash;see
+[[#SEC99|Keyword List]].
+</p>
+<hr size="6">
+<div id="Substitution-modes"></div>
+<div id="SEC102"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC101| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC103| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC98| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC98| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC105| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Substitution modes ===
+
+<p>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 &lsquo;<samp>-k</samp>&rsquo;
+option to <code>cvs add</code> and <code>cvs admin</code>; the
+latter is set by the &lsquo;<samp>-k</samp>&rsquo; or 
&lsquo;<samp>-A</samp>&rsquo; options to <code>cvs
+checkout</code> or <code>cvs update</code>.  <code>cvs diff</code> also
+has a &lsquo;<samp>-k</samp>&rsquo; option.  For some examples,
+see [[#SEC80|Handling binary files]], and [[#SEC64|Merging and keywords]].
+</p>
+<p>The modes available are:
+</p>
+<dl compact="compact">
+<dt> &lsquo;<samp>-kkv</samp>&rsquo;</dt>
+<dd><p>Generate keyword strings using the default form, e.g.
+<code>$<i></i>Revision: 5.7 $</code> for the <code>Revision</code>
+keyword.
+</p>
+</dd>
+<dt> &lsquo;<samp>-kkvl</samp>&rsquo;</dt>
+<dd><p>Like &lsquo;<samp>-kkv</samp>&rsquo;, except that a locker&rsquo;s name 
is always
+inserted if the given revision is currently locked.
+The locker&rsquo;s name is only relevant if <code>cvs admin
+-l</code> is in use.
+</p>
+</dd>
+<dt> &lsquo;<samp>-kk</samp>&rsquo;</dt>
+<dd><p>Generate only keyword names in keyword strings; omit
+their values.  For example, for the <code>Revision</code>
+keyword, generate the string <code>$<i></i>Revision$</code>
+instead of <code>$<i></i>Revision: 5.7 $</code>.  This option
+is useful to ignore differences due to keyword
+substitution when comparing different revisions of a
+file (see section [[#SEC64|Merging and keywords]]).
+</p>
+</dd>
+<dt> &lsquo;<samp>-ko</samp>&rsquo;</dt>
+<dd><p>Generate the old keyword string, present in the working
+file just before it was checked in.  For example, for
+the <code>Revision</code> keyword, generate the string
+<code>$<i></i>Revision: 1.1 $</code> instead of
+<code>$<i></i>Revision: 5.7 $</code> if that is how the
+string appeared when the file was checked in.
+</p>
+</dd>
+<dt> &lsquo;<samp>-kb</samp>&rsquo;</dt>
+<dd><p>Like &lsquo;<samp>-ko</samp>&rsquo;, 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
+&lsquo;<samp>-ko</samp>&rsquo;.  For more information on binary files, see
+[[#SEC80|Handling binary files]].  In <small>CVS</small> version 1.12.2 and 
later
+&lsquo;<samp>-kb</samp>&rsquo;, as set by <code>cvs add</code>, <code>cvs 
admin</code>, or
+<code>cvs import</code> may not be overridden by a 
&lsquo;<samp>-k</samp>&rsquo; option
+specified on the command line.
+</p>
+</dd>
+<dt> &lsquo;<samp>-kv</samp>&rsquo;</dt>
+<dd><p>Generate only keyword values for keyword strings.  For
+example, for the <code>Revision</code> keyword, generate the string
+<code>5.7</code> instead of <code>$<i></i>Revision: 5.7 $</code>.
+This can help generate files in programming languages
+where it is hard to strip keyword delimiters like
+<code>$<i></i>Revision: $</code> from a string.  However,
+further keyword substitution cannot be performed once
+the keyword names are removed, so this option should be
+used with care.
+</p>
+<p>One often would like to use &lsquo;<samp>-kv</samp>&rsquo; with <code>cvs
+export</code>&mdash;see section [[#SEC135|export&mdash;Export sources from 
CVS, similar to checkout]].  But be aware that doesn&rsquo;t
+handle an export containing binary files correctly.
+</p>
+</dd>
+</dl>
+
+<hr size="6">
+<div id="Configuring-keyword-expansion"></div>
+<div id="SEC103"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC102| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC104| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC98| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC98| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC105| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Configuring Keyord Expansion ===
+
+<p>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
+$<i></i>Id$ or $<i></i>Header$ keywords. Examples from
+real projects includ, $<i></i>Xorg$, $<i></i>XFree86$,
+$<i></i>FreeBSD$, $<i></i>NetBSD$,
+$<i></i>OpenBSD$, and even $<i></i>dotat$.
+The advantage of this is that
+you can include your local version information in a
+file using this local keyword (sometimes called a
+&ldquo;custom tag&rdquo; or a &ldquo;local tag&rdquo;) 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.
+</p>
+<p>The <code>KeywordExpansion</code> option in the
+&lsquo;<tt>CVSROOT/config</tt>&rsquo; 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
+<code>LocalKeyword</code> that has been configured.
+</p>
+<p>The <code>KeywordExpansion</code> option is followed by
+<code>=</code> and the next character may either be <code>i</code>
+to start an inclusion list or <code>e</code> to start an
+exclusion list. If the following lines were added to
+the &lsquo;<tt>CVSROOT/config</tt>&rsquo; file:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>        # Add a 
&quot;MyBSD&quot; keyword and restrict keyword
+        # expansion
+        LocalKeyword=MyBSD=CVSHeader
+        KeywordExpand=iMyBSD
+</nowiki></pre></td></tr></table>
+
+<p>then only the $<i></i>MyBSD$ keyword would be expanded.
+A list may be used. The this example:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>        # Add a 
&quot;MyBSD&quot; keyword and restrict keyword
+        # expansion to the MyBSD, Name and Date keywords.
+        LocalKeyword=MyBSD=CVSHeader
+        KeywordExpand=iMyBSD,Name,Date
+</nowiki></pre></td></tr></table>
+
+<p>would allow $<i></i>MyBSD$, $<i></i>Name$, and
+$<i></i>Date$ to be expanded.
+</p>
+<p>It is also possible to configure an exclusion list
+using the following:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>        # Do not 
expand the non-RCS keyword CVSHeader
+        KeywordExpand=eCVSHeader
+</nowiki></pre></td></tr></table>
+
+<p>This allows <small>CVS</small> to ignore the recently introduced
+$<i></i>CVSHeader$ 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.
+</p>
+<p>If there is a desire to not have any RCS keywords
+expanded and not use the <code>-ko</code> flags everywhere,
+an administrator may disable all keyword expansion
+using the &lsquo;<tt>CVSROOT/config</tt>&rsquo; line:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>    # Do not expand 
any RCS keywords
+       KeywordExpand=i
+</nowiki></pre></td></tr></table>
+
+<p>this could be confusing to users that expect RCS
+keywords like $<i></i>Id$ to be expanded properly,
+so care should be taken to properly set user
+expectations for a repository so configured.
+</p>
+<p>It should be noted that a patch to provide both the
+<code>KeywordExpand</code> and <code>LocalKeyword</code> features
+has been around a long time. However, that patch
+implemented these features using <code>tag=</code> and
+<code>tagexpand=</code> keywords and those keywords are NOT
+recognized.
+</p>
+<hr size="6">
+<div id="Log-keyword"></div>
+<div id="SEC104"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC103| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC105| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC98| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC98| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC105| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Problems with the $<i></i>Log$ keyword. ===
+
+<p>The <code>$<i></i>Log$</code> keyword is somewhat
+controversial.  As long as you are working on your
+development system the information is easily accessible
+even if you do not use the <code>$<i></i>Log$</code>
+keyword&mdash;just do a <code>cvs log</code>.  Once you export
+the file the history information might be useless
+anyhow.
+</p>
+<p>A more serious concern is that <small>CVS</small> is not good at
+handling <code>$<i></i>Log$</code> entries when a branch is
+merged onto the main trunk.  Conflicts often result
+from the merging operation.
+</p>
+<p>People also tend to &quot;fix&quot; the log entries in the file
+(correcting spelling mistakes and maybe even factual
+errors).  If that is done the information from
+<code>cvs log</code> will not be consistent with the
+information inside the file.  This may or may not be a
+problem in real life.
+</p>
+<p>It has been suggested that the <code>$<i></i>Log$</code>
+keyword should be inserted <em>last</em> 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.
+</p>
+<hr size="6">
+<div id="Tracking-sources"></div>
+<div id="SEC105"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC104| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC106| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC98| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC112| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== Tracking third-party sources ==
+
+<p>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.  <small>CVS</small> can help you with
+this task.
+</p>
+<div id="IDX197"></div>
+<div id="IDX198"></div>
+<div id="IDX199"></div>
+<p>In the terminology used in <small>CVS</small>, the supplier of the
+program is called a <em>vendor</em>.  The unmodified
+distribution from the vendor is checked in on its own
+branch, the <em>vendor branch</em>.  <small>CVS</small> reserves branch
+1.1.1 for this use.
+</p>
+<p>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.
+</p>
+<p>Use the <code>import</code> command to create and update
+the vendor branch.  When you import a new file,
+the vendor branch is made the &lsquo;head&rsquo; 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 &lsquo;head&rsquo;
+revision.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC106| First 
import]]::<nowiki>                Importing for the first time
+</nowiki>&bull;[[#SEC107| Update imports]]::<nowiki>              Updating 
with the import command
+</nowiki>&bull;[[#SEC108| Reverting local changes]]::<nowiki>     Reverting to 
the latest vendor release
+</nowiki>&bull;[[#SEC109| Binary files in imports]]::<nowiki>     Binary files 
require special handling
+</nowiki>&bull;[[#SEC110| Keywords in imports]]::<nowiki>         Keyword 
substitution might be undesirable
+</nowiki>&bull;[[#SEC111| Multiple vendor branches]]::<nowiki>    What if you 
get sources from several places?
+</nowiki></pre>
+<hr size="6">
+<div id="First-import"></div>
+<div id="SEC106"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC105| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC107| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC105| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC105| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC112| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Importing for the first time ===
+
+<p>Use the <code>import</code> command to check in the sources
+for the first time.  When you use the <code>import</code>
+command to track third-party sources, the <em>vendor
+tag</em> and <em>release tags</em> are useful.  The
+<em>vendor tag</em> is a symbolic name for the branch
+(which is always 1.1.1, unless you use the &lsquo;<samp>-b
+<var>branch</var></samp>&rsquo; flag&mdash;see [[#SEC111|Multiple vendor 
branches]].).  The
+<em>release tags</em> are symbolic names for a particular
+release, such as &lsquo;<samp>FSF_0_04</samp>&rsquo;.
+</p>
+<p>Note that <code>import</code> does <em>not</em> change the
+directory in which you invoke it.  In particular, it
+does not set up that directory as a <small>CVS</small> working
+directory; if you want to work with the sources import
+them first and then check them out into a different
+directory (see section [[#SEC5|Getting the source]]).
+</p>
+<div id="IDX200"></div>
+<p>Suppose you have the sources to a program called
+<code>wdiff</code> in a directory &lsquo;<tt>wdiff-0.04</tt>&rsquo;,
+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:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cd wdiff-0.04
+$ cvs import -m &quot;Import of FSF v. 0.04&quot; fsf/wdiff FSF_DIST WDIFF_0_04
+</nowiki></pre></td></tr></table>
+
+<p>The vendor tag is named &lsquo;<samp>FSF_DIST</samp>&rsquo; in the above
+example, and the only release tag assigned is
+&lsquo;<samp>WDIFF_0_04</samp>&rsquo;.
+</p>
+<hr size="6">
+<div id="Update-imports"></div>
+<div id="SEC107"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC106| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC108| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC105| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC105| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC112| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Updating with the import command ===
+
+<p>When a new release of the source arrives, you import it into the
+repository with the same <code>import</code> 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:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ tar xfz 
wdiff-0.05.tar.gz
+$ cd wdiff-0.05
+$ cvs import -m &quot;Import of FSF v. 0.05&quot; fsf/wdiff FSF_DIST WDIFF_0_05
+</nowiki></pre></td></tr></table>
+
+<p>For files that have not been modified locally, the newly created
+revision becomes the head revision.  If you have made local
+changes, <code>import</code> will warn you that you must merge the changes
+into the main trunk, and tell you to use &lsquo;<samp>checkout 
-j</samp>&rsquo; to do so:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs checkout 
-jFSF_DIST:yesterday -jFSF_DIST wdiff
+</nowiki></pre></td></tr></table>
+
+<p>The above command will check out the latest revision of
+&lsquo;<samp>wdiff</samp>&rsquo;, merging the changes made on the vendor 
branch &lsquo;<samp>FSF_DIST</samp>&rsquo;
+since yesterday into the working copy.  If any conflicts arise during
+the merge they should be resolved in the normal way (see section 
[[#SEC86|Conflicts example]]).  Then, the modified files may be committed.
+</p>
+<p>However, it is much better to use the two release tags rather than using
+a date on the branch as suggested above:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs checkout 
-jWDIFF_0_04 -jWDIFF_0_05 wdiff
+</nowiki></pre></td></tr></table>
+
+<p>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 <small>CVS</small> to detect 
files
+that were removed between the two vendor releases and mark them for
+removal.  Since <code>import</code> has no way to detect removed files, you
+should do a merge like this even if <code>import</code> doesn&rsquo;t tell you 
to.
+</p>
+<hr size="6">
+<div id="Reverting-local-changes"></div>
+<div id="SEC108"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC107| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC109| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC105| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC105| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC112| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Reverting to the latest vendor release ===
+
+<p>You can also revert local changes completely and return
+to the latest vendor release by changing the &lsquo;head&rsquo;
+revision back to the vendor branch on all files.  For
+example, if you have a checked-out copy of the sources
+in &lsquo;<tt>~/work.d/wdiff</tt>&rsquo;, and you want to revert to the
+vendor&rsquo;s version for all the files in that directory,
+you would type:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cd ~/work.d/wdiff
+$ cvs admin -bWDIFF .
+</nowiki></pre></td></tr></table>
+
+<p>You must specify the &lsquo;<samp>-bWDIFF</samp>&rsquo; without any space
+after the &lsquo;<samp>-b</samp>&rsquo;.  See section [[#SEC121|admin 
options]].
+</p>
+<hr size="6">
+<div id="Binary-files-in-imports"></div>
+<div id="SEC109"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC108| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC110| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC105| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC105| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC112| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== How to handle binary files with cvs import ===
+
+<p>Use the &lsquo;<samp>-k</samp>&rsquo; wrapper option to tell import which
+files are binary.  See section [[#SEC165|The cvswrappers file]].
+</p>
+<hr size="6">
+<div id="Keywords-in-imports"></div>
+<div id="SEC110"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC109| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC111| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC105| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC105| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC112| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== How to handle keyword substitution with cvs import ===
+
+<p>The sources which you are importing may contain
+keywords (see section [[#SEC98|Keyword substitution]]).  For example,
+the vendor may use <small>CVS</small> 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 <small>CVS</small>.  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.
+</p>
+<p>To maintain the keyword expansions supplied by the
+vendor, supply the &lsquo;<samp>-ko</samp>&rsquo; option to <code>cvs
+import</code> 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&rsquo;ll have to think about what you want
+and use the &lsquo;<samp>-k</samp>&rsquo; option to <code>cvs update</code> or
+<code>cvs admin</code> as appropriate.
+</p>
+<hr size="6">
+<div id="Multiple-vendor-branches"></div>
+<div id="SEC111"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC110| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC112| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC105| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC105| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC112| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Multiple vendor branches ===
+
+<p>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 <small>CVS</small> so
+that you at least have them in one place.
+</p>
+<p>For handling situations in which there may be more than
+one vendor, you may specify the &lsquo;<samp>-b</samp>&rsquo; option to
+<code>cvs import</code>.  It takes as an argument the vendor
+branch to import to.  The default is &lsquo;<samp>-b 1.1.1</samp>&rsquo;.
+</p>
+<p>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&rsquo;s efforts to branch
+1.1.1 and use the vendor tag RED.  You want to import
+the blue team&rsquo;s efforts to branch 1.1.3 and use the
+vendor tag BLUE.  So the commands you might use are:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs import dir 
RED RED_1-0
+$ cvs import -b 1.1.3 dir BLUE BLUE_1-5
+</nowiki></pre></td></tr></table>
+
+<p>Note that if your vendor tag does not match your
+&lsquo;<samp>-b</samp>&rsquo; option, <small>CVS</small> will not detect this 
case!  For
+example,
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs import -b 
1.1.3 dir RED RED_1-0
+</nowiki></pre></td></tr></table>
+
+<p>Be careful; this kind of mismatch is sure to sow
+confusion or worse.  I can&rsquo;t think of a useful purpose
+for the ability to specify a mismatch here, but if you
+discover such a use, don&rsquo;t.  <small>CVS</small> is likely to make this
+an error in some future release.
+</p>
+
+<hr size="6">
+<div id="Builds"></div>
+<div id="SEC112"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC111| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC113| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC105| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC113| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== How your build system interacts with CVS ==
+
+<p>As mentioned in the introduction, <small>CVS</small> does not
+contain software for building your software from source
+code.  This section describes how various aspects of
+your build system might interact with <small>CVS</small>.
+</p>
+<p>One common question, especially from people who are
+accustomed to <small>RCS</small>, is how to make their build get
+an up to date copy of the sources.  The answer to this
+with <small>CVS</small> is two-fold.  First of all, since
+<small>CVS</small> itself can recurse through directories, there
+is no need to modify your &lsquo;<tt>Makefile</tt>&rsquo; (or whatever
+configuration file your build tool uses) to make sure
+each file is up to date.  Instead, just use two
+commands, first <code>cvs -q update</code> and then
+<code>make</code> or whatever the command is to invoke your
+build tool.  Secondly, you do not necessarily
+<em>want</em> 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.
+</p>
+<div id="IDX201"></div>
+<p>One common need is to record which versions of which
+source files went into a particular build.  This kind
+of functionality is sometimes called <em>bill of
+materials</em> or something similar.  The best way to do
+this with <small>CVS</small> is to use the <code>tag</code> command to
+record which versions went into a given build
+(see section [[#SEC48|Tags&ndash;Symbolic revisions]]).
+</p>
+<p>Using <small>CVS</small> 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.
+</p>
+<p>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 <code>VPATH</code>
+feature found in many versions of <code>make</code>.  One build
+tool which is designed to help with this kind of thing
+is Odin (see
+<code>ftp://ftp.cs.colorado.edu/pub/distribs/odin</code>).
+</p>
+<hr size="6">
+<div id="Special-Files"></div>
+<div id="SEC113"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC112| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC114| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC112| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC114| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== Special Files ==
+
+
+<p>In normal circumstances, <small>CVS</small> 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.  <small>CVS</small> 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 &quot;check in&quot; a device into a repository;
+if the device file cannot be opened, <small>CVS</small> will refuse to
+handle it.  Files also lose their ownerships and
+permissions during repository transactions.
+</p>
+
+<hr size="6">
+<div id="CVS-commands"></div>
+<div id="SEC114"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC113| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC115| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC113| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== Guide to CVS commands ==
+
+<p>This appendix describes the overall structure of
+<small>CVS</small> commands, and describes some commands in
+detail (others are described elsewhere; for a quick
+reference to <small>CVS</small> commands, see section [[#SEC156|Quick 
reference to CVS commands]]).
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC115| 
Structure]]::<nowiki>                   Overall structure of CVS commands
+</nowiki>&bull;[[#SEC116| Exit status]]::<nowiki>                 Indicating 
CVS's success or failure
+</nowiki>&bull;[[#SEC117| ~/.cvsrc]]::<nowiki>                    Default 
options with the ~/.csvrc file
+</nowiki>&bull;[[#SEC118| Global options]]::<nowiki>              Options you 
give to the left of cvs_command
+</nowiki>&bull;[[#SEC119| Common options]]::<nowiki>              Options you 
give to the right of cvs_command
+</nowiki>&bull;[[#SEC120| admin]]::<nowiki>                       
Administration
+</nowiki>&bull;[[#SEC122| checkout]]::<nowiki>                    Checkout 
sources for editing
+</nowiki>&bull;[[#SEC125| commit]]::<nowiki>                      Check files 
into the repository
+</nowiki>&bull;[[#SEC130| diff]]::<nowiki>                        Show 
differences between revisions
+</nowiki>&bull;[[#SEC135| export]]::<nowiki>                      Export 
sources from CVS, similar to checkout
+</nowiki>&bull;[[#SEC137| history]]::<nowiki>                     Show status 
of files and users
+</nowiki>&bull;[[#SEC139| import]]::<nowiki>                      Import 
sources into CVS, using vendor branches
+</nowiki>&bull;[[#SEC143| log]]::<nowiki>                         Show log 
messages for files
+</nowiki>&bull;[[#SEC146| rdiff]]::<nowiki>                       'patch' 
format diffs between releases
+</nowiki>&bull;[[#SEC149| release]]::<nowiki>                     Indicate 
that a directory is no longer in use
+</nowiki>&bull;[[#SEC153| update]]::<nowiki>                      Bring work 
tree in sync with repository
+</nowiki></pre>
+<hr size="6">
+<div id="Structure"></div>
+<div id="SEC115"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC114| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC116| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC114| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Overall structure of CVS commands ===
+
+<p>The overall format of all <small>CVS</small> commands is:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs [ cvs_options ] 
cvs_command [ command_options ] [ command_args ]
+</nowiki></pre></td></tr></table>
+
+<dl compact="compact">
+<dt> <code>cvs</code></dt>
+<dd><p>The name of the <small>CVS</small> program.
+</p>
+</dd>
+<dt> <code>cvs_options</code></dt>
+<dd><p>Some options that affect all sub-commands of <small>CVS</small>.  These 
are
+described below.
+</p>
+</dd>
+<dt> <code>cvs_command</code></dt>
+<dd><p>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 &lsquo;<samp>cvs_command</samp>&rsquo;: &lsquo;<samp>cvs 
-H</samp>&rsquo; elicits a
+list of available commands, and &lsquo;<samp>cvs -v</samp>&rsquo; displays 
version
+information on <small>CVS</small> itself.
+</p>
+</dd>
+<dt> <code>command_options</code></dt>
+<dd><p>Options that are specific for the command.
+</p>
+</dd>
+<dt> <code>command_args</code></dt>
+<dd><p>Arguments to the commands.
+</p></dd>
+</dl>
+
+<p>There is unfortunately some confusion between
+<code>cvs_options</code> and <code>command_options</code>.
+&lsquo;<samp>-l</samp>&rsquo;, when given as a <code>cvs_option</code>, only
+affects some of the commands.  When it is given as a
+<code>command_option</code> 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.
+</p>
+<hr size="6">
+<div id="Exit-status"></div>
+<div id="SEC116"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC115| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC117| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC114| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== CVS&rsquo;s exit status ===
+
+<p><small>CVS</small> can indicate to the calling environment whether it
+succeeded or failed by setting its <em>exit status</em>.
+The exact way of testing the exit status will vary from
+one operating system to another.  For example in a unix
+shell script the &lsquo;<samp>$?</samp>&rsquo; variable will be 0 if the
+last command returned a successful exit status, or
+greater than 0 if the exit status indicated failure.
+</p>
+<p>If <small>CVS</small> 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 <code>cvs diff</code> 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
+<code>cvs diff</code> will be changed to behave like the
+other <small>CVS</small> commands.
+</p>
+<hr size="6">
+<div id="g_t_007e_002f_002ecvsrc"></div>
+<div id="SEC117"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC116| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC118| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC114| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Default options and the ~/.cvsrc file ===
+
+<p>There are some <code>command_options</code> 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
+&lsquo;<tt>.cvsrc</tt>&rsquo; support, actually) is that many people find the
+default output of the &lsquo;<samp>diff</samp>&rsquo; command to be very
+hard to read, and that either context diffs or unidiffs
+are much easier to understand.
+</p>
+<p>The &lsquo;<tt>~/.cvsrc</tt>&rsquo; file is a way that you can add
+default options to <code>cvs_commands</code> within cvs,
+instead of relying on aliases or other shell scripts.
+</p>
+<p>The format of the &lsquo;<tt>~/.cvsrc</tt>&rsquo; file is simple.  The
+file is searched for a line that begins with the same
+name as the <code>cvs_command</code> 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 <em>before</em> any
+options from the command line.
+</p>
+<p>If a command has two names (e.g., <code>checkout</code> and
+<code>co</code>), 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&rsquo;s
+&lsquo;<tt>~/.cvsrc</tt>&rsquo; file:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>log -N
+diff -uN
+rdiff -u
+update -Pd
+checkout -P
+release -d
+</nowiki></pre></td></tr></table>
+
+<p>the command &lsquo;<samp>cvs checkout foo</samp>&rsquo; would have the
+&lsquo;<samp>-P</samp>&rsquo; option added to the arguments, as well as
+&lsquo;<samp>cvs co foo</samp>&rsquo;.
+</p>
+<p>With the example file above, the output from &lsquo;<samp>cvs
+diff foobar</samp>&rsquo; will be in unidiff format.  &lsquo;<samp>cvs diff
+-c foobar</samp>&rsquo; will provide context diffs, as usual.
+Getting &quot;old&quot; format diffs would be slightly more
+complicated, because <code>diff</code> doesn&rsquo;t have an option
+to specify use of the &quot;old&quot; format, so you would need
+&lsquo;<samp>cvs -f diff foobar</samp>&rsquo;.
+</p>
+<p>In place of the command name you can use <code>cvs</code> to
+specify global options (see section [[#SEC118|Global options]]).  For
+example the following line in &lsquo;<tt>.cvsrc</tt>&rsquo;
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs -z6
+</nowiki></pre></td></tr></table>
+
+<p>causes <small>CVS</small> to use compression level 6.
+</p>
+<hr size="6">
+<div id="Global-options"></div>
+<div id="SEC118"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC117| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC119| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC114| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Global options ===
+
+<p>The available &lsquo;<samp>cvs_options</samp>&rsquo; (that are given to the
+left of &lsquo;<samp>cvs_command</samp>&rsquo;) are:
+</p>
+<dl compact="compact">
+<dt> <code>--allow-root=<var>rootdir</var></code></dt>
+<dd><p>Specify legal <small>CVSROOT</small> directory.  See
+[[#SEC30|Setting up the server for password authentication]].
+</p>
+<div id="IDX202"></div>
+<div id="IDX203"></div>
+</dd>
+<dt> <code>-a</code></dt>
+<dd><p>Authenticate all communication between the client and
+the server.  Only has an effect on the <small>CVS</small> client.
+As of this writing, this is only implemented when using
+a GSSAPI connection (see section [[#SEC33|Direct connection with GSSAPI]]).
+Authentication prevents certain sorts of attacks
+involving hijacking the active <small>TCP</small> connection.
+Enabling authentication does not enable encryption.
+</p>
+<div id="IDX204"></div>
+<div id="IDX205"></div>
+</dd>
+<dt> <code>-b <var>bindir</var></code></dt>
+<dd><p>In <small>CVS</small> 1.9.18 and older, this specified that
+<small>RCS</small> programs are in the <var>bindir</var> directory.
+Current versions of <small>CVS</small> do not run <small>RCS</small>
+programs; for compatibility this option is accepted,
+but it does nothing.
+</p>
+<div id="IDX206"></div>
+<div id="IDX207"></div>
+</dd>
+<dt> <code>-T <var>tempdir</var></code></dt>
+<dd><p>Use <var>tempdir</var> as the directory where temporary files are
+located.  Overrides the setting of the <code>$TMPDIR</code> environment
+variable and any precompiled directory.  This parameter should be
+specified as an absolute pathname.
+(When running client/server, &lsquo;<samp>-T</samp>&rsquo; affects only the 
local process;
+specifying &lsquo;<samp>-T</samp>&rsquo; for the client has no effect on the 
server and
+vice versa.)
+</p>
+<div id="IDX208"></div>
+<div id="IDX209"></div>
+</dd>
+<dt> <code>-d <var>cvs_root_directory</var></code></dt>
+<dd><p>Use <var>cvs_root_directory</var> as the root directory
+pathname of the repository.  Overrides the setting of
+the <code>$CVSROOT</code> environment variable.  See section [[#SEC9|The 
Repository]].
+</p>
+<div id="IDX210"></div>
+<div id="IDX211"></div>
+</dd>
+<dt> <code>-e <var>editor</var></code></dt>
+<dd><p>Use <var>editor</var> to enter revision log information.  Overrides the
+setting of the <code>$CVSEDITOR</code> and <code>$EDITOR</code>
+environment variables.  For more information, see
+[[#SEC6|Committing your changes]].
+</p>
+</dd>
+<dt> <code>-f</code></dt>
+<dd><p>Do not read the &lsquo;<tt>~/.cvsrc</tt>&rsquo; file.  This
+option is most often used because of the
+non-orthogonality of the <small>CVS</small> option set.  For
+example, the &lsquo;<samp>cvs log</samp>&rsquo; option 
&lsquo;<samp>-N</samp>&rsquo; (turn off
+display of tag names) does not have a corresponding
+option to turn the display on.  So if you have
+&lsquo;<samp>-N</samp>&rsquo; in the &lsquo;<tt>~/.cvsrc</tt>&rsquo; entry for 
&lsquo;<samp>log</samp>&rsquo;,
+you may need to use &lsquo;<samp>-f</samp>&rsquo; to show the tag names.
+</p>
+</dd>
+<dt> <code>-H</code></dt>
+<dt> <code>--help</code></dt>
+<dd><p>Display usage information about the specified 
&lsquo;<samp>cvs_command</samp>&rsquo;
+(but do not actually execute the command).  If you don&rsquo;t specify
+a command name, &lsquo;<samp>cvs -H</samp>&rsquo; displays overall help for
+<small>CVS</small>, including a list of other help options.
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Do not log the &lsquo;<samp>cvs_command</samp>&rsquo; in the command 
history (but execute it
+anyway).  See section [[#SEC137|history&mdash;Show status of files and 
users]], for information on command history.
+</p>
+<div id="IDX212"></div>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>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.
+</p>
+<p>Same effect as if the <code>CVSREADONLYFS</code> environment
+variable is set. Using &lsquo;<samp>-R</samp>&rsquo; can also considerably
+speed up checkout&rsquo;s over NFS.
+</p>
+<div id="IDX213"></div>
+</dd>
+<dt> <code>-n</code></dt>
+<dd><p>Do not change any files.  Attempt to execute the
+&lsquo;<samp>cvs_command</samp>&rsquo;, but only to issue reports; do not 
remove,
+update, or merge any existing files, or create any new files.
+</p>
+<p>Note that <small>CVS</small> will not necessarily produce exactly
+the same output as without &lsquo;<samp>-n</samp>&rsquo;.  In some cases
+the output will be the same, but in other cases
+<small>CVS</small> will skip some of the processing that would
+have been required to produce the exact same output.
+</p>
+</dd>
+<dt> <code>-Q</code></dt>
+<dd><p>Cause the command to be really quiet; the command will only
+generate output for serious problems.
+</p>
+</dd>
+<dt> <code>-q</code></dt>
+<dd><p>Cause the command to be somewhat quiet; informational messages,
+such as reports of recursion through subdirectories, are
+suppressed.
+</p>
+<div id="IDX214"></div>
+</dd>
+<dt> <code>-r</code></dt>
+<dd><p>Make new working files read-only.  Same effect
+as if the <code>$CVSREAD</code> environment variable is set
+(see section [[#SEC181|All environment variables which affect CVS]]).  The 
default is to
+make working files writable, unless watches are on
+(see section [[#SEC89|Mechanisms to track who is editing files]]).
+</p>
+</dd>
+<dt> <code>-s <var>variable</var>=<var>value</var></code></dt>
+<dd><p>Set a user variable (see section [[#SEC179|Expansions in administrative 
files]]).
+</p>
+<div id="IDX215"></div>
+</dd>
+<dt> <code>-t</code></dt>
+<dd><p>Trace program execution; display messages showing the steps of
+<small>CVS</small> activity.  Particularly useful with 
&lsquo;<samp>-n</samp>&rsquo; to explore the
+potential impact of an unfamiliar command.
+</p>
+</dd>
+<dt> <code>-v</code></dt>
+<dt> <code>--version</code></dt>
+<dd><p>Display version and copyright information for <small>CVS</small>.
+</p>
+<div id="IDX216"></div>
+<div id="IDX217"></div>
+</dd>
+<dt> <code>-w</code></dt>
+<dd><p>Make new working files read-write.  Overrides the
+setting of the <code>$CVSREAD</code> environment variable.
+Files are created read-write by default, unless <code>$CVSREAD</code> is
+set or &lsquo;<samp>-r</samp>&rsquo; is given.
+</p>
+</dd>
+<dt> <code>-x</code></dt>
+<dd><div id="IDX218"></div>
+<p>Encrypt all communication between the client and the
+server.  Only has an effect on the <small>CVS</small> client.  As
+of this writing, this is only implemented when using a
+GSSAPI connection (see section [[#SEC33|Direct connection with GSSAPI]]) or a
+Kerberos connection (see section [[#SEC34|Direct connection with kerberos]]).
+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, &lsquo;<tt>--enable-encryption</tt>&rsquo;,
+when you build <small>CVS</small>.
+</p>
+</dd>
+<dt> <code>-z <var>gzip-level</var></code></dt>
+<dd><div id="IDX219"></div>
+<div id="IDX220"></div>
+<p>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 <small>CVS</small> client.
+</p>
+</dd>
+</dl>
+
+<hr size="6">
+<div id="Common-options"></div>
+<div id="SEC119"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC118| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC120| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC114| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Common command options ===
+
+<p>This section describes the &lsquo;<samp>command_options</samp>&rsquo; that
+are available across several <small>CVS</small> commands.  These
+options are always given to the right of
+&lsquo;<samp>cvs_command</samp>&rsquo;. 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 <small>CVS</small> command to the other).
+</p>
+<p><strong>Note: the &lsquo;<samp>history</samp>&rsquo; command is an 
exception; it supports
+many options that conflict even with these standard options.</strong>
+</p>
+<dl compact="compact">
+<dd><div id="IDX221"></div>
+<div id="IDX222"></div>
+<div id="IDX223"></div>
+</dd>
+<dt> <code>-D <var>date_spec</var></code></dt>
+<dd><p>Use the most recent revision no later than <var>date_spec</var>.
+<var>date_spec</var> is a single argument, a date description
+specifying a date in the past.
+</p>
+<p>The specification is <em>sticky</em> when you use it to make a
+private copy of a source file; that is, when you get a working
+file using &lsquo;<samp>-D</samp>&rsquo;, <small>CVS</small> 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, see section [[#SEC53|Sticky 
tags]]).
+</p>
+<p>&lsquo;<samp>-D</samp>&rsquo; is available with the <code>annotate</code>, 
<code>checkout</code>,
+<code>diff</code>, <code>export</code>, <code>history</code>,
+<code>rdiff</code>, <code>rtag</code>, <code>tag</code>, and 
<code>update</code> commands.
+(The <code>history</code> command uses this option in a
+slightly different way; see section [[#SEC138|history options]]).
+</p>
+
+<div id="IDX224"></div>
+<div id="IDX225"></div>
+<p>A wide variety of date formats are supported by
+<small>CVS</small>.  The most standard ones are ISO8601 (from the
+International Standards Organization) and the Internet
+e-mail standard (specified in RFC822 as amended by
+RFC1123).
+</p>
+<p>ISO8601 dates have many variants but a few examples
+are:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>1972-09-24
+1972-09-24 20:05
+</nowiki></pre></td></tr></table>
+
+<p>There are a lot more ISO8601 date formats, and <small>CVS</small>
+accepts many of them, but you probably don&rsquo;t want to
+hear the <em>whole</em> long story :-).
+</p>
+
+<p>In addition to the dates allowed in Internet e-mail
+itself, <small>CVS</small> also allows some of the fields to be
+omitted.  For example:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>24 Sep 1972 20:05
+24 Sep
+</nowiki></pre></td></tr></table>
+
+<p>The date is interpreted as being in the
+local timezone, unless a specific timezone is
+specified.
+</p>
+<p>These two date formats are preferred.  However,
+<small>CVS</small> currently accepts a wide variety of other date
+formats.  They are intentionally not documented here in
+any detail, and future versions of <small>CVS</small> might not
+accept all of them.
+</p>
+<p>One such format is
+<code><var>month</var>/<var>day</var>/<var>year</var></code>.  This may
+confuse people who are accustomed to having the month
+and day in the other order; &lsquo;<samp>1/4/96</samp>&rsquo; is January 4,
+not April 1.
+</p>
+<p>Remember to quote the argument to the &lsquo;<samp>-D</samp>&rsquo;
+flag so that your shell doesn&rsquo;t interpret spaces as
+argument separators.  A command using the &lsquo;<samp>-D</samp>&rsquo;
+flag can look like this:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs diff -D 
&quot;1 hour ago&quot; cvs.texinfo
+</nowiki></pre></td></tr></table>
+
+<div id="IDX226"></div>
+</dd>
+<dt> <code>-f</code></dt>
+<dd><p>When you specify a particular date or tag to <small>CVS</small> 
commands, they
+normally ignore files that do not contain the tag (or did not
+exist prior to the date) that you specified.  Use the 
&lsquo;<samp>-f</samp>&rsquo; 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).
+</p>
+<p>Note that even with &lsquo;<samp>-f</samp>&rsquo;, a tag that you specify
+must exist (that is, in some file, not necessary in
+every file).  This is so that <small>CVS</small> will continue to
+give an error if you mistype a tag name.
+</p>
+<p>&lsquo;<samp>-f</samp>&rsquo; is available with these commands:
+<code>annotate</code>, <code>checkout</code>, <code>export</code>,
+<code>rdiff</code>, <code>rtag</code>, and <code>update</code>.
+</p>
+<p><strong>WARNING:  The <code>commit</code> and <code>remove</code>
+commands also have a
+&lsquo;<samp>-f</samp>&rsquo; option, but it has a different behavior for
+those commands.  See [[#SEC126|commit options]], and
+[[#SEC68|Removing files]].</strong>
+</p>
+</dd>
+<dt> <code>-k <var>kflag</var></code></dt>
+<dd><p>Override the default processing of RCS keywords other than
+&lsquo;<samp>-kb</samp>&rsquo;.  See section [[#SEC98|Keyword substitution]], 
for the meaning of
+<var>kflag</var>.  Used with the <code>checkout</code> and <code>update</code>
+commands, your <var>kflag</var> specification is
+<em>sticky</em>; that is, when you use this option
+with a <code>checkout</code> or <code>update</code> command,
+<small>CVS</small> associates your selected <var>kflag</var> with any files
+it operates on, and continues to use that <var>kflag</var> with future
+commands on the same files until you specify otherwise.
+</p>
+<p>The &lsquo;<samp>-k</samp>&rsquo; option is available with the 
<code>add</code>,
+<code>checkout</code>, <code>diff</code>, <code>export</code>, 
<code>import</code> and
+<code>update</code> commands.
+</p>
+<p><strong>WARNING: Prior to CVS version 1.12.2, the 
&lsquo;<samp>-k</samp>&rsquo; flag
+overrode the &lsquo;<samp>-kb</samp>&rsquo; indication for a binary file.  
This could
+sometimes corrupt binary files.  See section [[#SEC64|Merging and keywords]], 
for
+more.</strong>
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory, rather than
+recursing through subdirectories.
+</p>
+<p>Available with the following commands: <code>annotate</code>, 
<code>checkout</code>,
+<code>commit</code>, <code>diff</code>, <code>edit</code>, 
<code>editors</code>, <code>export</code>,
+<code>log</code>, <code>rdiff</code>, <code>remove</code>, <code>rtag</code>,
+<code>status</code>, <code>tag</code>, <code>unedit</code>, 
<code>update</code>, <code>watch</code>,
+and <code>watchers</code>.
+</p>
+<div id="IDX227"></div>
+<div id="IDX228"></div>
+</dd>
+<dt> <code>-m <var>message</var></code></dt>
+<dd><p>Use <var>message</var> as log information, instead of
+invoking an editor.
+</p>
+<p>Available with the following commands: <code>add</code>,
+<code>commit</code> and <code>import</code>.
+</p>
+</dd>
+<dt> <code>-n</code></dt>
+<dd><p>Do not run any tag program.  (A program can be
+specified to run in the modules
+database (see section [[#SEC158|The modules file]]); this option bypasses it).
+</p>
+<p><strong>Note: this is not the same as the &lsquo;<samp>cvs -n</samp>&rsquo;
+program option, which you can specify to the left of a cvs command!</strong>
+</p>
+<p>Available with the <code>checkout</code>, <code>commit</code>, 
<code>export</code>,
+and <code>rtag</code> commands.
+</p>
+</dd>
+<dt> <code>-P</code></dt>
+<dd><p>Prune empty directories.  See [[#SEC69|Removing directories]].
+</p>
+</dd>
+<dt> <code>-p</code></dt>
+<dd><p>Pipe the files retrieved from the repository to standard output,
+rather than writing them in the current directory.  Available
+with the <code>checkout</code> and <code>update</code> commands.
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Process directories recursively.  This is on by default.
+</p>
+<p>Available with the following commands: <code>annotate</code>, 
<code>checkout</code>,
+<code>commit</code>, <code>diff</code>, <code>edit</code>, 
<code>editors</code>, <code>export</code>,
+<code>rdiff</code>, <code>remove</code>, <code>rtag</code>,
+<code>status</code>, <code>tag</code>, <code>unedit</code>, 
<code>update</code>, <code>watch</code>,
+and <code>watchers</code>.
+</p>
+</dd>
+<dt> <code>-r <var>tag</var></code></dt>
+<dd><div id="IDX229"></div>
+<div id="IDX230"></div>
+<p>Use the revision specified by the <var>tag</var> argument instead of the
+default <em>head</em> revision.  As well as arbitrary tags defined
+with the <code>tag</code> or <code>rtag</code> command, two special tags are
+always available: &lsquo;<samp>HEAD</samp>&rsquo; refers to the most recent 
version
+available in the repository, and &lsquo;<samp>BASE</samp>&rsquo; refers to the
+revision you last checked out into the current working directory.
+</p>
+
+<p>The tag specification is sticky when you use this
+with <code>checkout</code> or <code>update</code> to make your own
+copy of a file: <small>CVS</small> remembers the tag and continues to use it on
+future update commands, until you specify otherwise (for more information
+on sticky tags/dates, see section [[#SEC53|Sticky tags]]).
+</p>
+<p>The tag can be either a symbolic or numeric tag, as
+described in [[#SEC48|Tags&ndash;Symbolic revisions]], or the name of a 
branch, as
+described in [[#SEC54|Branching and merging]].
+</p>
+<p>Specifying the &lsquo;<samp>-q</samp>&rsquo; global option along with the
+&lsquo;<samp>-r</samp>&rsquo; command option is often useful, to suppress
+the warning messages when the <small>RCS</small> file
+does not contain the specified tag.
+</p>
+<p><strong>Note: this is not the same as the overall &lsquo;<samp>cvs 
-r</samp>&rsquo; option,
+which you can specify to the left of a <small>CVS</small> command!</strong>
+</p>
+<p>&lsquo;<samp>-r</samp>&rsquo; is available with the <code>checkout</code>, 
<code>commit</code>,
+<code>diff</code>, <code>history</code>, <code>export</code>, 
<code>rdiff</code>,
+<code>rtag</code>, and <code>update</code> commands.
+</p>
+</dd>
+<dt> <code>-W</code></dt>
+<dd><p>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 &lsquo;<tt>.cvswrappers</tt>&rsquo; file.
+Available with the following commands: <code>import</code>,
+and <code>update</code>.
+</p>
+</dd>
+</dl>
+
+<hr size="6">
+<div id="admin"></div>
+<div id="SEC120"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC119| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC121| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC114| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== admin&mdash;Administration ===
+
+<ul>
+<li>
+Requires: repository, working directory.
+</li><li>
+Changes: repository.
+</li><li>
+Synonym: rcs
+</li></ul>
+
+<p>This is the <small>CVS</small> interface to assorted
+administrative facilities.  Some of them have
+questionable usefulness for <small>CVS</small> but exist for
+historical purposes.  Some of the questionable options
+are likely to disappear in the future.  This command
+<em>does</em> work recursively, so extreme care should be
+used.
+</p>
+<div id="IDX231"></div>
+<div id="IDX232"></div>
+<p>On unix, if there is a group named <code>cvsadmin</code>,
+only members of that group can run <code>cvs admin</code>
+commands, except for those specified using the
+<code>UserAdminOptions</code> configuration option in the
+&lsquo;<tt>CVSROOT/config</tt>&rsquo; file.  Options specified using
+<code>UserAdminOptions</code> can be run by any user.  See
+[[#SEC180|The CVSROOT/config configuration file]] for more on 
<code>UserAdminOptions</code>.
+</p>
+<p>The <code>cvsadmin</code> group should exist on the server,
+or any system running the non-client/server <small>CVS</small>.
+To disallow <code>cvs admin</code> for all users, create a
+group with no users in it.  On NT, the <code>cvsadmin</code>
+feature does not exist and all users
+can run <code>cvs admin</code>.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC121| admin 
options]]::<nowiki>               admin options
+</nowiki></pre>
+<hr size="6">
+<div id="admin-options"></div>
+<div id="SEC121"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC120| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC122| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC120| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== admin options ====
+
+<p>Some of these options have questionable usefulness for
+<small>CVS</small> but exist for historical purposes.  Some even
+make it impossible to use <small>CVS</small> until you undo the
+effect!
+</p>
+<dl compact="compact">
+<dt> <code>-A<var>oldfile</var></code></dt>
+<dd><p>Might not work together with <small>CVS</small>.  Append the
+access list of <var>oldfile</var> to the access list of the
+<small>RCS</small> file.
+</p>
+</dd>
+<dt> <code>-a<var>logins</var></code></dt>
+<dd><p>Might not work together with <small>CVS</small>.  Append the
+login names appearing in the comma-separated list
+<var>logins</var> to the access list of the <small>RCS</small> file.
+</p>
+</dd>
+<dt> <code>-b[<var>rev</var>]</code></dt>
+<dd><p>Set the default branch to <var>rev</var>.  In <small>CVS</small>, you
+normally do not manipulate default branches; sticky
+tags (see section [[#SEC53|Sticky tags]]) are a better way to decide
+which branch you want to work on.  There is one reason
+to run <code>cvs admin -b</code>: to revert to the vendor&rsquo;s
+version when using vendor branches (see section [[#SEC108|Reverting to the 
latest vendor release]]).
+There can be no space between &lsquo;<samp>-b</samp>&rsquo; and its argument.
+</p>
+<div id="IDX233"></div>
+</dd>
+<dt> <code>-c<var>string</var></code></dt>
+<dd><p>Sets the comment leader to <var>string</var>.  The comment
+leader is not used by current versions of <small>CVS</small> or
+<small>RCS</small> 5.7.  Therefore, you can almost surely not
+worry about it.  See section [[#SEC98|Keyword substitution]].
+</p>
+</dd>
+<dt> <code>-e[<var>logins</var>]</code></dt>
+<dd><p>Might not work together with <small>CVS</small>.  Erase the login
+names appearing in the comma-separated list
+<var>logins</var> from the access list of the RCS file.  If
+<var>logins</var> is omitted, erase the entire access list.
+There can be no space between &lsquo;<samp>-e</samp>&rsquo; and its argument.
+</p>
+</dd>
+<dt> <code>-I</code></dt>
+<dd><p>Run interactively, even if the standard input is not a
+terminal.  This option does not work with the
+client/server <small>CVS</small> and is likely to disappear in
+a future release of <small>CVS</small>.
+</p>
+</dd>
+<dt> <code>-i</code></dt>
+<dd><p>Useless with <small>CVS</small>.  This creates and initializes a
+new <small>RCS</small> file, without depositing a revision.  With
+<small>CVS</small>, add files with the <code>cvs add</code> command
+(see section [[#SEC67|Adding files to a directory]]).
+</p>
+</dd>
+<dt> <code>-k<var>subst</var></code></dt>
+<dd><p>Set the default keyword
+substitution to <var>subst</var>.  See section [[#SEC98|Keyword 
substitution]].  Giving an explicit &lsquo;<samp>-k</samp>&rsquo; option to
+<code>cvs update</code>, <code>cvs export</code>, or <code>cvs
+checkout</code> overrides this default.
+</p>
+</dd>
+<dt> <code>-l[<var>rev</var>]</code></dt>
+<dd><p>Lock the revision with number <var>rev</var>.  If a branch
+is given, lock the latest revision on that branch.  If
+<var>rev</var> is omitted, lock the latest revision on the
+default branch.  There can be no space between
+&lsquo;<samp>-l</samp>&rsquo; and its argument.
+</p>
+<p>This can be used in conjunction with the
+&lsquo;<tt>rcslock.pl</tt>&rsquo; script in the &lsquo;<tt>contrib</tt>&rsquo;
+directory of the <small>CVS</small> 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 &lsquo;<tt>README</tt>&rsquo; 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).
+</p>
+</dd>
+<dt> <code>-L</code></dt>
+<dd><p>Set locking to strict.  Strict locking means that the
+owner of an RCS file is not exempt from locking for
+checkin.  For use with <small>CVS</small>, strict locking must be
+set; see the discussion under the &lsquo;<samp>-l</samp>&rsquo; option above.
+</p>
+<div id="IDX234"></div>
+<div id="IDX235"></div>
+<div id="IDX236"></div>
+<div id="IDX237"></div>
+<div id="IDX238"></div>
+</dd>
+<dt> <code>-m<var>rev</var>:<var>msg</var></code></dt>
+<dd><p>Replace the log message of revision <var>rev</var> with
+<var>msg</var>.
+</p>
+
+</dd>
+<dt> <code>-N<var>name</var>[:[<var>rev</var>]]</code></dt>
+<dd><p>Act like &lsquo;<samp>-n</samp>&rsquo;, except override any previous
+assignment of <var>name</var>.  For use with magic branches,
+see [[#SEC59|Magic branch numbers]].
+</p>
+</dd>
+<dt> <code>-n<var>name</var>[:[<var>rev</var>]]</code></dt>
+<dd><p>Associate the symbolic name <var>name</var> with the branch
+or revision <var>rev</var>.  It is normally better to use
+&lsquo;<samp>cvs tag</samp>&rsquo; or &lsquo;<samp>cvs rtag</samp>&rsquo; 
instead.  Delete the
+symbolic name if both &lsquo;<samp>:</samp>&rsquo; and <var>rev</var> are
+omitted; otherwise, print an error message if
+<var>name</var> is already associated with another number.
+If <var>rev</var> is symbolic, it is expanded before
+association.  A <var>rev</var> consisting of a branch number
+followed by a &lsquo;<samp>.</samp>&rsquo; stands for the current latest
+revision in the branch.  A &lsquo;<samp>:</samp>&rsquo; with an empty
+<var>rev</var> stands for the current latest revision on the
+default branch, normally the trunk.  For example,
+&lsquo;<samp>cvs admin -n<var>name</var>:</samp>&rsquo; associates 
<var>name</var> with the
+current latest revision of all the RCS files;
+this contrasts with &lsquo;<samp>cvs admin -n<var>name</var>:$</samp>&rsquo; 
which
+associates <var>name</var> with the revision numbers
+extracted from keyword strings in the corresponding
+working files.
+</p>
+<div id="IDX239"></div>
+<div id="IDX240"></div>
+<div id="IDX241"></div>
+</dd>
+<dt> <code>-o<var>range</var></code></dt>
+<dd><p>Deletes (<em>outdates</em>) the revisions given by
+<var>range</var>.
+</p>
+<p>Note that this command can be quite dangerous unless
+you know <em>exactly</em> what you are doing (for example
+see the warnings below about how the
+<var>rev1</var>:<var>rev2</var> syntax is confusing).
+</p>
+<p>If you are short on disc this option might help you.
+But think twice before using it&mdash;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 <small>CVS</small>
+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.
+</p>
+<p>Specify <var>range</var> in one of the following ways:
+</p>
+<dl compact="compact">
+<dt> <code><var>rev1</var>::<var>rev2</var></code></dt>
+<dd><p>Collapse all revisions between rev1 and rev2, so that
+<small>CVS</small> only stores the differences associated with going
+from rev1 to rev2, not intermediate steps.  For
+example, after &lsquo;<samp>-o 1.3::1.5</samp>&rsquo; 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:
+&lsquo;<samp>-o 1.3::1.4</samp>&rsquo; and &lsquo;<samp>-o 
1.3::1.3</samp>&rsquo; have no
+effect, because there are no intermediate revisions to
+remove.
+</p>
+</dd>
+<dt> <code>::<var>rev</var></code></dt>
+<dd><p>Collapse revisions between the beginning of the branch
+containing <var>rev</var> and <var>rev</var> itself.  The
+branchpoint and <var>rev</var> are left intact.  For
+example, &lsquo;<samp>-o ::1.3.2.6</samp>&rsquo; 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.
+</p>
+</dd>
+<dt> <code><var>rev</var>::</code></dt>
+<dd><p>Collapse revisions between <var>rev</var> and the end of the
+branch containing <var>rev</var>.  Revision <var>rev</var> is
+left intact but the head revision is deleted.
+</p>
+</dd>
+<dt> <code><var>rev</var></code></dt>
+<dd><p>Delete the revision <var>rev</var>.  For example, &lsquo;<samp>-o
+1.3</samp>&rsquo; is equivalent to &lsquo;<samp>-o 1.2::1.4</samp>&rsquo;.
+</p>
+</dd>
+<dt> <code><var>rev1</var>:<var>rev2</var></code></dt>
+<dd><p>Delete the revisions from <var>rev1</var> to <var>rev2</var>,
+inclusive, on the same branch.  One will not be able to
+retrieve <var>rev1</var> or <var>rev2</var> or any of the
+revisions in between.  For example, the command
+&lsquo;<samp>cvs admin -oR_1_01:R_1_02 .</samp>&rsquo; 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
+<em>the same</em> 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 <var>rev1</var>::<var>rev2</var> instead.
+</p>
+</dd>
+<dt> <code>:<var>rev</var></code></dt>
+<dd><p>Delete revisions from the beginning of the
+branch containing <var>rev</var> up to and including
+<var>rev</var>.
+</p>
+</dd>
+<dt> <code><var>rev</var>:</code></dt>
+<dd><p>Delete revisions from revision <var>rev</var>, including
+<var>rev</var> itself, to the end of the branch containing
+<var>rev</var>.
+</p></dd>
+</dl>
+
+<p>None of the revisions to be deleted may have
+branches or locks.
+</p>
+<p>If any of the revisions to be deleted have symbolic
+names, and one specifies one of the &lsquo;<samp>::</samp>&rsquo; syntaxes,
+then <small>CVS</small> 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 <code>cvs tag -d</code>, then run
+<code>cvs admin -o</code>.  If one specifies the
+non-&lsquo;<samp>::</samp>&rsquo; syntaxes, then <small>CVS</small> will 
delete the
+revisions but leave the symbolic names pointing to
+nonexistent revisions.  This behavior is preserved for
+compatibility with previous versions of <small>CVS</small>, but
+because it isn&rsquo;t very useful, in the future it may
+change to be like the &lsquo;<samp>::</samp>&rsquo; case.
+</p>
+<p>Due to the way <small>CVS</small> handles branches <var>rev</var>
+cannot be specified symbolically if it is a branch.
+See section [[#SEC59|Magic branch numbers]], for an explanation.
+</p>
+<p>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 (see section [[#SEC62|Merging differences between any two 
revisions]]).
+</p>
+</dd>
+<dt> <code>-q</code></dt>
+<dd><p>Run quietly; do not print diagnostics.
+</p>
+</dd>
+<dt> <code>-s<var>state</var>[:<var>rev</var>]</code></dt>
+<dd><p>Useful with <small>CVS</small>.  Set the state attribute of the
+revision <var>rev</var> to <var>state</var>.  If <var>rev</var> is a
+branch number, assume the latest revision on that
+branch.  If <var>rev</var> is omitted, assume the latest
+revision on the default branch.  Any identifier is
+acceptable for <var>state</var>.  A useful set of states is
+&lsquo;<samp>Exp</samp>&rsquo; (for experimental), 
&lsquo;<samp>Stab</samp>&rsquo; (for
+stable), and &lsquo;<samp>Rel</samp>&rsquo; (for released).  By default,
+the state of a new revision is set to &lsquo;<samp>Exp</samp>&rsquo; when
+it is created.  The state is visible in the output from
+<var>cvs log</var> (see section [[#SEC143|log&mdash;Print out log information 
for files]]), and in the
+&lsquo;<samp>$<i></i>Log$</samp>&rsquo; and 
&lsquo;<samp>$<i></i>State$</samp>&rsquo; keywords
+(see section [[#SEC98|Keyword substitution]]).  Note that <small>CVS</small>
+uses the <code>dead</code> state for its own purposes; to
+take a file to or from the <code>dead</code> state use
+commands like <code>cvs remove</code> and <code>cvs add</code>, not
+<code>cvs admin -s</code>.
+</p>
+</dd>
+<dt> <code>-t[<var>file</var>]</code></dt>
+<dd><p>Useful with <small>CVS</small>.  Write descriptive text from the
+contents of the named <var>file</var> into the RCS file,
+deleting the existing text.  The <var>file</var> pathname
+may not begin with &lsquo;<samp>-</samp>&rsquo;.  The descriptive text can be 
seen in the
+output from &lsquo;<samp>cvs log</samp>&rsquo; (see section 
[[#SEC143|log&mdash;Print out log information for files]]).
+There can be no space between &lsquo;<samp>-t</samp>&rsquo; and its argument.
+</p>
+<p>If <var>file</var> is omitted,
+obtain the text from standard input, terminated by
+end-of-file or by a line containing &lsquo;<samp>.</samp>&rsquo; by itself.
+Prompt for the text if interaction is possible; see
+&lsquo;<samp>-I</samp>&rsquo;.
+</p>
+</dd>
+<dt> <code>-t-<var>string</var></code></dt>
+<dd><p>Similar to &lsquo;<samp>-t<var>file</var></samp>&rsquo;. Write 
descriptive text
+from the <var>string</var> into the <small>RCS</small> file, deleting
+the existing text.
+There can be no space between &lsquo;<samp>-t</samp>&rsquo; and its argument.
+</p>
+
+</dd>
+<dt> <code>-U</code></dt>
+<dd><p>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 <small>CVS</small>, strict locking must be
+set; see the discussion under the &lsquo;<samp>-l</samp>&rsquo; option
+above.
+</p>
+</dd>
+<dt> <code>-u[<var>rev</var>]</code></dt>
+<dd><p>See the option &lsquo;<samp>-l</samp>&rsquo; above, for a discussion of
+using this option with <small>CVS</small>.  Unlock the revision
+with number <var>rev</var>.  If a branch is given, unlock
+the latest revision on that branch.  If <var>rev</var> 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 <code>commit</code>
+notification (see section [[#SEC91|Telling CVS to notify you]]).
+There can be no space between &lsquo;<samp>-u</samp>&rsquo; and its argument.
+</p>
+</dd>
+<dt> <code>-V<var>n</var></code></dt>
+<dd><p>In previous versions of <small>CVS</small>, this option meant to
+write an <small>RCS</small> file which would be acceptable to
+<small>RCS</small> version <var>n</var>, but it is now obsolete and
+specifying it will produce an error.
+</p>
+</dd>
+<dt> <code>-x<var>suffixes</var></code></dt>
+<dd><p>In previous versions of <small>CVS</small>, this was documented
+as a way of specifying the names of the <small>RCS</small>
+files.  However, <small>CVS</small> has always required that the
+<small>RCS</small> files used by <small>CVS</small> end in 
&lsquo;<samp>,v</samp>&rsquo;, so
+this option has never done anything useful.
+</p>
+</dd>
+</dl>
+
+
+<hr size="6">
+<div id="checkout"></div>
+<div id="SEC122"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC121| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC123| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC114| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== checkout&mdash;Check out sources for editing ===
+
+<ul>
+<li>
+Synopsis: checkout [options] modules&hellip;
+</li><li>
+Requires: repository.
+</li><li>
+Changes: working directory.
+</li><li>
+Synonyms: co, get
+</li></ul>
+
+<p>Create or update a working directory containing copies of the
+source files specified by <var>modules</var>.  You must execute
+<code>checkout</code> before using most of the other <small>CVS</small>
+commands, since most of them operate on your working
+directory.
+</p>
+<p>The <var>modules</var> 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 &lsquo;<samp>modules</samp>&rsquo; file.
+See section [[#SEC158|The modules file]].
+</p>
+<p>Depending on the modules you specify, <code>checkout</code> 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.
+</p>
+<p>Note that <code>checkout</code> is used to create
+directories.  The top-level directory created is always
+added to the directory where <code>checkout</code> is
+invoked, and usually has the same name as the specified
+module.  In the case of a module alias, the created
+sub-directory may have a different name, but you can be
+sure that it will be a sub-directory, and that
+<code>checkout</code> will show the relative path leading to
+each file as it is extracted into your private work
+area (unless you specify the &lsquo;<samp>-Q</samp>&rsquo; global option).
+</p>
+<p>The files created by <code>checkout</code> are created
+read-write, unless the &lsquo;<samp>-r</samp>&rsquo; option to 
<small>CVS</small>
+(see section [[#SEC118|Global options]]) is specified, the
+<code>CVSREAD</code> environment variable is specified
+(see section [[#SEC181|All environment variables which affect CVS]]), or a 
watch is in
+effect for that file (see section [[#SEC89|Mechanisms to track who is editing 
files]]).
+</p>
+<p>Note that running <code>checkout</code> on a directory that was already
+built by a prior <code>checkout</code> is also permitted.
+This is similar to specifying the &lsquo;<samp>-d</samp>&rsquo; option
+to the <code>update</code> command in the sense that new
+directories that have been created in the repository
+will appear in your work area.
+However, <code>checkout</code> takes a module name whereas
+<code>update</code> takes a directory name.  Also
+to use <code>checkout</code> this way it must be run from the
+top level directory (where you originally ran
+<code>checkout</code> from), so before you run
+<code>checkout</code> to update an existing directory, don&rsquo;t
+forget to change your directory to the top level
+directory.
+</p>
+<p>For the output produced by the <code>checkout</code> command
+see [[#SEC155|update output]].
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC123| checkout 
options]]::<nowiki>            checkout options
+</nowiki>&bull;[[#SEC124| checkout examples]]::<nowiki>           checkout 
examples
+</nowiki></pre>
+<hr size="6">
+<div id="checkout-options"></div>
+<div id="SEC123"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC122| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC124| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC122| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== checkout options ====
+
+<p>These standard options are supported by <code>checkout</code>
+(see section [[#SEC119|Common command options]], for a complete description of
+them):
+</p>
+<dl compact="compact">
+<dt> <code>-D <var>date</var></code></dt>
+<dd><p>Use the most recent revision no later than <var>date</var>.
+This option is sticky, and implies &lsquo;<samp>-P</samp>&rsquo;.  See
+[[#SEC53|Sticky tags]], for more information on sticky tags/dates.
+</p>
+</dd>
+<dt> <code>-f</code></dt>
+<dd><p>Only useful with the &lsquo;<samp>-D <var>date</var></samp>&rsquo; or 
&lsquo;<samp>-r
+<var>tag</var></samp>&rsquo; flags.  If no matching revision is found,
+retrieve the most recent revision (instead of ignoring
+the file).
+</p>
+</dd>
+<dt> <code>-k <var>kflag</var></code></dt>
+<dd><p>Process keywords according to <var>kflag</var>.  See
+[[#SEC98|Keyword substitution]].
+This option is sticky; future updates of
+this file in this working directory will use the same
+<var>kflag</var>.  The <code>status</code> command can be viewed
+to see the sticky options.  See [[#SEC156|Quick reference to CVS commands]], 
for
+more information on the <code>status</code> command.
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.
+</p>
+</dd>
+<dt> <code>-n</code></dt>
+<dd><p>Do not run any checkout program (as specified
+with the &lsquo;<samp>-o</samp>&rsquo; option in the modules file;
+see section [[#SEC158|The modules file]]).
+</p>
+</dd>
+<dt> <code>-P</code></dt>
+<dd><p>Prune empty directories.  See [[#SEC74|Moving and renaming 
directories]].
+</p>
+</dd>
+<dt> <code>-p</code></dt>
+<dd><p>Pipe files to the standard output.
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Checkout directories recursively.  This option is on by default.
+</p>
+</dd>
+<dt> <code>-r <var>tag</var></code></dt>
+<dd><p>Use revision <var>tag</var>.  This option is sticky, and implies 
&lsquo;<samp>-P</samp>&rsquo;.
+See [[#SEC53|Sticky tags]], for more information on sticky tags/dates.
+</p></dd>
+</dl>
+
+<p>In addition to those, you can use these special command
+options with <code>checkout</code>:
+</p>
+<dl compact="compact">
+<dt> <code>-A</code></dt>
+<dd><p>Reset any sticky tags, dates, or &lsquo;<samp>-k</samp>&rsquo; options.
+See [[#SEC53|Sticky tags]], for more information on sticky tags/dates.
+</p>
+</dd>
+<dt> <code>-c</code></dt>
+<dd><p>Copy the module file, sorted, to the standard output,
+instead of creating or modifying any files or
+directories in your working directory.
+</p>
+</dd>
+<dt> <code>-d <var>dir</var></code></dt>
+<dd><p>Create a directory called <var>dir</var> for the working
+files, instead of using the module name.  In general,
+using this flag is equivalent to using &lsquo;<samp>mkdir
+<var>dir</var>; cd <var>dir</var></samp>&rsquo; followed by the checkout
+command without the &lsquo;<samp>-d</samp>&rsquo; flag.
+</p>
+<p>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&rsquo;t contain empty
+intermediate directories.  In this case <em>only</em>,
+<small>CVS</small> tries to &ldquo;shorten&rdquo; pathnames to avoid those 
empty
+directories.
+</p>
+<p>For example, given a module &lsquo;<samp>foo</samp>&rsquo; that contains
+the file &lsquo;<samp>bar.c</samp>&rsquo;, the command &lsquo;<samp>cvs co -d 
dir
+foo</samp>&rsquo; will create directory &lsquo;<samp>dir</samp>&rsquo; and 
place
+&lsquo;<samp>bar.c</samp>&rsquo; inside.  Similarly, given a module
+&lsquo;<samp>bar</samp>&rsquo; which has subdirectory 
&lsquo;<samp>baz</samp>&rsquo; wherein
+there is a file &lsquo;<samp>quux.c</samp>&rsquo;, the command 
&lsquo;<samp>cvs co
+-d dir bar/baz</samp>&rsquo; will create directory 
&lsquo;<samp>dir</samp>&rsquo; and
+place &lsquo;<samp>quux.c</samp>&rsquo; inside.
+</p>
+<p>Using the &lsquo;<samp>-N</samp>&rsquo; flag will defeat this behavior.
+Given the same module definitions above, &lsquo;<samp>cvs co
+-N -d dir foo</samp>&rsquo; will create directories 
&lsquo;<samp>dir/foo</samp>&rsquo;
+and place &lsquo;<samp>bar.c</samp>&rsquo; inside, while &lsquo;<samp>cvs co 
-N -d
+dir bar/baz</samp>&rsquo; will create directories 
&lsquo;<samp>dir/bar/baz</samp>&rsquo;
+and place &lsquo;<samp>quux.c</samp>&rsquo; inside.
+</p>
+</dd>
+<dt> <code>-j <var>tag</var></code></dt>
+<dd><p>With two &lsquo;<samp>-j</samp>&rsquo; options, merge changes from the
+revision specified with the first &lsquo;<samp>-j</samp>&rsquo; option to
+the revision specified with the second &lsquo;<samp>j</samp>&rsquo; option,
+into the working directory.
+</p>
+<p>With one &lsquo;<samp>-j</samp>&rsquo; option, merge changes from the
+ancestor revision to the revision specified with the
+&lsquo;<samp>-j</samp>&rsquo; 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 &lsquo;<samp>-j</samp>&rsquo; option.
+</p>
+<p>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:
+&lsquo;<samp>-j<var>Symbolic_Tag</var>:<var>Date_Specifier</var></samp>&rsquo;.
+</p>
+<p>See section [[#SEC54|Branching and merging]].
+</p>
+</dd>
+<dt> <code>-N</code></dt>
+<dd><p>Only useful together with &lsquo;<samp>-d <var>dir</var></samp>&rsquo;. 
 With
+this option, <small>CVS</small> will not &ldquo;shorten&rdquo; module paths
+in your working directory when you check out a single
+module.  See the &lsquo;<samp>-d</samp>&rsquo; flag for examples and a
+discussion.
+</p>
+</dd>
+<dt> <code>-s</code></dt>
+<dd><p>Like &lsquo;<samp>-c</samp>&rsquo;, but include the status of all 
modules,
+and sort it by the status string.  See section [[#SEC158|The modules file]], 
for
+info about the &lsquo;<samp>-s</samp>&rsquo; option that is used inside the
+modules file to set the module status.
+</p></dd>
+</dl>
+
+<hr size="6">
+<div id="checkout-examples"></div>
+<div id="SEC124"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC123| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC125| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC122| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== checkout examples ====
+
+<p>Get a copy of the module &lsquo;<samp>tc</samp>&rsquo;:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs checkout tc
+</nowiki></pre></td></tr></table>
+
+<p>Get a copy of the module &lsquo;<samp>tc</samp>&rsquo; as it looked one day
+ago:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs checkout -D 
yesterday tc
+</nowiki></pre></td></tr></table>
+
+<hr size="6">
+<div id="commit"></div>
+<div id="SEC125"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC124| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC126| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC114| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== commit&mdash;Check files into the repository ===
+
+<ul>
+<li>
+Synopsis: commit [-lnRf] [-m &rsquo;log_message&rsquo; |
+-F file] [-r revision] [files&hellip;]
+</li><li>
+Requires: working directory, repository.
+</li><li>
+Changes: repository.
+</li><li>
+Synonym: ci
+</li></ul>
+
+<p>Use <code>commit</code> when you want to incorporate changes
+from your working source files into the source
+repository.
+</p>
+<p>If you don&rsquo;t specify particular files to commit, all of
+the files in your working current directory are
+examined.  <code>commit</code> is careful to change in the
+repository only those files that you have really
+changed.  By default (or if you explicitly specify the
+&lsquo;<samp>-R</samp>&rsquo; option), files in subdirectories are also
+examined and committed if they have changed; you can
+use the &lsquo;<samp>-l</samp>&rsquo; option to limit <code>commit</code> to 
the
+current directory only.
+</p>
+<p><code>commit</code> verifies that the selected files are up
+to date with the current revisions in the source
+repository; it will notify you, and exit without
+committing, if any of the specified files must be made
+current first with <code>update</code> (see section 
[[#SEC153|update&mdash;Bring work tree in sync with repository]]).
+<code>commit</code> does not call the <code>update</code> command
+for you, but rather leaves that for you to do when the
+time is right.
+</p>
+<p>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 (see section [[#SEC158|The modules file]], and see section 
[[#SEC172|Loginfo]])
+and placed in the <small>RCS</small> file inside the
+repository.  This log message can be retrieved with the
+<code>log</code> command; see [[#SEC143|log&mdash;Print out log information 
for files]].  You can specify the
+log message on the command line with the &lsquo;<samp>-m
+<var>message</var></samp>&rsquo; option, and thus avoid the editor invocation,
+or use the &lsquo;<samp>-F <var>file</var></samp>&rsquo; option to specify
+that the argument file contains the log message.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC126| commit 
options]]::<nowiki>              commit options
+</nowiki>&bull;[[#SEC127| commit examples]]::<nowiki>             commit 
examples
+</nowiki></pre>
+<hr size="6">
+<div id="commit-options"></div>
+<div id="SEC126"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC125| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC127| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC125| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== commit options ====
+
+<p>These standard options are supported by <code>commit</code>
+(see section [[#SEC119|Common command options]], for a complete description of
+them):
+</p>
+<dl compact="compact">
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Commit directories recursively.  This is on by default.
+</p>
+</dd>
+<dt> <code>-r <var>revision</var></code></dt>
+<dd><p>Commit to <var>revision</var>.  <var>revision</var> must be
+either a branch, or a revision on the main trunk that
+is higher than any existing revision number
+(see section [[#SEC47|Assigning revisions]]).  You
+cannot commit to a specific revision on a branch.
+</p></dd>
+</dl>
+
+<p><code>commit</code> also supports these options:
+</p>
+<dl compact="compact">
+<dt> <code>-F <var>file</var></code></dt>
+<dd><p>Read the log message from <var>file</var>, instead
+of invoking an editor.
+</p>
+</dd>
+<dt> <code>-f</code></dt>
+<dd><p>Note that this is not the standard behavior of
+the &lsquo;<samp>-f</samp>&rsquo; option as defined in [[#SEC119|Common 
command options]].
+</p>
+<p>Force <small>CVS</small> to commit a new revision even if you haven&rsquo;t
+made any changes to the file.  If the current revision
+of <var>file</var> is 1.7, then the following two commands
+are equivalent:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs commit -f 
<var>file</var>
+$ cvs commit -r 1.8 <var>file</var>
+</nowiki></pre></td></tr></table>
+
+<p>The &lsquo;<samp>-f</samp>&rsquo; option disables recursion (i.e., it
+implies &lsquo;<samp>-l</samp>&rsquo;).  To force <small>CVS</small> to commit 
a new
+revision for all files in all subdirectories, you must
+use &lsquo;<samp>-f -R</samp>&rsquo;.
+</p>
+</dd>
+<dt> <code>-m <var>message</var></code></dt>
+<dd><p>Use <var>message</var> as the log message, instead of
+invoking an editor.
+</p></dd>
+</dl>
+
+<hr size="6">
+<div id="commit-examples"></div>
+<div id="SEC127"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC126| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC128| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC125| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== commit examples ====
+
+
+<hr size="6">
+<div id="SEC128"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC127| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC129| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC127| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+===== Committing to a branch =====
+
+<p>You can commit to a branch revision (one that has an
+even number of dots) with the &lsquo;<samp>-r</samp>&rsquo; option.  To
+create a branch revision, use the &lsquo;<samp>-b</samp>&rsquo; option
+of the <code>rtag</code> or <code>tag</code> commands
+(see section [[#SEC54|Branching and merging]]).  Then, either 
<code>checkout</code> or
+<code>update</code> can be used to base your sources on the
+newly created branch.  From that point on, all
+<code>commit</code> 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:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ 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
+</nowiki></pre></td></tr></table>
+
+<p>This works automatically since the &lsquo;<samp>-r</samp>&rsquo; option is
+sticky.
+</p>
+<hr size="6">
+<div id="SEC129"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC128| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC130| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC127| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+===== Creating the branch after editing =====
+
+<p>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 <small>CVS</small> conflict resolution.  The scenario might
+look like:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>[[ hacked sources 
are present ]]
+$ cvs tag -b EXPR1
+$ cvs update -r EXPR1
+$ cvs commit
+</nowiki></pre></td></tr></table>
+
+<p>The <code>update</code> command will make the &lsquo;<samp>-r
+EXPR1</samp>&rsquo; option sticky on all files.  Note that your
+changes to the files will never be removed by the
+<code>update</code> command.  The <code>commit</code> will
+automatically commit to the correct branch, because the
+&lsquo;<samp>-r</samp>&rsquo; is sticky.  You could also do like this:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>[[ hacked sources 
are present ]]
+$ cvs tag -b EXPR1
+$ cvs commit -r EXPR1
+</nowiki></pre></td></tr></table>
+
+<p>but then, only those files that were changed by you
+will have the &lsquo;<samp>-r EXPR1</samp>&rsquo; sticky flag.  If you hack
+away, and commit without specifying the &lsquo;<samp>-r EXPR1</samp>&rsquo;
+flag, some files may accidentally end up on the main
+trunk.
+</p>
+<p>To work with you on the experimental change, others
+would simply do
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs checkout -r 
EXPR1 whatever_module
+</nowiki></pre></td></tr></table>
+
+<hr size="6">
+<div id="diff"></div>
+<div id="SEC130"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC129| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC131| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC114| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== diff&mdash;Show differences between revisions ===
+
+<ul>
+<li>
+Synopsis: diff [-lR] [-k kflag] [format_options] [[-r rev1 | -D date1] [-r 
rev2 |  -D date2]] [files&hellip;]
+</li><li>
+Requires: working directory, repository.
+</li><li>
+Changes: nothing.
+</li></ul>
+
+<p>The <code>diff</code> 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.
+</p>
+<p>If any file names are given, only those files are
+compared.  If any directories are given, all files
+under them will be compared.
+</p>
+<p>The exit status for diff is different than for other
+<small>CVS</small> commands; for details [[#SEC116|CVS&rsquo;s exit status]].
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC131| diff 
options]]::<nowiki>                diff options
+</nowiki>&bull;[[#SEC134| diff examples]]::<nowiki>               diff examples
+</nowiki></pre>
+<hr size="6">
+<div id="diff-options"></div>
+<div id="SEC131"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC130| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC132| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC130| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== diff options ====
+
+<p>These standard options are supported by <code>diff</code>
+(see section [[#SEC119|Common command options]], for a complete description of
+them):
+</p>
+<dl compact="compact">
+<dt> <code>-D <var>date</var></code></dt>
+<dd><p>Use the most recent revision no later than <var>date</var>.
+See &lsquo;<samp>-r</samp>&rsquo; for how this affects the comparison.
+</p>
+</dd>
+<dt> <code>-k <var>kflag</var></code></dt>
+<dd><p>Process keywords according to <var>kflag</var>.  See
+[[#SEC98|Keyword substitution]].
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Examine directories recursively.  This option is on by
+default.
+</p>
+</dd>
+<dt> <code>-r <var>tag</var></code></dt>
+<dd><p>Compare with revision <var>tag</var>.  Zero, one or two
+&lsquo;<samp>-r</samp>&rsquo; options can be present.  With no 
&lsquo;<samp>-r</samp>&rsquo;
+option, the working file will be compared with the
+revision it was based on.  With one &lsquo;<samp>-r</samp>&rsquo;, that
+revision will be compared to your current working file.
+With two &lsquo;<samp>-r</samp>&rsquo; options those two revisions will be
+compared (and your working file will not affect the
+outcome in any way).
+</p>
+<p>One or both &lsquo;<samp>-r</samp>&rsquo; options can be replaced by a
+&lsquo;<samp>-D <var>date</var></samp>&rsquo; option, described above.
+</p></dd>
+</dl>
+
+<p>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 &lsquo;<samp>-</samp>&rsquo;, and the other of which is a long 
name preceded by
+&lsquo;<samp>--</samp>&rsquo;.
+</p>
+<dl compact="compact">
+<dt> &lsquo;<samp>-<var>lines</var></samp>&rsquo;</dt>
+<dd><p>Show <var>lines</var> (an integer) lines of context.  This option does 
not
+specify an output format by itself; it has no effect unless it is
+combined with &lsquo;<samp>-c</samp>&rsquo; or &lsquo;<samp>-u</samp>&rsquo;.  
This option is obsolete.  For proper
+operation, <code>patch</code> typically needs at least two lines of context.
+</p>
+</dd>
+<dt> &lsquo;<samp>-a</samp>&rsquo;</dt>
+<dd><p>Treat all files as text and compare them line-by-line, even if they
+do not seem to be text.
+</p>
+</dd>
+<dt> &lsquo;<samp>-b</samp>&rsquo;</dt>
+<dd><p>Ignore trailing white space and consider all other sequences of one or
+more white space characters to be equivalent.
+</p>
+</dd>
+<dt> &lsquo;<samp>-B</samp>&rsquo;</dt>
+<dd><p>Ignore changes that just insert or delete blank lines.
+</p>
+</dd>
+<dt> &lsquo;<samp>--binary</samp>&rsquo;</dt>
+<dd><p>Read and write data in binary mode.
+</p>
+</dd>
+<dt> &lsquo;<samp>--brief</samp>&rsquo;</dt>
+<dd><p>Report only whether the files differ, not the details of the
+differences.
+</p>
+</dd>
+<dt> &lsquo;<samp>-c</samp>&rsquo;</dt>
+<dd><p>Use the context output format.
+</p>
+</dd>
+<dt> &lsquo;<samp>-C <var>lines</var></samp>&rsquo;</dt>
+<dt> &lsquo;<samp>--context<span class="roman">[</span>=<var>lines</var><span 
class="roman">]</span></samp>&rsquo;</dt>
+<dd><p>Use the context output format, showing <var>lines</var> (an integer) 
lines of
+context, or three if <var>lines</var> is not given.
+For proper operation, <code>patch</code> typically needs at least two lines of
+context.
+</p>
+</dd>
+<dt> &lsquo;<samp>--changed-group-format=<var>format</var></samp>&rsquo;</dt>
+<dd><p>Use <var>format</var> to output a line group containing differing lines 
from
+both files in if-then-else format.  See section [[#SEC132|Line group formats]].
+</p>
+</dd>
+<dt> &lsquo;<samp>-d</samp>&rsquo;</dt>
+<dd><p>Change the algorithm to perhaps find a smaller set of changes.  This 
makes
+<code>diff</code> slower (sometimes much slower).
+</p>
+</dd>
+<dt> &lsquo;<samp>-e</samp>&rsquo;</dt>
+<dt> &lsquo;<samp>--ed</samp>&rsquo;</dt>
+<dd><p>Make output that is a valid <code>ed</code> script.
+</p>
+</dd>
+<dt> &lsquo;<samp>--expand-tabs</samp>&rsquo;</dt>
+<dd><p>Expand tabs to spaces in the output, to preserve the alignment of tabs
+in the input files.
+</p>
+</dd>
+<dt> &lsquo;<samp>-f</samp>&rsquo;</dt>
+<dd><p>Make output that looks vaguely like an <code>ed</code> script but has 
changes
+in the order they appear in the file.
+</p>
+</dd>
+<dt> &lsquo;<samp>-F <var>regexp</var></samp>&rsquo;</dt>
+<dd><p>In context and unified format, for each hunk of differences, show some
+of the last preceding line that matches <var>regexp</var>.
+</p>
+</dd>
+<dt> &lsquo;<samp>--forward-ed</samp>&rsquo;</dt>
+<dd><p>Make output that looks vaguely like an <code>ed</code> script but has 
changes
+in the order they appear in the file.
+</p>
+</dd>
+<dt> &lsquo;<samp>-H</samp>&rsquo;</dt>
+<dd><p>Use heuristics to speed handling of large files that have numerous
+scattered small changes.
+</p>
+</dd>
+<dt> &lsquo;<samp>--horizon-lines=<var>lines</var></samp>&rsquo;</dt>
+<dd><p>Do not discard the last <var>lines</var> lines of the common prefix
+and the first <var>lines</var> lines of the common suffix.
+</p>
+</dd>
+<dt> &lsquo;<samp>-i</samp>&rsquo;</dt>
+<dd><p>Ignore changes in case; consider upper- and lower-case letters
+equivalent.
+</p>
+</dd>
+<dt> &lsquo;<samp>-I <var>regexp</var></samp>&rsquo;</dt>
+<dd><p>Ignore changes that just insert or delete lines that match 
<var>regexp</var>.
+</p>
+</dd>
+<dt> &lsquo;<samp>--ifdef=<var>name</var></samp>&rsquo;</dt>
+<dd><p>Make merged if-then-else output using <var>name</var>.
+</p>
+</dd>
+<dt> &lsquo;<samp>--ignore-all-space</samp>&rsquo;</dt>
+<dd><p>Ignore white space when comparing lines.
+</p>
+</dd>
+<dt> &lsquo;<samp>--ignore-blank-lines</samp>&rsquo;</dt>
+<dd><p>Ignore changes that just insert or delete blank lines.
+</p>
+</dd>
+<dt> &lsquo;<samp>--ignore-case</samp>&rsquo;</dt>
+<dd><p>Ignore changes in case; consider upper- and lower-case to be the same.
+</p>
+</dd>
+<dt> &lsquo;<samp>--ignore-matching-lines=<var>regexp</var></samp>&rsquo;</dt>
+<dd><p>Ignore changes that just insert or delete lines that match 
<var>regexp</var>.
+</p>
+</dd>
+<dt> &lsquo;<samp>--ignore-space-change</samp>&rsquo;</dt>
+<dd><p>Ignore trailing white space and consider all other sequences of one or
+more white space characters to be equivalent.
+</p>
+</dd>
+<dt> &lsquo;<samp>--initial-tab</samp>&rsquo;</dt>
+<dd><p>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.
+</p>
+</dd>
+<dt> &lsquo;<samp>-L <var>label</var></samp>&rsquo;</dt>
+<dd><p>Use <var>label</var> instead of the file name in the context format
+and unified format headers.
+</p>
+</dd>
+<dt> &lsquo;<samp>--label=<var>label</var></samp>&rsquo;</dt>
+<dd><p>Use <var>label</var> instead of the file name in the context format
+and unified format headers.
+</p>
+</dd>
+<dt> &lsquo;<samp>--left-column</samp>&rsquo;</dt>
+<dd><p>Print only the left column of two common lines in side by side format.
+</p>
+</dd>
+<dt> &lsquo;<samp>--line-format=<var>format</var></samp>&rsquo;</dt>
+<dd><p>Use <var>format</var> to output all input lines in if-then-else format.
+See section [[#SEC133|Line formats]].
+</p>
+</dd>
+<dt> &lsquo;<samp>--minimal</samp>&rsquo;</dt>
+<dd><p>Change the algorithm to perhaps find a smaller set of changes.  This
+makes <code>diff</code> slower (sometimes much slower).
+</p>
+</dd>
+<dt> &lsquo;<samp>-n</samp>&rsquo;</dt>
+<dd><p>Output RCS-format diffs; like &lsquo;<samp>-f</samp>&rsquo; except that 
each command
+specifies the number of lines affected.
+</p>
+</dd>
+<dt> &lsquo;<samp>-N</samp>&rsquo;</dt>
+<dt> &lsquo;<samp>--new-file</samp>&rsquo;</dt>
+<dd><p>In directory comparison, if a file is found in only one directory,
+treat it as present but empty in the other directory.
+</p>
+</dd>
+<dt> &lsquo;<samp>--new-group-format=<var>format</var></samp>&rsquo;</dt>
+<dd><p>Use <var>format</var> to output a group of lines taken from just the 
second
+file in if-then-else format.  See section [[#SEC132|Line group formats]].
+</p>
+</dd>
+<dt> &lsquo;<samp>--new-line-format=<var>format</var></samp>&rsquo;</dt>
+<dd><p>Use <var>format</var> to output a line taken from just the second file 
in
+if-then-else format.  See section [[#SEC133|Line formats]].
+</p>
+</dd>
+<dt> &lsquo;<samp>--old-group-format=<var>format</var></samp>&rsquo;</dt>
+<dd><p>Use <var>format</var> to output a group of lines taken from just the 
first
+file in if-then-else format.  See section [[#SEC132|Line group formats]].
+</p>
+</dd>
+<dt> &lsquo;<samp>--old-line-format=<var>format</var></samp>&rsquo;</dt>
+<dd><p>Use <var>format</var> to output a line taken from just the first file in
+if-then-else format.  See section [[#SEC133|Line formats]].
+</p>
+</dd>
+<dt> &lsquo;<samp>-p</samp>&rsquo;</dt>
+<dd><p>Show which C function each change is in.
+</p>
+</dd>
+<dt> &lsquo;<samp>--rcs</samp>&rsquo;</dt>
+<dd><p>Output RCS-format diffs; like &lsquo;<samp>-f</samp>&rsquo; except that 
each command
+specifies the number of lines affected.
+</p>
+</dd>
+<dt> &lsquo;<samp>--report-identical-files</samp>&rsquo;</dt>
+<dt> &lsquo;<samp>-s</samp>&rsquo;</dt>
+<dd><p>Report when two files are the same.
+</p>
+</dd>
+<dt> &lsquo;<samp>--show-c-function</samp>&rsquo;</dt>
+<dd><p>Show which C function each change is in.
+</p>
+</dd>
+<dt> &lsquo;<samp>--show-function-line=<var>regexp</var></samp>&rsquo;</dt>
+<dd><p>In context and unified format, for each hunk of differences, show some
+of the last preceding line that matches <var>regexp</var>.
+</p>
+</dd>
+<dt> &lsquo;<samp>--side-by-side</samp>&rsquo;</dt>
+<dd><p>Use the side by side output format.
+</p>
+</dd>
+<dt> &lsquo;<samp>--speed-large-files</samp>&rsquo;</dt>
+<dd><p>Use heuristics to speed handling of large files that have numerous
+scattered small changes.
+</p>
+</dd>
+<dt> &lsquo;<samp>--suppress-common-lines</samp>&rsquo;</dt>
+<dd><p>Do not print common lines in side by side format.
+</p>
+</dd>
+<dt> &lsquo;<samp>-t</samp>&rsquo;</dt>
+<dd><p>Expand tabs to spaces in the output, to preserve the alignment of tabs
+in the input files.
+</p>
+</dd>
+<dt> &lsquo;<samp>-T</samp>&rsquo;</dt>
+<dd><p>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.
+</p>
+</dd>
+<dt> &lsquo;<samp>--text</samp>&rsquo;</dt>
+<dd><p>Treat all files as text and compare them line-by-line, even if they
+do not appear to be text.
+</p>
+</dd>
+<dt> &lsquo;<samp>-u</samp>&rsquo;</dt>
+<dd><p>Use the unified output format.
+</p>
+</dd>
+<dt> &lsquo;<samp>--unchanged-group-format=<var>format</var></samp>&rsquo;</dt>
+<dd><p>Use <var>format</var> to output a group of common lines taken from both 
files
+in if-then-else format.  See section [[#SEC132|Line group formats]].
+</p>
+</dd>
+<dt> &lsquo;<samp>--unchanged-line-format=<var>format</var></samp>&rsquo;</dt>
+<dd><p>Use <var>format</var> to output a line common to both files in 
if-then-else
+format.  See section [[#SEC133|Line formats]].
+</p>
+</dd>
+<dt> &lsquo;<samp>-U <var>lines</var></samp>&rsquo;</dt>
+<dt> &lsquo;<samp>--unified<span class="roman">[</span>=<var>lines</var><span 
class="roman">]</span></samp>&rsquo;</dt>
+<dd><p>Use the unified output format, showing <var>lines</var> (an integer) 
lines of
+context, or three if <var>lines</var> is not given.
+For proper operation, <code>patch</code> typically needs at least two lines of
+context.
+</p>
+</dd>
+<dt> &lsquo;<samp>-w</samp>&rsquo;</dt>
+<dd><p>Ignore white space when comparing lines.
+</p>
+</dd>
+<dt> &lsquo;<samp>-W <var>columns</var></samp>&rsquo;</dt>
+<dt> &lsquo;<samp>--width=<var>columns</var></samp>&rsquo;</dt>
+<dd><p>Use an output width of <var>columns</var> in side by side format.
+</p>
+</dd>
+<dt> &lsquo;<samp>-y</samp>&rsquo;</dt>
+<dd><p>Use the side by side output format.
+</p></dd>
+</dl>
+
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC132| Line group 
formats]]::<nowiki>          Line group formats
+</nowiki>&bull;[[#SEC133| Line formats]]::<nowiki>                Line formats
+</nowiki></pre>
+<hr size="6">
+<div id="Line-group-formats"></div>
+<div id="SEC132"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC131| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC133| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC131| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+===== Line group formats =====
+
+<p>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.
+</p>
+<p>For example, the following command compares the TeX file 
&lsquo;<tt>myfile</tt>&rsquo;
+with the original version from the repository,
+and outputs a merged file in which old regions are
+surrounded by 
&lsquo;<samp>\begin{em}</samp>&rsquo;-&lsquo;<samp>\end{em}</samp>&rsquo; 
lines, and new
+regions are surrounded by 
&lsquo;<samp>\begin{bf}</samp>&rsquo;-&lsquo;<samp>\end{bf}</samp>&rsquo; lines.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs diff \
+   --old-group-format='\begin{em}
+%&lt;\end{em}
+' \
+   --new-group-format='\begin{bf}
+%&gt;\end{bf}
+' \
+   myfile
+</nowiki></pre></td></tr></table>
+
+<p>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.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs diff \
+   --old-group-format='\begin{em}
+%&lt;\end{em}
+' \
+   --new-group-format='\begin{bf}
+%&gt;\end{bf}
+' \
+   --unchanged-group-format='%=' \
+   --changed-group-format='\begin{em}
+%&lt;\end{em}
+\begin{bf}
+%&gt;\end{bf}
+' \
+   myfile
+</nowiki></pre></td></tr></table>
+
+<p>Here is a more advanced example, which outputs a diff listing with
+headers containing line numbers in a &ldquo;plain English&rdquo; style.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs diff \
+   --unchanged-group-format='' \
+   --old-group-format='-------- %dn line%(n=1?:s) deleted at %df:
+%&lt;' \
+   --new-group-format='-------- %dN line%(N=1?:s) added after %de:
+%&gt;' \
+   --changed-group-format='-------- %dn line%(n=1?:s) changed at %df:
+%&lt;-------- to:
+%&gt;' \
+   myfile
+</nowiki></pre></td></tr></table>
+
+<p>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 <var>format</var>, because it
+typically contains shell metacharacters.
+</p>
+<dl compact="compact">
+<dt> &lsquo;<samp>--old-group-format=<var>format</var></samp>&rsquo;</dt>
+<dd><p>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.
+</p>
+</dd>
+<dt> &lsquo;<samp>--new-group-format=<var>format</var></samp>&rsquo;</dt>
+<dd><p>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.
+</p>
+</dd>
+<dt> &lsquo;<samp>--changed-group-format=<var>format</var></samp>&rsquo;</dt>
+<dd><p>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.
+</p>
+</dd>
+<dt> &lsquo;<samp>--unchanged-group-format=<var>format</var></samp>&rsquo;</dt>
+<dd><p>These line groups contain lines common to both files.  The default
+unchanged group format is a format that outputs the line group as-is.
+</p></dd>
+</dl>
+
+<p>In a line group format, ordinary characters represent themselves;
+conversion specifications start with &lsquo;<samp>%</samp>&rsquo; and have one 
of the
+following forms.
+</p>
+<dl compact="compact">
+<dt> &lsquo;<samp>%&lt;</samp>&rsquo;</dt>
+<dd><p>stands for the lines from the first file, including the trailing 
newline.
+Each line is formatted according to the old line format (see section 
[[#SEC133|Line formats]]).
+</p>
+</dd>
+<dt> &lsquo;<samp>%&gt;</samp>&rsquo;</dt>
+<dd><p>stands for the lines from the second file, including the trailing 
newline.
+Each line is formatted according to the new line format.
+</p>
+</dd>
+<dt> &lsquo;<samp>%=</samp>&rsquo;</dt>
+<dd><p>stands for the lines common to both files, including the trailing 
newline.
+Each line is formatted according to the unchanged line format.
+</p>
+</dd>
+<dt> &lsquo;<samp>%%</samp>&rsquo;</dt>
+<dd><p>stands for &lsquo;<samp>%</samp>&rsquo;.
+</p>
+</dd>
+<dt> &lsquo;<samp>%c'<var>C</var>'</samp>&rsquo;</dt>
+<dd><p>where <var>C</var> is a single character, stands for <var>C</var>.
+<var>C</var> may not be a backslash or an apostrophe.
+For example, &lsquo;<samp>%c':'</samp>&rsquo; stands for a colon, even inside
+the then-part of an if-then-else format, which a colon would
+normally terminate.
+</p>
+</dd>
+<dt> &lsquo;<samp>%c'\<var>O</var>'</samp>&rsquo;</dt>
+<dd><p>where <var>O</var> is a string of 1, 2, or 3 octal digits,
+stands for the character with octal code <var>O</var>.
+For example, &lsquo;<samp>%c'\0'</samp>&rsquo; stands for a null character.
+</p>
+</dd>
+<dt> &lsquo;<samp><var>F</var><var>n</var></samp>&rsquo;</dt>
+<dd><p>where <var>F</var> is a <code>printf</code> conversion specification 
and <var>n</var> is one
+of the following letters, stands for <var>n</var>&rsquo;s value formatted with 
<var>F</var>.
+</p>
+<dl compact="compact">
+<dt> &lsquo;<samp>e</samp>&rsquo;</dt>
+<dd><p>The line number of the line just before the group in the old file.
+</p>
+</dd>
+<dt> &lsquo;<samp>f</samp>&rsquo;</dt>
+<dd><p>The line number of the first line in the group in the old file;
+equals <var>e</var> + 1.
+</p>
+</dd>
+<dt> &lsquo;<samp>l</samp>&rsquo;</dt>
+<dd><p>The line number of the last line in the group in the old file.
+</p>
+</dd>
+<dt> &lsquo;<samp>m</samp>&rsquo;</dt>
+<dd><p>The line number of the line just after the group in the old file;
+equals <var>l</var> + 1.
+</p>
+</dd>
+<dt> &lsquo;<samp>n</samp>&rsquo;</dt>
+<dd><p>The number of lines in the group in the old file; equals <var>l</var> - 
<var>f</var> + 1.
+</p>
+</dd>
+<dt> &lsquo;<samp>E, F, L, M, N</samp>&rsquo;</dt>
+<dd><p>Likewise, for lines in the new file.
+</p>
+</dd>
+</dl>
+
+<p>The <code>printf</code> conversion specification can be 
&lsquo;<samp>%d</samp>&rsquo;,
+&lsquo;<samp>%o</samp>&rsquo;, &lsquo;<samp>%x</samp>&rsquo;, or 
&lsquo;<samp>%X</samp>&rsquo;, specifying decimal, octal,
+lower case hexadecimal, or upper case hexadecimal output
+respectively.  After the &lsquo;<samp>%</samp>&rsquo; the following options 
can appear in
+sequence: a &lsquo;<samp>-</samp>&rsquo; 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, &lsquo;<samp>%5dN</samp>&rsquo; prints the number of new lines in 
the group
+in a field of width 5 characters, using the <code>printf</code> format 
<code>&quot;%5d&quot;</code>.
+</p>
+</dd>
+<dt> 
&lsquo;<samp>(<var>A</var>=<var>B</var>?<var>T</var>:<var>E</var>)</samp>&rsquo;</dt>
+<dd><p>If <var>A</var> equals <var>B</var> then <var>T</var> else <var>E</var>.
+<var>A</var> and <var>B</var> are each either a decimal constant
+or a single letter interpreted as above.
+This format spec is equivalent to <var>T</var> if
+<var>A</var>&rsquo;s value equals <var>B</var>&rsquo;s; otherwise it is 
equivalent to <var>E</var>.
+</p>
+<p>For example, &lsquo;<samp>%(N=0?no:%dN) line%(N=1?:s)</samp>&rsquo; is 
equivalent to
+&lsquo;<samp>no lines</samp>&rsquo; if <var>N</var> (the number of lines in 
the group in the
+new file) is 0, to &lsquo;<samp>1 line</samp>&rsquo; if <var>N</var> is 1, and 
to &lsquo;<samp>%dN lines</samp>&rsquo;
+otherwise.
+</p></dd>
+</dl>
+
+<hr size="6">
+<div id="Line-formats"></div>
+<div id="SEC133"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC132| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC134| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC131| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+===== Line formats =====
+
+<p>Line formats control how each line taken from an input file is
+output as part of a line group in if-then-else format.
+</p>
+<p>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 &lsquo;<samp>-</samp>&rsquo; for deleted lines, 
&lsquo;<samp>|</samp>&rsquo; for added lines, and a space
+for unchanged lines.  The formats contain newline characters where
+newlines are desired on output.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs diff \
+   --old-line-format='-%l
+' \
+   --new-line-format='|%l
+' \
+   --unchanged-line-format=' %l
+' \
+   myfile
+</nowiki></pre></td></tr></table>
+
+<p>To specify a line format, use one of the following options.  You should
+quote <var>format</var>, since it often contains shell metacharacters.
+</p>
+<dl compact="compact">
+<dt> &lsquo;<samp>--old-line-format=<var>format</var></samp>&rsquo;</dt>
+<dd><p>formats lines just from the first file.
+</p>
+</dd>
+<dt> &lsquo;<samp>--new-line-format=<var>format</var></samp>&rsquo;</dt>
+<dd><p>formats lines just from the second file.
+</p>
+</dd>
+<dt> &lsquo;<samp>--unchanged-line-format=<var>format</var></samp>&rsquo;</dt>
+<dd><p>formats lines common to both files.
+</p>
+</dd>
+<dt> &lsquo;<samp>--line-format=<var>format</var></samp>&rsquo;</dt>
+<dd><p>formats all lines; in effect, it sets all three above options 
simultaneously.
+</p></dd>
+</dl>
+
+<p>In a line format, ordinary characters represent themselves;
+conversion specifications start with &lsquo;<samp>%</samp>&rsquo; and have one 
of the
+following forms.
+</p>
+<dl compact="compact">
+<dt> &lsquo;<samp>%l</samp>&rsquo;</dt>
+<dd><p>stands for the contents of the line, not counting its trailing
+newline (if any).  This format ignores whether the line is incomplete.
+</p>
+</dd>
+<dt> &lsquo;<samp>%L</samp>&rsquo;</dt>
+<dd><p>stands for the contents of the line, including its trailing newline
+(if any).  If a line is incomplete, this format preserves its
+incompleteness.
+</p>
+</dd>
+<dt> &lsquo;<samp>%%</samp>&rsquo;</dt>
+<dd><p>stands for &lsquo;<samp>%</samp>&rsquo;.
+</p>
+</dd>
+<dt> &lsquo;<samp>%c'<var>C</var>'</samp>&rsquo;</dt>
+<dd><p>where <var>C</var> is a single character, stands for <var>C</var>.
+<var>C</var> may not be a backslash or an apostrophe.
+For example, &lsquo;<samp>%c':'</samp>&rsquo; stands for a colon.
+</p>
+</dd>
+<dt> &lsquo;<samp>%c'\<var>O</var>'</samp>&rsquo;</dt>
+<dd><p>where <var>O</var> is a string of 1, 2, or 3 octal digits,
+stands for the character with octal code <var>O</var>.
+For example, &lsquo;<samp>%c'\0'</samp>&rsquo; stands for a null character.
+</p>
+</dd>
+<dt> &lsquo;<samp><var>F</var>n</samp>&rsquo;</dt>
+<dd><p>where <var>F</var> is a <code>printf</code> conversion specification,
+stands for the line number formatted with <var>F</var>.
+For example, &lsquo;<samp>%.5dn</samp>&rsquo; prints the line number using the
+<code>printf</code> format <code>&quot;%.5d&quot;</code>.  See section 
[[#SEC132|Line group formats]], for
+more about printf conversion specifications.
+</p>
+</dd>
+</dl>
+
+<p>The default line format is &lsquo;<samp>%l</samp>&rsquo; followed by a 
newline character.
+</p>
+<p>If the input contains tab characters and it is important that they line
+up on output, you should ensure that &lsquo;<samp>%l</samp>&rsquo; or 
&lsquo;<samp>%L</samp>&rsquo; in a line
+format is just after a tab stop (e.g. by preceding 
&lsquo;<samp>%l</samp>&rsquo; or
+&lsquo;<samp>%L</samp>&rsquo; with a tab character), or you should use the 
&lsquo;<samp>-t</samp>&rsquo; or
+&lsquo;<samp>--expand-tabs</samp>&rsquo; option.
+</p>
+<p>Taken together, the line and line group formats let you specify many
+different formats.  For example, the following command uses a format
+similar to <code>diff</code>&rsquo;s normal format.  You can tailor this 
command
+to get fine control over <code>diff</code>&rsquo;s output.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs diff \
+   --old-line-format='&lt; %l
+' \
+   --new-line-format='&gt; %l
+' \
+   --old-group-format='%df%(f=l?:,%dl)d%dE
+%&lt;' \
+   --new-group-format='%dea%dF%(F=L?:,%dL)
+%&gt;' \
+   --changed-group-format='%df%(f=l?:,%dl)c%dF%(F=L?:,%dL)
+%&lt;---
+%&gt;' \
+   --unchanged-group-format='' \
+   myfile
+</nowiki></pre></td></tr></table>
+
+<hr size="6">
+<div id="diff-examples"></div>
+<div id="SEC134"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC133| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC135| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC130| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== diff examples ====
+
+<p>The following line produces a Unidiff (&lsquo;<samp>-u</samp>&rsquo; flag)
+between revision 1.14 and 1.19 of
+&lsquo;<tt>backend.c</tt>&rsquo;.  Due to the &lsquo;<samp>-kk</samp>&rsquo; 
flag no
+keywords are substituted, so differences that only depend
+on keyword substitution are ignored.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs diff -kk -u 
-r 1.14 -r 1.19 backend.c
+</nowiki></pre></td></tr></table>
+
+<p>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:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs diff -r 
RELEASE_1_0 -r EXPR1
+</nowiki></pre></td></tr></table>
+
+<p>A command like this can be used to produce a context
+diff between two releases:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs diff -c -r 
RELEASE_1_0 -r RELEASE_1_1 &gt; diffs
+</nowiki></pre></td></tr></table>
+
+<p>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.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs diff -u | less
+</nowiki></pre></td></tr></table>
+
+<hr size="6">
+<div id="export"></div>
+<div id="SEC135"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC134| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC136| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC114| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== export&mdash;Export sources from CVS, similar to checkout ===
+
+<ul>
+<li>
+Synopsis: export [-flNnR] [-r rev|-D date] [-k subst] [-d dir] module&hellip;
+</li><li>
+Requires: repository.
+</li><li>
+Changes: current directory.
+</li></ul>
+
+<p>This command is a variant of <code>checkout</code>; use it
+when you want a copy of the source for module without
+the <small>CVS</small> administrative directories.  For example, you
+might use <code>export</code> to prepare source for shipment
+off-site.  This command requires that you specify a
+date or tag (with &lsquo;<samp>-D</samp>&rsquo; or 
&lsquo;<samp>-r</samp>&rsquo;), so that you
+can count on reproducing the source you ship to others
+(and thus it always prunes empty directories).
+</p>
+<p>One often would like to use &lsquo;<samp>-kv</samp>&rsquo; with <code>cvs
+export</code>.  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&rsquo;t handle an export containing binary
+files correctly.  Also be aware that after having used
+&lsquo;<samp>-kv</samp>&rsquo;, one can no longer use the <code>ident</code>
+command (which is part of the <small>RCS</small> suite&mdash;see
+ident(1)) which looks for keyword strings.  If
+you want to be able to use <code>ident</code> you must not
+use &lsquo;<samp>-kv</samp>&rsquo;.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC136| export 
options]]::<nowiki>              export options
+</nowiki></pre>
+<hr size="6">
+<div id="export-options"></div>
+<div id="SEC136"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC135| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC137| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC135| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== export options ====
+
+<p>These standard options are supported by <code>export</code>
+(see section [[#SEC119|Common command options]], for a complete description of
+them):
+</p>
+<dl compact="compact">
+<dt> <code>-D <var>date</var></code></dt>
+<dd><p>Use the most recent revision no later than <var>date</var>.
+</p>
+</dd>
+<dt> <code>-f</code></dt>
+<dd><p>If no matching revision is found, retrieve the most
+recent revision (instead of ignoring the file).
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.
+</p>
+</dd>
+<dt> <code>-n</code></dt>
+<dd><p>Do not run any checkout program.
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Export directories recursively.  This is on by default.
+</p>
+</dd>
+<dt> <code>-r <var>tag</var></code></dt>
+<dd><p>Use revision <var>tag</var>.
+</p></dd>
+</dl>
+
+<p>In addition, these options (that are common to
+<code>checkout</code> and <code>export</code>) are also supported:
+</p>
+<dl compact="compact">
+<dt> <code>-d <var>dir</var></code></dt>
+<dd><p>Create a directory called <var>dir</var> for the working
+files, instead of using the module name.
+See section [[#SEC123|checkout options]], for complete details on how
+<small>CVS</small> handles this flag.
+</p>
+</dd>
+<dt> <code>-k <var>subst</var></code></dt>
+<dd><p>Set keyword expansion mode (see section [[#SEC102|Substitution modes]]).
+</p>
+</dd>
+<dt> <code>-N</code></dt>
+<dd><p>Only useful together with &lsquo;<samp>-d <var>dir</var></samp>&rsquo;.
+See section [[#SEC123|checkout options]], for complete details on how
+<small>CVS</small> handles this flag.
+</p></dd>
+</dl>
+
+
+<hr size="6">
+<div id="history"></div>
+<div id="SEC137"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC136| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC138| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC114| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== history&mdash;Show status of files and users ===
+
+<ul>
+<li>
+Synopsis:     history [-report] [-flags] [-options args] [files&hellip;]
+</li><li>
+Requires: the file &lsquo;<tt>$CVSROOT/CVSROOT/history</tt>&rsquo;
+</li><li>
+Changes: nothing.
+</li></ul>
+
+<p><small>CVS</small> can keep a history file that tracks each use of the
+<code>checkout</code>, <code>commit</code>, <code>rtag</code>,
+<code>update</code>, and <code>release</code> commands.  You can
+use <code>history</code> to display this information in
+various formats.
+</p>
+<p>Logging must be enabled by creating the file
+&lsquo;<tt>$CVSROOT/CVSROOT/history</tt>&rsquo;.
+</p>
+<p><strong>Note: <code>history</code> uses &lsquo;<samp>-f</samp>&rsquo;, 
&lsquo;<samp>-l</samp>&rsquo;,
+&lsquo;<samp>-n</samp>&rsquo;, and &lsquo;<samp>-p</samp>&rsquo; in ways that 
conflict with the
+normal use inside <small>CVS</small> (see section [[#SEC119|Common command 
options]]).</strong>
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC138| history 
options]]::<nowiki>             history options
+</nowiki></pre>
+<hr size="6">
+<div id="history-options"></div>
+<div id="SEC138"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC137| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC139| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC137| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== history options ====
+
+<p>Several options (shown above as &lsquo;<samp>-report</samp>&rsquo;)  
control  what
+kind of report is generated:
+</p>
+<dl compact="compact">
+<dt> <code>-c</code></dt>
+<dd><p>Report on each time commit was used (i.e., each time
+the repository was modified).
+</p>
+</dd>
+<dt> <code>-e</code></dt>
+<dd><p>Everything (all record types).  Equivalent to
+specifying &lsquo;<samp>-x</samp>&rsquo; with all record types.  Of course,
+&lsquo;<samp>-e</samp>&rsquo; will also include record types which are
+added in a future version of <small>CVS</small>; if you are
+writing a script which can only handle certain record
+types, you&rsquo;ll want to specify &lsquo;<samp>-x</samp>&rsquo;.
+</p>
+</dd>
+<dt> <code>-m <var>module</var></code></dt>
+<dd><p>Report on a particular module.  (You can meaningfully
+use &lsquo;<samp>-m</samp>&rsquo; more than once on the command line.)
+</p>
+</dd>
+<dt> <code>-o</code></dt>
+<dd><p>Report on checked-out modules.  This is the default report type.
+</p>
+</dd>
+<dt> <code>-T</code></dt>
+<dd><p>Report on all tags.
+</p>
+</dd>
+<dt> <code>-x <var>type</var></code></dt>
+<dd><p>Extract a particular set of record types <var>type</var> from the 
<small>CVS</small>
+history.  The types are indicated by single letters,
+which you may specify in combination.
+</p>
+<p>Certain commands have a single record type:
+</p>
+<dl compact="compact">
+<dt> <code>F</code></dt>
+<dd><p>release
+</p></dd>
+<dt> <code>O</code></dt>
+<dd><p>checkout
+</p></dd>
+<dt> <code>E</code></dt>
+<dd><p>export
+</p></dd>
+<dt> <code>T</code></dt>
+<dd><p>rtag
+</p></dd>
+</dl>
+
+<p>One of four record types may result from an update:
+</p>
+<dl compact="compact">
+<dt> <code>C</code></dt>
+<dd><p>A merge was necessary but collisions were
+detected (requiring manual merging).
+</p></dd>
+<dt> <code>G</code></dt>
+<dd><p>A merge was necessary and it succeeded.
+</p></dd>
+<dt> <code>U</code></dt>
+<dd><p>A working file was copied from the repository.
+</p></dd>
+<dt> <code>W</code></dt>
+<dd><p>The working copy of a file was deleted during
+update (because it was gone from the repository).
+</p></dd>
+</dl>
+
+<p>One of three record types results from commit:
+</p>
+<dl compact="compact">
+<dt> <code>A</code></dt>
+<dd><p>A file was added for the first time.
+</p></dd>
+<dt> <code>M</code></dt>
+<dd><p>A file was modified.
+</p></dd>
+<dt> <code>R</code></dt>
+<dd><p>A file was removed.
+</p></dd>
+</dl>
+</dd>
+</dl>
+
+<p>The options shown as &lsquo;<samp>-flags</samp>&rsquo; constrain or expand
+the report without requiring option arguments:
+</p>
+<dl compact="compact">
+<dt> <code>-a</code></dt>
+<dd><p>Show data for all users (the default is to show data
+only for the user executing <code>history</code>).
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Show last modification only.
+</p>
+</dd>
+<dt> <code>-w</code></dt>
+<dd><p>Show only the records for modifications done from the
+same working directory where <code>history</code> is
+executing.
+</p></dd>
+</dl>
+
+<p>The options shown as &lsquo;<samp>-options <var>args</var></samp>&rsquo; 
constrain the report
+based on an argument:
+</p>
+<dl compact="compact">
+<dt> <code>-b <var>str</var></code></dt>
+<dd><p>Show data back to a record containing  the  string
+<var>str</var>  in  either the module name, the file name, or
+the repository path.
+</p>
+</dd>
+<dt> <code>-D <var>date</var></code></dt>
+<dd><p>Show data since <var>date</var>.  This is slightly different
+from the normal use of &lsquo;<samp>-D <var>date</var></samp>&rsquo;, which
+selects the newest revision older than <var>date</var>.
+</p>
+</dd>
+<dt> <code>-f <var>file</var></code></dt>
+<dd><p>Show data for a particular file
+(you can specify several &lsquo;<samp>-f</samp>&rsquo; options on the same 
command line).
+This is equivalent to specifying the file on the command line.
+</p>
+</dd>
+<dt> <code>-n <var>module</var></code></dt>
+<dd><p>Show data for a particular module
+(you can specify several &lsquo;<samp>-n</samp>&rsquo; options on the same 
command line).
+</p>
+</dd>
+<dt> <code>-p <var>repository</var></code></dt>
+<dd><p>Show data for a particular source repository  (you
+can specify several &lsquo;<samp>-p</samp>&rsquo; options on the same command
+line).
+</p>
+</dd>
+<dt> <code>-r <var>rev</var></code></dt>
+<dd><p>Show records referring to revisions since the revision
+or tag named <var>rev</var> appears in individual <small>RCS</small>
+files.  Each <small>RCS</small> file is searched for the revision or
+tag.
+</p>
+</dd>
+<dt> <code>-t <var>tag</var></code></dt>
+<dd><p>Show records since tag <var>tag</var> was last added to the
+history file.  This differs from the &lsquo;<samp>-r</samp>&rsquo; flag
+above in that it reads only the history file, not the
+<small>RCS</small> files, and is much faster.
+</p>
+</dd>
+<dt> <code>-u <var>name</var></code></dt>
+<dd><p>Show records for user <var>name</var>.
+</p>
+</dd>
+<dt> <code>-z <var>timezone</var></code></dt>
+<dd><p>Show times in the selected records using the specified
+time zone instead of UTC.
+</p></dd>
+</dl>
+
+
+<hr size="6">
+<div id="import"></div>
+<div id="SEC139"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC138| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC140| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC114| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== import&mdash;Import sources into CVS, using vendor branches ===
+
+
+<ul>
+<li>
+Synopsis: import [-options] repository vendortag releasetag&hellip;
+</li><li>
+Requires: Repository, source distribution directory.
+</li><li>
+Changes: repository.
+</li></ul>
+
+<p>Use <code>import</code> 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.  See section [[#SEC105|Tracking third-party 
sources]], for
+a discussion on this subject.
+</p>
+<p>The <var>repository</var> argument gives a directory name
+(or a path to a directory) under the <small>CVS</small> root directory
+for repositories; if the directory did not exist,
+import creates it.
+</p>
+<p>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 &lsquo;<samp>checkout
+-j</samp>&rsquo; to reconcile the differences, as import instructs
+you to do.
+</p>
+<p>If <small>CVS</small> decides a file should be ignored
+(see section [[#SEC176|Ignoring files via cvsignore]]), it does not import it 
and prints
+&lsquo;<samp>I </samp>&rsquo; followed by the filename (see section 
[[#SEC141|import output]], for a
+complete description of the output).
+</p>
+<p>If the file &lsquo;<tt>$CVSROOT/CVSROOT/cvswrappers</tt>&rsquo; 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.  See section [[#SEC165|The cvswrappers file]].
+</p>
+<p>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.
+</p>
+<p>At least three arguments are required.
+<var>repository</var> is needed to identify the collection
+of source.  <var>vendortag</var> is a tag for the entire
+branch (e.g., for 1.1.1).  You must also specify at
+least one <var>releasetag</var> to identify the files at
+the leaves created each time you execute <code>import</code>.
+</p>
+<p>Note that <code>import</code> does <em>not</em> change the
+directory in which you invoke it.  In particular, it
+does not set up that directory as a <small>CVS</small> working
+directory; if you want to work with the sources import
+them first and then check them out into a different
+directory (see section [[#SEC5|Getting the source]]).
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC140| import 
options]]::<nowiki>              import options
+</nowiki>&bull;[[#SEC141| import output]]::<nowiki>               import output
+</nowiki>&bull;[[#SEC142| import examples]]::<nowiki>             import 
examples
+</nowiki></pre>
+<hr size="6">
+<div id="import-options"></div>
+<div id="SEC140"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC139| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC141| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC139| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== import options ====
+
+<p>This standard option is supported by <code>import</code>
+(see section [[#SEC119|Common command options]], for a complete description):
+</p>
+<dl compact="compact">
+<dt> <code>-m <var>message</var></code></dt>
+<dd><p>Use <var>message</var> as log information, instead of
+invoking an editor.
+</p></dd>
+</dl>
+
+<p>There are the following additional special options.
+</p>
+<dl compact="compact">
+<dt> <code>-b <var>branch</var></code></dt>
+<dd><p>See [[#SEC111|Multiple vendor branches]].
+</p>
+</dd>
+<dt> <code>-k <var>subst</var></code></dt>
+<dd><p>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 [[#SEC102|Substitution modes]], for a
+list of valid &lsquo;<samp>-k</samp>&rsquo; settings.
+</p>
+</dd>
+<dt> <code>-I <var>name</var></code></dt>
+<dd><p>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 &lsquo;-I !&rsquo;.
+</p>
+<p><var>name</var> can be a file name pattern of the same type
+that you can specify in the &lsquo;<tt>.cvsignore</tt>&rsquo; file.
+See section [[#SEC176|Ignoring files via cvsignore]].
+</p>
+</dd>
+<dt> <code>-W <var>spec</var></code></dt>
+<dd><p>Specify file names that should be filtered during
+import.  You can use this option repeatedly.
+</p>
+<p><var>spec</var> can be a file name pattern of the same type
+that you can specify in the &lsquo;<tt>.cvswrappers</tt>&rsquo;
+file. See section [[#SEC165|The cvswrappers file]].
+</p></dd>
+</dl>
+
+<hr size="6">
+<div id="import-output"></div>
+<div id="SEC141"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC140| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC142| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC139| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== import output ====
+
+<p><code>import</code> keeps you informed of its progress by printing a line
+for each file, preceded by one character indicating the status of the file:
+</p>
+<dl compact="compact">
+<dt> <code>U <var>file</var></code></dt>
+<dd><p>The file already exists in the repository and has not been locally
+modified; a new revision has been created (if necessary).
+</p>
+</dd>
+<dt> <code>N <var>file</var></code></dt>
+<dd><p>The file is a new file which has been added to the repository.
+</p>
+</dd>
+<dt> <code>C <var>file</var></code></dt>
+<dd><p>The file already exists in the repository but has been locally modified;
+you will have to merge the changes.
+</p>
+</dd>
+<dt> <code>I <var>file</var></code></dt>
+<dd><p>The file is being ignored (see section [[#SEC176|Ignoring files via 
cvsignore]]).
+</p>
+<div id="IDX242"></div>
+<div id="IDX243"></div>
+</dd>
+<dt> <code>L <var>file</var></code></dt>
+<dd><p>The file is a symbolic link; <code>cvs import</code> 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 &lsquo;<tt>modules</tt>&rsquo; file can be used
+to recreate symbolic links on checkout, update, etc.;
+see section [[#SEC158|The modules file]].)
+</p></dd>
+</dl>
+
+<hr size="6">
+<div id="import-examples"></div>
+<div id="SEC142"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC141| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC143| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC139| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== import examples ====
+
+<p>See [[#SEC105|Tracking third-party sources]], and [[#SEC40|Creating a 
directory tree from a number of files]].
+</p>
+<hr size="6">
+<div id="log"></div>
+<div id="SEC143"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC142| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC144| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC114| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== log&mdash;Print out log information for files ===
+
+<ul>
+<li>
+Synopsis: log [options] [files&hellip;]
+</li><li>
+Requires: repository, working directory.
+</li><li>
+Changes: nothing.
+</li></ul>
+
+<p>Display log information for files.  <code>log</code> used to
+call the <small>RCS</small> utility <code>rlog</code>.  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 <small>CVS</small>
+commands.
+</p>
+<div id="IDX244"></div>
+<div id="IDX245"></div>
+<p>The output includes the location of the <small>RCS</small> file,
+the <em>head</em> 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
+<small>CVS</small> print times in the local timezone).
+</p>
+<p><strong>Note: <code>log</code> uses &lsquo;<samp>-R</samp>&rsquo; in a way 
that conflicts
+with the normal use inside <small>CVS</small> (see section [[#SEC119|Common 
command options]]).</strong>
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC144| log 
options]]::<nowiki>                 log options
+</nowiki>&bull;[[#SEC145| log examples]]::<nowiki>                log examples
+</nowiki></pre>
+<hr size="6">
+<div id="log-options"></div>
+<div id="SEC144"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC143| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC145| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC143| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== log options ====
+
+<p>By default, <code>log</code> prints all information that is
+available.  All other options restrict the output.
+</p>
+<dl compact="compact">
+<dt> <code>-b</code></dt>
+<dd><p>Print information about the revisions on the default
+branch, normally the highest branch on the trunk.
+</p>
+</dd>
+<dt> <code>-d <var>dates</var></code></dt>
+<dd><p>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 &lsquo;<samp>-D</samp>&rsquo; option to
+many other <small>CVS</small> commands (see section [[#SEC119|Common command 
options]]).
+Dates can be combined into ranges as follows:
+</p>
+<dl compact="compact">
+<dt> <code><var>d1</var>&lt;<var>d2</var></code></dt>
+<dt> <code><var>d2</var>&gt;<var>d1</var></code></dt>
+<dd><p>Select the revisions that were deposited between
+<var>d1</var> and <var>d2</var>.
+</p>
+</dd>
+<dt> <code>&lt;<var>d</var></code></dt>
+<dt> <code><var>d</var>&gt;</code></dt>
+<dd><p>Select all revisions dated <var>d</var> or earlier.
+</p>
+</dd>
+<dt> <code><var>d</var>&lt;</code></dt>
+<dt> <code>&gt;<var>d</var></code></dt>
+<dd><p>Select all revisions dated <var>d</var> or later.
+</p>
+</dd>
+<dt> <code><var>d</var></code></dt>
+<dd><p>Select the single, latest revision dated <var>d</var> or
+earlier.
+</p></dd>
+</dl>
+
+<p>The &lsquo;<samp>&gt;</samp>&rsquo; or &lsquo;<samp>&lt;</samp>&rsquo; 
characters may be followed by
+&lsquo;<samp>=</samp>&rsquo; to indicate an inclusive range rather than an
+exclusive one.
+</p>
+<p>Note that the separator is a semicolon (;).
+</p>
+</dd>
+<dt> <code>-h</code></dt>
+<dd><p>Print only the name of the <small>RCS</small> file, name
+of the file in the working directory, head,
+default branch, access list, locks, symbolic names, and
+suffix.
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  (Default
+is to run recursively).
+</p>
+</dd>
+<dt> <code>-N</code></dt>
+<dd><p>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 &quot;more&quot;&rsquo;ing over 3 pages of tag
+information, the log information is presented without
+tags at all.
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Print only the name of the <small>RCS</small> file.
+</p>
+</dd>
+<dt> <code>-r<var>revisions</var></code></dt>
+<dd><p>Print information about revisions given in the
+comma-separated list <var>revisions</var> of revisions and
+ranges.  The following table explains the available
+range formats:
+</p>
+<dl compact="compact">
+<dt> <code><var>rev1</var>:<var>rev2</var></code></dt>
+<dd><p>Revisions <var>rev1</var> to <var>rev2</var> (which must be on
+the same branch).
+</p>
+</dd>
+<dt> <code><var>rev1</var>::<var>rev2</var></code></dt>
+<dd><p>The same, but excluding <var>rev1</var>.
+</p>
+</dd>
+<dt> <code>:<var>rev</var></code></dt>
+<dt> <code>::<var>rev</var></code></dt>
+<dd><p>Revisions from the beginning of the branch up to
+and including <var>rev</var>.
+</p>
+</dd>
+<dt> <code><var>rev</var>:</code></dt>
+<dd><p>Revisions starting with <var>rev</var> to the end of the
+branch containing <var>rev</var>.
+</p>
+</dd>
+<dt> <code><var>rev</var>::</code></dt>
+<dd><p>Revisions starting just after <var>rev</var> to the end of the
+branch containing <var>rev</var>.
+</p>
+</dd>
+<dt> <code><var>branch</var></code></dt>
+<dd><p>An argument that is a branch means all revisions on
+that branch.
+</p>
+</dd>
+<dt> <code><var>branch1</var>:<var>branch2</var></code></dt>
+<dt> <code><var>branch1</var>::<var>branch2</var></code></dt>
+<dd><p>A range of branches means all revisions
+on the branches in that range.
+</p>
+</dd>
+<dt> <code><var>branch</var>.</code></dt>
+<dd><p>The latest revision in <var>branch</var>.
+</p></dd>
+</dl>
+
+<p>A bare &lsquo;<samp>-r</samp>&rsquo; with no revisions means the latest
+revision on the default branch, normally the trunk.
+There can be no space between the &lsquo;<samp>-r</samp>&rsquo; option and
+its argument.
+</p>
+</dd>
+<dt> <code>-S</code></dt>
+<dd><p>Suppress the header if no revisions are selected.
+</p>
+</dd>
+<dt> <code>-s <var>states</var></code></dt>
+<dd><p>Print information about revisions whose state
+attributes match one of the states given in the
+comma-separated list <var>states</var>.
+</p>
+</dd>
+<dt> <code>-t</code></dt>
+<dd><p>Print the same as &lsquo;<samp>-h</samp>&rsquo;, plus the descriptive 
text.
+</p>
+</dd>
+<dt> <code>-w<var>logins</var></code></dt>
+<dd><p>Print information about revisions checked in by users
+with login names appearing in the comma-separated list
+<var>logins</var>.  If <var>logins</var> is omitted, the user&rsquo;s
+login is assumed.  There can be no space between the
+&lsquo;<samp>-w</samp>&rsquo; option and its argument.
+</p></dd>
+</dl>
+
+<p><code>log</code> prints the intersection of the revisions
+selected with the options &lsquo;<samp>-d</samp>&rsquo;, 
&lsquo;<samp>-s</samp>&rsquo;, and
+&lsquo;<samp>-w</samp>&rsquo;, intersected with the union of the revisions
+selected by &lsquo;<samp>-b</samp>&rsquo; and &lsquo;<samp>-r</samp>&rsquo;.
+</p>
+<hr size="6">
+<div id="log-examples"></div>
+<div id="SEC145"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC144| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC146| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC143| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== log examples ====
+
+<p>Contributed examples are gratefully accepted.
+</p>
+<hr size="6">
+<div id="rdiff"></div>
+<div id="SEC146"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC145| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC147| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC114| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== rdiff&mdash;&rsquo;patch&rsquo; format diffs between releases ===
+
+<ul>
+<li>
+rdiff [-flags] [-V vn] [-r t|-D d [-r t2|-D d2]] modules&hellip;
+</li><li>
+Requires: repository.
+</li><li>
+Changes: nothing.
+</li><li>
+Synonym: patch
+</li></ul>
+
+<p>Builds a Larry Wall format patch(1) file between two
+releases, that can be fed directly into the <code>patch</code>
+program to bring an old release up-to-date with the new
+release.  (This is one of the few <small>CVS</small> commands that
+operates directly from the repository, and doesn&rsquo;t
+require a prior checkout.) The diff output is sent to
+the standard output device.
+</p>
+<p>You can specify (using the standard &lsquo;<samp>-r</samp>&rsquo; and
+&lsquo;<samp>-D</samp>&rsquo; 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 <small>RCS</small> file.
+</p>
+<p>Note that if the software release affected is contained
+in more than one directory, then it may be necessary to
+specify the &lsquo;<samp>-p</samp>&rsquo; option to the <code>patch</code> 
command when
+patching the old sources, so that <code>patch</code> is able to find
+the files that are located in other directories.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC147| rdiff 
options]]::<nowiki>               rdiff options
+</nowiki>&bull;[[#SEC148| rdiff examples]]::<nowiki>              rdiff 
examples
+</nowiki></pre>
+<hr size="6">
+<div id="rdiff-options"></div>
+<div id="SEC147"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC146| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC148| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC146| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== rdiff options ====
+
+<p>These standard options are supported by <code>rdiff</code>
+(see section [[#SEC119|Common command options]], for a complete description of
+them):
+</p>
+<dl compact="compact">
+<dt> <code>-D <var>date</var></code></dt>
+<dd><p>Use the most recent revision no later than <var>date</var>.
+</p>
+</dd>
+<dt> <code>-f</code></dt>
+<dd><p>If no matching revision is found, retrieve the most
+recent revision (instead of ignoring the file).
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Local; don&rsquo;t descend subdirectories.
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Examine directories recursively.  This option is on by default.
+</p>
+</dd>
+<dt> <code>-r <var>tag</var></code></dt>
+<dd><p>Use revision <var>tag</var>.
+</p></dd>
+</dl>
+
+<p>In addition to the above, these options are available:
+</p>
+<dl compact="compact">
+<dt> <code>-c</code></dt>
+<dd><p>Use the context diff format.  This is the default format.
+</p>
+</dd>
+<dt> <code>-s</code></dt>
+<dd><p>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.
+</p>
+</dd>
+<dt> <code>-t</code></dt>
+<dd><p>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.
+</p>
+</dd>
+<dt> <code>-u</code></dt>
+<dd><p>Use the unidiff format for the context diffs.
+Remember that old versions
+of the <code>patch</code> program can&rsquo;t handle the unidiff
+format, so if you plan to post this patch to the net
+you should probably not use &lsquo;<samp>-u</samp>&rsquo;.
+</p>
+</dd>
+<dt> <code>-V <var>vn</var></code></dt>
+<dd><p>Expand keywords according to the rules current in
+<small>RCS</small> version <var>vn</var> (the expansion format changed with
+<small>RCS</small> version 5).  Note that this option is no
+longer accepted.  <small>CVS</small> will always expand keywords the
+way that <small>RCS</small> version 5 does.
+</p></dd>
+</dl>
+
+<hr size="6">
+<div id="rdiff-examples"></div>
+<div id="SEC148"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC147| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC149| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC146| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== rdiff examples ====
+
+<p>Suppose you receive mail from <tt>address@hidden</tt> asking for an
+update from release 1.2 to 1.4 of the tc compiler.  You
+have no such patches on hand, but with <small>CVS</small> that can
+easily be fixed with a command such as this:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs rdiff -c -r 
FOO1_2 -r FOO1_4 tc | \
+$$ Mail -s 'The patches you asked for' address@hidden
+</nowiki></pre></td></tr></table>
+
+<p>Suppose you have made release 1.3, and forked a branch
+called &lsquo;<samp>R_1_3fix</samp>&rsquo; for bugfixes.  
&lsquo;<samp>R_1_3_1</samp>&rsquo;
+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:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ 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
+</nowiki></pre></td></tr></table>
+
+<hr size="6">
+<div id="release"></div>
+<div id="SEC149"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC148| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC150| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC114| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== release&mdash;Indicate that a Module is no longer in use ===
+
+<ul>
+<li>
+release [-d] directories&hellip;
+</li><li>
+Requires: Working directory.
+</li><li>
+Changes: Working directory, history log.
+</li></ul>
+
+<p>This command is meant to safely cancel the effect of
+&lsquo;<samp>cvs checkout</samp>&rsquo;.  Since <small>CVS</small> 
doesn&rsquo;t lock files, it
+isn&rsquo;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 <small>CVS</small> history
+file (see section [[#SEC178|The history file]]) that you&rsquo;ve abandoned 
your
+checkout.
+</p>
+<p>Use &lsquo;<samp>cvs release</samp>&rsquo; to avoid these problems.  This
+command checks that no uncommitted changes are
+present; that you are executing it from immediately
+above a <small>CVS</small> working directory; and that the repository
+recorded for your files is the same as the repository
+defined in the module database.
+</p>
+<p>If all these conditions are true, &lsquo;<samp>cvs release</samp>&rsquo;
+leaves a record of its execution (attesting to your
+intentionally abandoning your checkout) in the <small>CVS</small>
+history log.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC150| release 
options]]::<nowiki>             release options
+</nowiki>&bull;[[#SEC151| release output]]::<nowiki>              release 
output
+</nowiki>&bull;[[#SEC152| release examples]]::<nowiki>            release 
examples
+</nowiki></pre>
+<hr size="6">
+<div id="release-options"></div>
+<div id="SEC150"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC149| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC151| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC149| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== release options ====
+
+<p>The <code>release</code> command supports one command option:
+</p>
+<dl compact="compact">
+<dt> <code>-d</code></dt>
+<dd><p>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.
+</p>
+<p><strong>WARNING:  The <code>release</code> 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 <code>add</code>
+command; see section [[#SEC67|Adding files to a directory]]) will be silently 
deleted&mdash;even
+if it is non-empty!</strong>
+</p></dd>
+</dl>
+
+<hr size="6">
+<div id="release-output"></div>
+<div id="SEC151"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC150| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC152| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC149| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== release output ====
+
+<p>Before <code>release</code> releases your sources it will
+print a one-line message for any file that is not
+up-to-date.
+</p>
+<dl compact="compact">
+<dt> <code>U <var>file</var></code></dt>
+<dt> <code>P <var>file</var></code></dt>
+<dd><p>There exists a newer revision of this file in the
+repository, and you have not modified your local copy
+of the file (&lsquo;<samp>U</samp>&rsquo; and &lsquo;<samp>P</samp>&rsquo; 
mean the same thing).
+</p>
+</dd>
+<dt> <code>A <var>file</var></code></dt>
+<dd><p>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.
+</p>
+</dd>
+<dt> <code>R <var>file</var></code></dt>
+<dd><p>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.  See section [[#SEC125|commit&mdash;Check files into the repository]].
+</p>
+</dd>
+<dt> <code>M <var>file</var></code></dt>
+<dd><p>The file is modified in your working directory.  There
+might also be a newer revision inside the repository.
+</p>
+</dd>
+<dt> <code>? <var>file</var></code></dt>
+<dd><p><var>file</var> is in your working directory, but does not
+correspond to anything in the source repository, and is
+not in the list of files for <small>CVS</small> to ignore (see the
+description of the &lsquo;<samp>-I</samp>&rsquo; option, and
+see section [[#SEC176|Ignoring files via cvsignore]]).  If you remove your 
working
+sources, this file will be lost.
+</p></dd>
+</dl>
+
+<hr size="6">
+<div id="release-examples"></div>
+<div id="SEC152"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC151| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC153| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC149| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== release examples ====
+
+<p>Release the &lsquo;<tt>tc</tt>&rsquo; directory, and delete your local 
working copy
+of the files.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cd ..         # 
<span class="roman">You must stand immediately above the</span>
+                # <span class="roman">sources when you issue &lsquo;<samp>cvs 
release</samp>&rsquo;.</span>
+$ cvs release -d tc
+You have [0] altered files in this repository.
+Are you sure you want to release (and delete) directory `tc': y
+$
+</nowiki></pre></td></tr></table>
+
+<hr size="6">
+<div id="update"></div>
+<div id="SEC153"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC152| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC154| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC114| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== update&mdash;Bring work tree in sync with repository ===
+
+<ul>
+<li>
+update [-ACdflPpR] [-I name] [-j rev [-j rev]] [-k kflag] [-r tag|-D date] [-W 
spec] files&hellip;
+</li><li>
+Requires: repository, working directory.
+</li><li>
+Changes: working directory.
+</li></ul>
+
+<p>After you&rsquo;ve run checkout to create your private copy
+of source from the common repository, other developers
+will continue changing the central source.  From time
+to time, when it is convenient in your development
+process, you can use the <code>update</code> 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 <code>-C</code>
+option, <code>update</code> will also merge any differences
+between the local copy of files and their base revisions
+into any destination revisions specified with <code>-r</code>,
+<code>-D</code>, or <code>-A</code>.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC154| update 
options]]::<nowiki>              update options
+</nowiki>&bull;[[#SEC155| update output]]::<nowiki>               update output
+</nowiki></pre>
+<hr size="6">
+<div id="update-options"></div>
+<div id="SEC154"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC153| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC155| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC153| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== update options ====
+
+<p>These standard options are available with <code>update</code>
+(see section [[#SEC119|Common command options]], for a complete description of
+them):
+</p>
+<dl compact="compact">
+<dt> <code>-D date</code></dt>
+<dd><p>Use the most recent revision no later than <var>date</var>.
+This option is sticky, and implies &lsquo;<samp>-P</samp>&rsquo;.
+See [[#SEC53|Sticky tags]], for more information on sticky tags/dates.
+</p>
+</dd>
+<dt> <code>-f</code></dt>
+<dd><p>Only useful with the &lsquo;<samp>-D <var>date</var></samp>&rsquo; or 
&lsquo;<samp>-r
+<var>tag</var></samp>&rsquo; flags.  If no matching revision is found,
+retrieve the most recent revision (instead of ignoring
+the file).
+</p>
+</dd>
+<dt> <code>-k <var>kflag</var></code></dt>
+<dd><p>Process keywords according to <var>kflag</var>.  See
+[[#SEC98|Keyword substitution]].
+This option is sticky; future updates of
+this file in this working directory will use the same
+<var>kflag</var>.  The <code>status</code> command can be viewed
+to see the sticky options.  See [[#SEC156|Quick reference to CVS commands]], 
for
+more information on the <code>status</code> command.
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See section 
[[#SEC65|Recursive behavior]].
+</p>
+</dd>
+<dt> <code>-P</code></dt>
+<dd><p>Prune empty directories.  See [[#SEC74|Moving and renaming 
directories]].
+</p>
+</dd>
+<dt> <code>-p</code></dt>
+<dd><p>Pipe files to the standard output.
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Update directories recursively (default).  See section 
[[#SEC65|Recursive behavior]].
+</p>
+</dd>
+<dt> <code>-r rev</code></dt>
+<dd><p>Retrieve revision/tag <var>rev</var>.  This option is sticky,
+and implies &lsquo;<samp>-P</samp>&rsquo;.
+See [[#SEC53|Sticky tags]], for more information on sticky tags/dates.
+</p></dd>
+</dl>
+
+<p>These special options are also available with
+<code>update</code>.
+</p>
+<dl compact="compact">
+<dt> <code>-A</code></dt>
+<dd><p>Reset any sticky tags, dates, or &lsquo;<samp>-k</samp>&rsquo; options.
+See [[#SEC53|Sticky tags]], for more information on sticky tags/dates.
+</p>
+</dd>
+<dt> <code>-C</code></dt>
+<dd><p>Overwrite locally modified files with clean copies from
+the repository (the modified file is saved in
+&lsquo;<tt>.#<var>file</var>.<var>revision</var></tt>&rsquo;, however).
+</p>
+</dd>
+<dt> <code>-d</code></dt>
+<dd><p>Create any directories that exist in the repository if
+they&rsquo;re missing from the working directory.  Normally,
+<code>update</code> acts only on directories and files that
+were already enrolled in your working directory.
+</p>
+<p>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 &lsquo;<samp>-d</samp>&rsquo; will create
+those directories, which may not be what you want.
+</p>
+</dd>
+<dt> <code>-I <var>name</var></code></dt>
+<dd><p>Ignore files whose names match <var>name</var> (in your
+working directory) during the update.  You can specify
+&lsquo;<samp>-I</samp>&rsquo; more than once on the command line to specify
+several files to ignore.  Use &lsquo;<samp>-I !</samp>&rsquo; to avoid
+ignoring any files at all.  See section [[#SEC176|Ignoring files via 
cvsignore]], for other
+ways to make <small>CVS</small> ignore some files.
+</p>
+</dd>
+<dt> <code>-W<var>spec</var></code></dt>
+<dd><p>Specify file names that should be filtered during
+update.  You can use this option repeatedly.
+</p>
+<p><var>spec</var> can be a file name pattern of the same type
+that you can specify in the &lsquo;<tt>.cvswrappers</tt>&rsquo;
+file. See section [[#SEC165|The cvswrappers file]].
+</p>
+</dd>
+<dt> <code>-j<var>revision</var></code></dt>
+<dd><p>With two &lsquo;<samp>-j</samp>&rsquo; options, merge changes from the
+revision specified with the first &lsquo;<samp>-j</samp>&rsquo; option to
+the revision specified with the second &lsquo;<samp>j</samp>&rsquo; option,
+into the working directory.
+</p>
+<p>With one &lsquo;<samp>-j</samp>&rsquo; option, merge changes from the
+ancestor revision to the revision specified with the
+&lsquo;<samp>-j</samp>&rsquo; 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 &lsquo;<samp>-j</samp>&rsquo; option.
+</p>
+<p>Note that using a single &lsquo;<samp>-j <var>tagname</var></samp>&rsquo; 
option rather than
+&lsquo;<samp>-j <var>branchname</var></samp>&rsquo; to merge changes from a 
branch will
+often not remove files which were removed on the branch.
+See section [[#SEC63|Merging can add or remove files]], for more.
+</p>
+<p>In addition, each &lsquo;<samp>-j</samp>&rsquo; 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:
+&lsquo;<samp>-j<var>Symbolic_Tag</var>:<var>Date_Specifier</var></samp>&rsquo;.
+</p>
+<p>See section [[#SEC54|Branching and merging]].
+</p>
+</dd>
+</dl>
+
+<hr size="6">
+<div id="update-output"></div>
+<div id="SEC155"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC154| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC153| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC156| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== update output ====
+
+<p><code>update</code> and <code>checkout</code> keep you informed of
+their progress by printing a line for each file, preceded
+by one character indicating the status of the file:
+</p>
+<dl compact="compact">
+<dt> <code>U <var>file</var></code></dt>
+<dd><p>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&rsquo;t changed but are not the most recent
+versions available in the repository.
+</p>
+</dd>
+<dt> <code>P <var>file</var></code></dt>
+<dd><p>Like &lsquo;<samp>U</samp>&rsquo;, but the <small>CVS</small> server 
sends a patch instead of an entire
+file.  This accomplishes the same thing as &lsquo;<samp>U</samp>&rsquo; using 
less bandwidth.
+</p>
+</dd>
+<dt> <code>A <var>file</var></code></dt>
+<dd><p>The file has been added to your private copy of the
+sources, and will be added to the source repository
+when you run <code>commit</code> on the file.  This is a
+reminder to you that the file needs to be committed.
+</p>
+</dd>
+<dt> <code>R <var>file</var></code></dt>
+<dd><p>The file has been removed from your private copy of the
+sources, and will be removed from the source repository
+when you run <code>commit</code> on the file.  This is a
+reminder to you that the file needs to be committed.
+</p>
+</dd>
+<dt> <code>M <var>file</var></code></dt>
+<dd><p>The file is modified in  your  working  directory.
+</p>
+<p>&lsquo;<samp>M</samp>&rsquo; can indicate one of two states for a file
+you&rsquo;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.
+</p>
+<p><small>CVS</small> will print some messages if it merges your work,
+and a backup copy of your working file (as it looked
+before you ran <code>update</code>) will be made.  The exact
+name of that file is printed while <code>update</code> runs.
+</p>
+</dd>
+<dt> <code>C <var>file</var></code></dt>
+<dd><div id="IDX246"></div>
+<div id="IDX247"></div>
+<p>A conflict was detected while trying to merge your
+changes to <var>file</var> with changes from the source
+repository.  <var>file</var> (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
+&lsquo;<tt>.#<var>file</var>.<var>revision</var></tt>&rsquo; where 
<var>revision</var>
+is the revision that your modified file started
+from.  Resolve the conflict as described in
+[[#SEC86|Conflicts example]].
+(Note that some systems automatically purge
+files that begin with &lsquo;<tt>.#</tt>&rsquo; 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 <small>VMS</small>, the file name starts with
+&lsquo;<tt>__</tt>&rsquo; rather than &lsquo;<tt>.#</tt>&rsquo;.
+</p>
+</dd>
+<dt> <code>? <var>file</var></code></dt>
+<dd><p><var>file</var> is in your working directory, but does not
+correspond to anything in the source repository, and is
+not in the list of files for <small>CVS</small> to ignore (see the
+description of the &lsquo;<samp>-I</samp>&rsquo; option, and
+see section [[#SEC176|Ignoring files via cvsignore]]).
+</p></dd>
+</dl>
+
+<hr size="6">
+<div id="Invoking-CVS"></div>
+<div id="SEC156"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC155| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC157| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC114| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC157| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== Quick reference to CVS commands ==
+
+<p>This appendix describes how to invoke <small>CVS</small>, with
+references to where each command or feature is
+described in detail.  For other references run the
+<code>cvs --help</code> command, or see [[#SEC189|Index]].
+</p>
+<p>A <small>CVS</small> command looks like:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs [ 
<var>global_options</var> ] <var>command</var> [ <var>command_options</var> ] [ 
<var>command_args</var> ]
+</nowiki></pre></td></tr></table>
+
+<p>Global options:
+</p>
+<dl compact="compact">
+<dt> <code>--allow-root=<var>rootdir</var></code></dt>
+<dd><p>Specify legal <small>CVSROOT</small> directory (server only) (not
+in <small>CVS</small> 1.9 and older).  See [[#SEC30|Setting up the server for 
password authentication]].
+</p>
+</dd>
+<dt> <code>-a</code></dt>
+<dd><p>Authenticate all communication (client only) (not in <small>CVS</small>
+1.9 and older).  See [[#SEC118|Global options]].
+</p>
+</dd>
+<dt> <code>-b</code></dt>
+<dd><p>Specify RCS location (<small>CVS</small> 1.9 and older).  See
+[[#SEC118|Global options]].
+</p>
+</dd>
+<dt> <code>-d <var>root</var></code></dt>
+<dd><p>Specify the <small>CVSROOT</small>.  See [[#SEC9|The Repository]].
+</p>
+</dd>
+<dt> <code>-e <var>editor</var></code></dt>
+<dd><p>Edit messages with <var>editor</var>.  See [[#SEC6|Committing your 
changes]].
+</p>
+</dd>
+<dt> <code>-f</code></dt>
+<dd><p>Do not read the &lsquo;<tt>~/.cvsrc</tt>&rsquo; file.  See 
[[#SEC118|Global options]].
+</p>
+</dd>
+<dt> <code>-H</code></dt>
+<dt> <code>--help</code></dt>
+<dd><p>Print a help message.  See [[#SEC118|Global options]].
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Do not log in &lsquo;<tt>$CVSROOT/CVSROOT/history</tt>&rsquo; file.  
See [[#SEC118|Global options]].
+</p>
+</dd>
+<dt> <code>-n</code></dt>
+<dd><p>Do not change any files.  See [[#SEC118|Global options]].
+</p>
+</dd>
+<dt> <code>-Q</code></dt>
+<dd><p>Be really quiet.  See [[#SEC118|Global options]].
+</p>
+</dd>
+<dt> <code>-q</code></dt>
+<dd><p>Be somewhat quiet.  See [[#SEC118|Global options]].
+</p>
+</dd>
+<dt> <code>-r</code></dt>
+<dd><p>Make new working files read-only.  See [[#SEC118|Global options]].
+</p>
+</dd>
+<dt> <code>-s <var>variable</var>=<var>value</var></code></dt>
+<dd><p>Set a user variable.  See [[#SEC179|Expansions in administrative 
files]].
+</p>
+</dd>
+<dt> <code>-T <var>tempdir</var></code></dt>
+<dd><p>Put temporary files in <var>tempdir</var>.  See [[#SEC118|Global 
options]].
+</p>
+</dd>
+<dt> <code>-t</code></dt>
+<dd><p>Trace <small>CVS</small> execution.  See [[#SEC118|Global options]].
+</p>
+</dd>
+<dt> <code>-v</code></dt>
+<dt> <code>--version</code></dt>
+<dd><p>Display version and copyright information for <small>CVS</small>.
+</p>
+</dd>
+<dt> <code>-w</code></dt>
+<dd><p>Make new working files read-write.  See [[#SEC118|Global options]].
+</p>
+</dd>
+<dt> <code>-x</code></dt>
+<dd><p>Encrypt all communication (client only).
+See [[#SEC118|Global options]].
+</p>
+</dd>
+<dt> <code>-z <var>gzip-level</var></code></dt>
+<dd><div id="IDX248"></div>
+<div id="IDX249"></div>
+<p>Set the compression level (client only).
+See [[#SEC118|Global options]].
+</p></dd>
+</dl>
+
+<p>Keyword expansion modes (see section [[#SEC102|Substitution modes]]):
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>-kkv  $<i></i>Id: 
file1,v 1.1 1993/12/09 03:21:13 joe Exp $
+-kkvl $<i></i>Id: file1,v 1.1 1993/12/09 03:21:13 joe Exp harry $
+-kk   $<i></i>Id$
+-kv   file1,v 1.1 1993/12/09 03:21:13 joe Exp
+-ko   <i>no expansion</i>
+-kb   <i>no expansion, file is binary</i>
+</nowiki></pre></td></tr></table>
+
+<p>Keywords (see section [[#SEC99|Keyword List]]):
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$<i></i>Author: joe 
$
+$<i></i>Date: 1993/12/09 03:21:13 $
+$<i></i>CVSHeader: files/file1,v 1.1 1993/12/09 03:21:13 joe Exp harry $
+$<i></i>Header: /home/files/file1,v 1.1 1993/12/09 03:21:13 joe Exp harry $
+$<i></i>Id: file1,v 1.1 1993/12/09 03:21:13 joe Exp harry $
+$<i></i>Locker: harry $
+$<i></i>Name: snapshot_1_14 $
+$<i></i>RCSfile: file1,v $
+$<i></i>Revision: 1.1 $
+$<i></i>Source: /home/files/file1,v $
+$<i></i>State: Exp $
+$<i></i>Log: file1,v $
+Revision 1.1  1993/12/09 03:30:17  joe
+Initial revision
+
+</nowiki></pre></td></tr></table>
+
+<p>Commands, command options, and command arguments:
+</p>
+<dl compact="compact">
+<dt> <code>add [<var>options</var>] [<var>files</var>&hellip;]</code></dt>
+<dd><p>Add a new file/directory.  See [[#SEC67|Adding files to a directory]].
+</p>
+<dl compact="compact">
+<dt> <code>-k <var>kflag</var></code></dt>
+<dd><p>Set keyword expansion.
+</p>
+</dd>
+<dt> <code>-m <var>msg</var></code></dt>
+<dd><p>Set file description.
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>admin [<var>options</var>] [<var>files</var>&hellip;]</code></dt>
+<dd><p>Administration of history files in the repository.  See
+[[#SEC120|admin&mdash;Administration]].
+</p>
+<dl compact="compact">
+<dt> <code>-b[<var>rev</var>]</code></dt>
+<dd><p>Set default branch.  See [[#SEC108|Reverting to the latest vendor 
release]].
+</p>
+</dd>
+<dt> <code>-c<var>string</var></code></dt>
+<dd><p>Set comment leader.
+</p>
+</dd>
+<dt> <code>-k<var>subst</var></code></dt>
+<dd><p>Set keyword substitution.  See [[#SEC98|Keyword substitution]].
+</p>
+</dd>
+<dt> <code>-l[<var>rev</var>]</code></dt>
+<dd><p>Lock revision <var>rev</var>, or latest revision.
+</p>
+</dd>
+<dt> <code>-m<var>rev</var>:<var>msg</var></code></dt>
+<dd><p>Replace the log message of revision <var>rev</var> with
+<var>msg</var>.
+</p>
+</dd>
+<dt> <code>-o<var>range</var></code></dt>
+<dd><p>Delete revisions from the repository.  See
+[[#SEC121|admin options]].
+</p>
+</dd>
+<dt> <code>-q</code></dt>
+<dd><p>Run quietly; do not print diagnostics.
+</p>
+</dd>
+<dt> <code>-s<var>state</var>[:<var>rev</var>]</code></dt>
+<dd><p>Set the state.
+</p>
+</dd>
+<dt> <code>-t</code></dt>
+<dd><p>Set file description from standard input.
+</p>
+</dd>
+<dt> <code>-t<var>file</var></code></dt>
+<dd><p>Set file description from <var>file</var>.
+</p>
+</dd>
+<dt> <code>-t-<var>string</var></code></dt>
+<dd><p>Set file description to <var>string</var>.
+</p>
+</dd>
+<dt> <code>-u[<var>rev</var>]</code></dt>
+<dd><p>Unlock revision <var>rev</var>, or latest revision.
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>annotate [<var>options</var>] [<var>files</var>&hellip;]</code></dt>
+<dd><p>Show last revision where each line was modified.  See
+[[#SEC79|Annotate command]].
+</p>
+<dl compact="compact">
+<dt> <code>-D <var>date</var></code></dt>
+<dd><p>Annotate the most recent revision no later than
+<var>date</var>.  See [[#SEC119|Common command options]].
+</p>
+</dd>
+<dt> <code>-F</code></dt>
+<dd><p>Force annotation of binary files.  (Without this option,
+binary files are skipped with a message.)
+</p>
+</dd>
+<dt> <code>-f</code></dt>
+<dd><p>Use head revision if tag/date not found.  See
+[[#SEC119|Common command options]].
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See section 
[[#SEC65|Recursive behavior]].
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Operate recursively (default).  See section [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-r <var>tag</var></code></dt>
+<dd><p>Annotate revision <var>tag</var>.  See [[#SEC119|Common command 
options]].
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>checkout [<var>options</var>] <var>modules</var>&hellip;</code></dt>
+<dd><p>Get a copy of the sources.  See [[#SEC122|checkout&mdash;Check out 
sources for editing]].
+</p>
+<dl compact="compact">
+<dt> <code>-A</code></dt>
+<dd><p>Reset any sticky tags/date/options.  See [[#SEC53|Sticky tags]] and 
[[#SEC98|Keyword substitution]].
+</p>
+</dd>
+<dt> <code>-c</code></dt>
+<dd><p>Output the module database.  See [[#SEC123|checkout options]].
+</p>
+</dd>
+<dt> <code>-D <var>date</var></code></dt>
+<dd><p>Check out revisions as of <var>date</var> (is sticky).  See
+[[#SEC119|Common command options]].
+</p>
+</dd>
+<dt> <code>-d <var>dir</var></code></dt>
+<dd><p>Check out into <var>dir</var>.  See [[#SEC123|checkout options]].
+</p>
+</dd>
+<dt> <code>-f</code></dt>
+<dd><p>Use head revision if tag/date not found.  See
+[[#SEC119|Common command options]].
+</p>
+</dd>
+<dt> <code>-j <var>rev</var></code></dt>
+<dd><p>Merge in changes.  See [[#SEC123|checkout options]].
+</p>
+</dd>
+<dt> <code>-k <var>kflag</var></code></dt>
+<dd><p>Use <var>kflag</var> keyword expansion.  See
+[[#SEC102|Substitution modes]].
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See section 
[[#SEC65|Recursive behavior]].
+</p>
+</dd>
+<dt> <code>-N</code></dt>
+<dd><p>Don&rsquo;t &ldquo;shorten&rdquo; module paths if -d specified.  See
+[[#SEC123|checkout options]].
+</p>
+</dd>
+<dt> <code>-n</code></dt>
+<dd><p>Do not run module program (if any).  See [[#SEC123|checkout options]].
+</p>
+</dd>
+<dt> <code>-P</code></dt>
+<dd><p>Prune empty directories.  See [[#SEC74|Moving and renaming 
directories]].
+</p>
+</dd>
+<dt> <code>-p</code></dt>
+<dd><p>Check out files to standard output (avoids
+stickiness).  See [[#SEC123|checkout options]].
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Operate recursively (default).  See section [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-r <var>tag</var></code></dt>
+<dd><p>Checkout revision <var>tag</var> (is sticky).  See [[#SEC119|Common 
command options]].
+</p>
+</dd>
+<dt> <code>-s</code></dt>
+<dd><p>Like -c, but include module status.  See [[#SEC123|checkout options]].
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>commit [<var>options</var>] [<var>files</var>&hellip;]</code></dt>
+<dd><p>Check changes into the repository.  See [[#SEC125|commit&mdash;Check 
files into the repository]].
+</p>
+<dl compact="compact">
+<dt> <code>-F <var>file</var></code></dt>
+<dd><p>Read log message from <var>file</var>.  See [[#SEC126|commit options]].
+</p>
+</dd>
+<dt> <code>-f</code></dt>
+<dd><p>Force the file to be committed; disables recursion.
+See [[#SEC126|commit options]].
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-m <var>msg</var></code></dt>
+<dd><p>Use <var>msg</var> as log message.  See [[#SEC126|commit options]].
+</p>
+</dd>
+<dt> <code>-n</code></dt>
+<dd><p>Do not run module program (if any).  See [[#SEC126|commit options]].
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Operate recursively (default).  See section [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-r <var>rev</var></code></dt>
+<dd><p>Commit to <var>rev</var>.  See [[#SEC126|commit options]].
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>diff [<var>options</var>] [<var>files</var>&hellip;]</code></dt>
+<dd><p>Show differences between revisions.  See [[#SEC130|diff&mdash;Show 
differences between revisions]].
+In addition to the options shown below, accepts a wide
+variety of options to control output style, for example
+&lsquo;<samp>-c</samp>&rsquo; for context diffs.
+</p>
+<dl compact="compact">
+<dt> <code>-D <var>date1</var></code></dt>
+<dd><p>Diff revision for date against working file.  See
+[[#SEC131|diff options]].
+</p>
+</dd>
+<dt> <code>-D <var>date2</var></code></dt>
+<dd><p>Diff <var>rev1</var>/<var>date1</var> against <var>date2</var>.  See
+[[#SEC131|diff options]].
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-N</code></dt>
+<dd><p>Include diffs for added and removed files.  See
+[[#SEC131|diff options]].
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Operate recursively (default).  See section [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-r <var>rev1</var></code></dt>
+<dd><p>Diff revision for <var>rev1</var> against working file.  See
+[[#SEC131|diff options]].
+</p>
+</dd>
+<dt> <code>-r <var>rev2</var></code></dt>
+<dd><p>Diff <var>rev1</var>/<var>date1</var> against <var>rev2</var>.  See 
[[#SEC131|diff options]].
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>edit [<var>options</var>] [<var>files</var>&hellip;]</code></dt>
+<dd><p>Get ready to edit a watched file.  See [[#SEC92|How to edit a file 
which is being watched]].
+</p>
+<dl compact="compact">
+<dt> <code>-a <var>actions</var></code></dt>
+<dd><p>Specify actions for temporary watch, where
+<var>actions</var> is <code>edit</code>, <code>unedit</code>,
+<code>commit</code>, <code>all</code>, or <code>none</code>.  See
+[[#SEC92|How to edit a file which is being watched]].
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Operate recursively (default).  See section [[#SEC65|Recursive 
behavior]].
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>editors [<var>options</var>] [<var>files</var>&hellip;]</code></dt>
+<dd><p>See who is editing a watched file.  See [[#SEC93|Information about who 
is watching and editing]].
+</p>
+<dl compact="compact">
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Operate recursively (default).  See section [[#SEC65|Recursive 
behavior]].
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>export [<var>options</var>] <var>modules</var>&hellip;</code></dt>
+<dd><p>Export files from <small>CVS</small>.  See 
[[#SEC135|export&mdash;Export sources from CVS, similar to checkout]].
+</p>
+<dl compact="compact">
+<dt> <code>-D <var>date</var></code></dt>
+<dd><p>Check out revisions as of <var>date</var>.  See
+[[#SEC119|Common command options]].
+</p>
+</dd>
+<dt> <code>-d <var>dir</var></code></dt>
+<dd><p>Check out into <var>dir</var>.  See [[#SEC136|export options]].
+</p>
+</dd>
+<dt> <code>-f</code></dt>
+<dd><p>Use head revision if tag/date not found.  See
+[[#SEC119|Common command options]].
+</p>
+</dd>
+<dt> <code>-k <var>kflag</var></code></dt>
+<dd><p>Use <var>kflag</var> keyword expansion.  See
+[[#SEC102|Substitution modes]].
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See section 
[[#SEC65|Recursive behavior]].
+</p>
+</dd>
+<dt> <code>-N</code></dt>
+<dd><p>Don&rsquo;t &ldquo;shorten&rdquo; module paths if -d specified.  See
+[[#SEC136|export options]].
+</p>
+</dd>
+<dt> <code>-n</code></dt>
+<dd><p>Do not run module program (if any).  See [[#SEC136|export options]].
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Operate recursively (default).  See section [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-r <var>tag</var></code></dt>
+<dd><p>Checkout revision <var>tag</var>.  See [[#SEC119|Common command 
options]].
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>history [<var>options</var>] [<var>files</var>&hellip;]</code></dt>
+<dd><p>Show repository access history.  See [[#SEC137|history&mdash;Show 
status of files and users]].
+</p>
+<dl compact="compact">
+<dt> <code>-a</code></dt>
+<dd><p>All users (default is self).  See [[#SEC138|history options]].
+</p>
+</dd>
+<dt> <code>-b <var>str</var></code></dt>
+<dd><p>Back to record with <var>str</var> in module/file/repos
+field.  See [[#SEC138|history options]].
+</p>
+</dd>
+<dt> <code>-c</code></dt>
+<dd><p>Report on committed (modified) files.  See [[#SEC138|history options]].
+</p>
+</dd>
+<dt> <code>-D <var>date</var></code></dt>
+<dd><p>Since <var>date</var>.  See [[#SEC138|history options]].
+</p>
+</dd>
+<dt> <code>-e</code></dt>
+<dd><p>Report on all record types.  See [[#SEC138|history options]].
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Last modified (committed or modified report).  See [[#SEC138|history 
options]].
+</p>
+</dd>
+<dt> <code>-m <var>module</var></code></dt>
+<dd><p>Report on <var>module</var> (repeatable).  See [[#SEC138|history 
options]].
+</p>
+</dd>
+<dt> <code>-n <var>module</var></code></dt>
+<dd><p>In <var>module</var>.  See [[#SEC138|history options]].
+</p>
+</dd>
+<dt> <code>-o</code></dt>
+<dd><p>Report on checked out modules.  See [[#SEC138|history options]].
+</p>
+</dd>
+<dt> <code>-p <var>repository</var></code></dt>
+<dd><p>In <var>repository</var>.  See [[#SEC138|history options]].
+</p>
+</dd>
+<dt> <code>-r <var>rev</var></code></dt>
+<dd><p>Since revision <var>rev</var>.  See [[#SEC138|history options]].
+</p>
+</dd>
+<dt> <code>-T</code></dt>
+<dd><p>Produce report on all TAGs.  See [[#SEC138|history options]].
+</p>
+</dd>
+<dt> <code>-t <var>tag</var></code></dt>
+<dd><p>Since tag record placed in history file (by anyone).
+See [[#SEC138|history options]].
+</p>
+</dd>
+<dt> <code>-u <var>user</var></code></dt>
+<dd><p>For user <var>user</var> (repeatable).  See [[#SEC138|history options]].
+</p>
+</dd>
+<dt> <code>-w</code></dt>
+<dd><p>Working directory must match.  See [[#SEC138|history options]].
+</p>
+</dd>
+<dt> <code>-x <var>types</var></code></dt>
+<dd><p>Report on <var>types</var>, one or more of
+<code>TOEFWUCGMAR</code>.  See [[#SEC138|history options]].
+</p>
+</dd>
+<dt> <code>-z <var>zone</var></code></dt>
+<dd><p>Output for time zone <var>zone</var>.  See [[#SEC138|history options]].
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>import [<var>options</var>] <var>repository</var> 
<var>vendor-tag</var> <var>release-tags</var>&hellip;</code></dt>
+<dd><p>Import files into <small>CVS</small>, using vendor branches.  See
+[[#SEC139|import&mdash;Import sources into CVS, using vendor branches]].
+</p>
+<dl compact="compact">
+<dt> <code>-b <var>bra</var></code></dt>
+<dd><p>Import to vendor branch <var>bra</var>.  See
+[[#SEC111|Multiple vendor branches]].
+</p>
+</dd>
+<dt> <code>-d</code></dt>
+<dd><p>Use the file&rsquo;s modification time as the time of
+import.  See [[#SEC140|import options]].
+</p>
+</dd>
+<dt> <code>-k <var>kflag</var></code></dt>
+<dd><p>Set default keyword substitution mode.  See
+[[#SEC140|import options]].
+</p>
+</dd>
+<dt> <code>-m <var>msg</var></code></dt>
+<dd><p>Use <var>msg</var> for log message.  See
+[[#SEC140|import options]].
+</p>
+</dd>
+<dt> <code>-I <var>ign</var></code></dt>
+<dd><p>More files to ignore (! to reset).  See
+[[#SEC140|import options]].
+</p>
+</dd>
+<dt> <code>-W <var>spec</var></code></dt>
+<dd><p>More wrappers.  See [[#SEC140|import options]].
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>init</code></dt>
+<dd><p>Create a <small>CVS</small> repository if it doesn&rsquo;t exist.  See
+[[#SEC23|Creating a repository]].
+</p>
+</dd>
+<dt> <code>kserver</code></dt>
+<dd><p>Kerberos authenticated server.
+See [[#SEC34|Direct connection with kerberos]].
+</p>
+</dd>
+<dt> <code>log [<var>options</var>] [<var>files</var>&hellip;]</code></dt>
+<dd><p>Print out history information for files.  See [[#SEC143|log&mdash;Print 
out log information for files]].
+</p>
+<dl compact="compact">
+<dt> <code>-b</code></dt>
+<dd><p>Only list revisions on the default branch.  See [[#SEC144|log options]].
+</p>
+</dd>
+<dt> <code>-d <var>dates</var></code></dt>
+<dd><p>Specify dates (<var>d1</var>&lt;<var>d2</var> for range, <var>d</var> 
for
+latest before).  See [[#SEC144|log options]].
+</p>
+</dd>
+<dt> <code>-h</code></dt>
+<dd><p>Only print header.  See [[#SEC144|log options]].
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-N</code></dt>
+<dd><p>Do not list tags.  See [[#SEC144|log options]].
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Only print name of RCS file.  See [[#SEC144|log options]].
+</p>
+</dd>
+<dt> <code>-r<var>revs</var></code></dt>
+<dd><p>Only list revisions <var>revs</var>.  See [[#SEC144|log options]].
+</p>
+</dd>
+<dt> <code>-s <var>states</var></code></dt>
+<dd><p>Only list revisions with specified states.  See [[#SEC144|log options]].
+</p>
+</dd>
+<dt> <code>-t</code></dt>
+<dd><p>Only print header and descriptive text.  See [[#SEC144|log options]].
+</p>
+</dd>
+<dt> <code>-w<var>logins</var></code></dt>
+<dd><p>Only list revisions checked in by specified logins.  See [[#SEC144|log 
options]].
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>login</code></dt>
+<dd><p>Prompt for password for authenticating server.  See
+[[#SEC31|Using the client with password authentication]].
+</p>
+</dd>
+<dt> <code>logout</code></dt>
+<dd><p>Remove stored password for authenticating server.  See
+[[#SEC31|Using the client with password authentication]].
+</p>
+</dd>
+<dt> <code>pserver</code></dt>
+<dd><p>Password authenticated server.
+See [[#SEC30|Setting up the server for password authentication]].
+</p>
+</dd>
+<dt> <code>rannotate [<var>options</var>] 
[<var>modules</var>&hellip;]</code></dt>
+<dd><p>Show last revision where each line was modified.  See
+[[#SEC79|Annotate command]].
+</p>
+<dl compact="compact">
+<dt> <code>-D <var>date</var></code></dt>
+<dd><p>Annotate the most recent revision no later than
+<var>date</var>.  See [[#SEC119|Common command options]].
+</p>
+</dd>
+<dt> <code>-F</code></dt>
+<dd><p>Force annotation of binary files.  (Without this option,
+binary files are skipped with a message.)
+</p>
+</dd>
+<dt> <code>-f</code></dt>
+<dd><p>Use head revision if tag/date not found.  See
+[[#SEC119|Common command options]].
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See section 
[[#SEC65|Recursive behavior]].
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Operate recursively (default).  See section [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-r <var>tag</var></code></dt>
+<dd><p>Annotate revision <var>tag</var>.  See [[#SEC119|Common command 
options]].
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>rdiff [<var>options</var>] <var>modules</var>&hellip;</code></dt>
+<dd><p>Show differences between releases.  See 
[[#SEC146|rdiff&mdash;&rsquo;patch&rsquo; format diffs between releases]].
+</p>
+<dl compact="compact">
+<dt> <code>-c</code></dt>
+<dd><p>Context diff output format (default).  See [[#SEC147|rdiff options]].
+</p>
+</dd>
+<dt> <code>-D <var>date</var></code></dt>
+<dd><p>Select revisions based on <var>date</var>.  See [[#SEC119|Common 
command options]].
+</p>
+</dd>
+<dt> <code>-f</code></dt>
+<dd><p>Use head revision if tag/date not found.  See
+[[#SEC119|Common command options]].
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Operate recursively (default).  See section [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-r <var>rev</var></code></dt>
+<dd><p>Select revisions based on <var>rev</var>.  See [[#SEC119|Common command 
options]].
+</p>
+</dd>
+<dt> <code>-s</code></dt>
+<dd><p>Short patch - one liner per file.  See [[#SEC147|rdiff options]].
+</p>
+</dd>
+<dt> <code>-t</code></dt>
+<dd><p>Top two diffs - last change made to the file.  See
+[[#SEC131|diff options]].
+</p>
+</dd>
+<dt> <code>-u</code></dt>
+<dd><p>Unidiff output format.  See [[#SEC147|rdiff options]].
+</p>
+</dd>
+<dt> <code>-V <var>vers</var></code></dt>
+<dd><p>Use RCS Version <var>vers</var> for keyword expansion (obsolete).  See
+[[#SEC147|rdiff options]].
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>release [<var>options</var>] <var>directory</var></code></dt>
+<dd><p>Indicate that a directory is no longer in use.  See
+[[#SEC149|release&mdash;Indicate that a Module is no longer in use]].
+</p>
+<dl compact="compact">
+<dt> <code>-d</code></dt>
+<dd><p>Delete the given directory.  See [[#SEC150|release options]].
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>remove [<var>options</var>] [<var>files</var>&hellip;]</code></dt>
+<dd><p>Remove an entry from the repository.  See [[#SEC68|Removing files]].
+</p>
+<dl compact="compact">
+<dt> <code>-f</code></dt>
+<dd><p>Delete the file before removing it.  See [[#SEC68|Removing files]].
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Operate recursively (default).  See section [[#SEC65|Recursive 
behavior]].
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>rlog [<var>options</var>] [<var>files</var>&hellip;]</code></dt>
+<dd><p>Print out history information for modules.  See 
[[#SEC143|log&mdash;Print out log information for files]].
+</p>
+<dl compact="compact">
+<dt> <code>-b</code></dt>
+<dd><p>Only list revisions on the default branch.  See [[#SEC144|log options]].
+</p>
+</dd>
+<dt> <code>-d <var>dates</var></code></dt>
+<dd><p>Specify dates (<var>d1</var>&lt;<var>d2</var> for range, <var>d</var> 
for
+latest before).  See [[#SEC144|log options]].
+</p>
+</dd>
+<dt> <code>-h</code></dt>
+<dd><p>Only print header.  See [[#SEC144|log options]].
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-N</code></dt>
+<dd><p>Do not list tags.  See [[#SEC144|log options]].
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Only print name of RCS file.  See [[#SEC144|log options]].
+</p>
+</dd>
+<dt> <code>-r<var>revs</var></code></dt>
+<dd><p>Only list revisions <var>revs</var>.  See [[#SEC144|log options]].
+</p>
+</dd>
+<dt> <code>-s <var>states</var></code></dt>
+<dd><p>Only list revisions with specified states.  See [[#SEC144|log options]].
+</p>
+</dd>
+<dt> <code>-t</code></dt>
+<dd><p>Only print header and descriptive text.  See [[#SEC144|log options]].
+</p>
+</dd>
+<dt> <code>-w<var>logins</var></code></dt>
+<dd><p>Only list revisions checked in by specified logins.  See [[#SEC144|log 
options]].
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>rtag [<var>options</var>] <var>tag</var> 
<var>modules</var>&hellip;</code></dt>
+<dd><p>Add a symbolic tag to a module.
+See [[#SEC44|Revisions]] and [[#SEC54|Branching and merging]].
+</p>
+<dl compact="compact">
+<dt> <code>-a</code></dt>
+<dd><p>Clear tag from removed files that would not otherwise
+be tagged.  See [[#SEC52|Tagging and adding and removing files]].
+</p>
+</dd>
+<dt> <code>-b</code></dt>
+<dd><p>Create a branch named <var>tag</var>.  See [[#SEC54|Branching and 
merging]].
+</p>
+</dd>
+<dt> <code>-B</code></dt>
+<dd><p>Used in conjunction with -F or -d, enables movement and deletion of
+branch tags.  Use with extreme caution. 
+</p>
+</dd>
+<dt> <code>-D <var>date</var></code></dt>
+<dd><p>Tag revisions as of <var>date</var>.  See [[#SEC50|Specifying what to 
tag by date or revision]].
+</p>
+</dd>
+<dt> <code>-d</code></dt>
+<dd><p>Delete <var>tag</var>.  See [[#SEC51|Deleting, moving, and renaming 
tags]].
+</p>
+</dd>
+<dt> <code>-F</code></dt>
+<dd><p>Move <var>tag</var> if it already exists.  See [[#SEC51|Deleting, 
moving, and renaming tags]].
+</p>
+</dd>
+<dt> <code>-f</code></dt>
+<dd><p>Force a head revision match if tag/date not found.
+See [[#SEC50|Specifying what to tag by date or revision]].
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-n</code></dt>
+<dd><p>No execution of tag program.  See [[#SEC119|Common command options]].
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Operate recursively (default).  See section [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-r <var>rev</var></code></dt>
+<dd><p>Tag existing tag <var>rev</var>.  See [[#SEC50|Specifying what to tag 
by date or revision]].
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>server</code></dt>
+<dd><p>Rsh server.  See [[#SEC28|Connecting with rsh]].
+</p>
+</dd>
+<dt> <code>status [<var>options</var>] <var>files</var>&hellip;</code></dt>
+<dd><p>Display status information in a working directory.  See
+[[#SEC84|File status]].
+</p>
+<dl compact="compact">
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Operate recursively (default).  See section [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-v</code></dt>
+<dd><p>Include tag information for file.  See [[#SEC48|Tags&ndash;Symbolic 
revisions]].
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>tag [<var>options</var>] <var>tag</var> 
[<var>files</var>&hellip;]</code></dt>
+<dd><p>Add a symbolic tag to checked out version of files.
+See [[#SEC44|Revisions]] and [[#SEC54|Branching and merging]].
+</p>
+<dl compact="compact">
+<dt> <code>-b</code></dt>
+<dd><p>Create a branch named <var>tag</var>.  See [[#SEC54|Branching and 
merging]].
+</p>
+</dd>
+<dt> <code>-c</code></dt>
+<dd><p>Check that working files are unmodified.  See
+[[#SEC49|Specifying what to tag from the working directory]].
+</p>
+</dd>
+<dt> <code>-D <var>date</var></code></dt>
+<dd><p>Tag revisions as of <var>date</var>.  See [[#SEC50|Specifying what to 
tag by date or revision]].
+</p>
+</dd>
+<dt> <code>-d</code></dt>
+<dd><p>Delete <var>tag</var>.  See [[#SEC51|Deleting, moving, and renaming 
tags]].
+</p>
+</dd>
+<dt> <code>-F</code></dt>
+<dd><p>Move <var>tag</var> if it already exists.  See [[#SEC51|Deleting, 
moving, and renaming tags]].
+</p>
+</dd>
+<dt> <code>-f</code></dt>
+<dd><p>Force a head revision match if tag/date not found.
+See [[#SEC50|Specifying what to tag by date or revision]].
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Operate recursively (default).  See section [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-r <var>rev</var></code></dt>
+<dd><p>Tag existing tag <var>rev</var>.  See [[#SEC50|Specifying what to tag 
by date or revision]].
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>unedit [<var>options</var>] [<var>files</var>&hellip;]</code></dt>
+<dd><p>Undo an edit command.  See [[#SEC92|How to edit a file which is being 
watched]].
+</p>
+<dl compact="compact">
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Operate recursively (default).  See section [[#SEC65|Recursive 
behavior]].
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>update [<var>options</var>] [<var>files</var>&hellip;]</code></dt>
+<dd><p>Bring work tree in sync with repository.  See
+[[#SEC153|update&mdash;Bring work tree in sync with repository]].
+</p>
+<dl compact="compact">
+<dt> <code>-A</code></dt>
+<dd><p>Reset any sticky tags/date/options.  See [[#SEC53|Sticky tags]] and 
[[#SEC98|Keyword substitution]].
+</p>
+</dd>
+<dt> <code>-C</code></dt>
+<dd><p>Overwrite locally modified files with clean copies from
+the repository (the modified file is saved in
+&lsquo;<tt>.#<var>file</var>.<var>revision</var></tt>&rsquo;, however).
+</p>
+</dd>
+<dt> <code>-D <var>date</var></code></dt>
+<dd><p>Check out revisions as of <var>date</var> (is sticky).  See
+[[#SEC119|Common command options]].
+</p>
+</dd>
+<dt> <code>-d</code></dt>
+<dd><p>Create directories.  See [[#SEC154|update options]].
+</p>
+</dd>
+<dt> <code>-f</code></dt>
+<dd><p>Use head revision if tag/date not found.  See
+[[#SEC119|Common command options]].
+</p>
+</dd>
+<dt> <code>-I <var>ign</var></code></dt>
+<dd><p>More files to ignore (! to reset).  See
+[[#SEC140|import options]].
+</p>
+</dd>
+<dt> <code>-j <var>rev</var></code></dt>
+<dd><p>Merge in changes.  See [[#SEC154|update options]].
+</p>
+</dd>
+<dt> <code>-k <var>kflag</var></code></dt>
+<dd><p>Use <var>kflag</var> keyword expansion.  See
+[[#SEC102|Substitution modes]].
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See section 
[[#SEC65|Recursive behavior]].
+</p>
+</dd>
+<dt> <code>-P</code></dt>
+<dd><p>Prune empty directories.  See [[#SEC74|Moving and renaming 
directories]].
+</p>
+</dd>
+<dt> <code>-p</code></dt>
+<dd><p>Check out files to standard output (avoids
+stickiness).  See [[#SEC154|update options]].
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Operate recursively (default).  See section [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-r <var>tag</var></code></dt>
+<dd><p>Checkout revision <var>tag</var> (is sticky).  See [[#SEC119|Common 
command options]].
+</p>
+</dd>
+<dt> <code>-W <var>spec</var></code></dt>
+<dd><p>More wrappers.  See [[#SEC140|import options]].
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>version</code></dt>
+<dd><div id="IDX250"></div>
+
+<p>Display the version of <small>CVS</small> being used.  If the repository
+is remote, display both the client and server versions.
+</p>
+</dd>
+<dt> <code>watch [on|off|add|remove] [<var>options</var>] 
[<var>files</var>&hellip;]</code></dt>
+<dd>
+<p>on/off: turn on/off read-only checkouts of files.  See
+[[#SEC90|Telling CVS to watch certain files]].
+</p>
+<p>add/remove: add or remove notification on actions.  See
+[[#SEC91|Telling CVS to notify you]].
+</p>
+<dl compact="compact">
+<dt> <code>-a <var>actions</var></code></dt>
+<dd><p>Specify actions for temporary watch, where
+<var>actions</var> is <code>edit</code>, <code>unedit</code>,
+<code>commit</code>, <code>all</code>, or <code>none</code>.  See
+[[#SEC92|How to edit a file which is being watched]].
+</p>
+</dd>
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Operate recursively (default).  See section [[#SEC65|Recursive 
behavior]].
+</p></dd>
+</dl>
+
+</dd>
+<dt> <code>watchers [<var>options</var>] [<var>files</var>&hellip;]</code></dt>
+<dd><p>See who is watching a file.  See [[#SEC93|Information about who is 
watching and editing]].
+</p>
+<dl compact="compact">
+<dt> <code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See [[#SEC65|Recursive 
behavior]].
+</p>
+</dd>
+<dt> <code>-R</code></dt>
+<dd><p>Operate recursively (default).  See section [[#SEC65|Recursive 
behavior]].
+</p></dd>
+</dl>
+
+</dd>
+</dl>
+
+<hr size="6">
+<div id="Administrative-files"></div>
+<div id="SEC157"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC156| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC158| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC156| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== Reference manual for Administrative files ==
+
+<p>Inside the repository, in the directory
+&lsquo;<tt>$CVSROOT/CVSROOT</tt>&rsquo;, there are a number of
+supportive files for <small>CVS</small>.  You can use <small>CVS</small> 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 [[#SEC20|The administrative files]].
+</p>
+<p>The most important of these files is the &lsquo;<tt>modules</tt>&rsquo;
+file, which defines the modules inside the repository.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC158| 
modules]]::<nowiki>                     Defining modules
+</nowiki>&bull;[[#SEC165| Wrappers]]::<nowiki>                    Specify 
binary-ness based on file name
+</nowiki>&bull;[[#SEC166| commit files]]::<nowiki>                The commit 
support files (commitinfo,
+                                verifymsg, editinfo, loginfo)
+</nowiki>&bull;[[#SEC175| rcsinfo]]::<nowiki>                     Templates 
for the log messages
+</nowiki>&bull;[[#SEC176| cvsignore]]::<nowiki>                   Ignoring 
files via cvsignore
+</nowiki>&bull;[[#SEC177| checkoutlist]]::<nowiki>                Adding your 
own administrative files
+</nowiki>&bull;[[#SEC178| history file]]::<nowiki>                History 
information
+</nowiki>&bull;[[#SEC179| Variables]]::<nowiki>                   Various 
variables are expanded
+</nowiki>&bull;[[#SEC180| config]]::<nowiki>                      
Miscellaneous CVS configuration
+</nowiki></pre>
+<hr size="6">
+<div id="modules"></div>
+<div id="SEC158"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC157| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC159| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC157| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== The modules file ===
+
+<p>The &lsquo;<tt>modules</tt>&rsquo; file records your definitions of
+names for collections of source code.  <small>CVS</small> will
+use these definitions if you use <small>CVS</small> to update the
+modules file (use normal commands like <code>add</code>,
+<code>commit</code>, etc).
+</p>
+<p>The &lsquo;<tt>modules</tt>&rsquo; file may contain blank lines and
+comments (lines beginning with &lsquo;<samp>#</samp>&rsquo;) as well as
+module definitions.  Long lines can be continued on the
+next line by specifying a backslash (&lsquo;<samp>\</samp>&rsquo;) as the
+last character on the line.
+</p>
+<p>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 &lsquo;<tt>first-dir</tt>&rsquo;, which
+contains two files, &lsquo;<tt>file1</tt>&rsquo; and 
&lsquo;<tt>file2</tt>&rsquo;, and a
+directory &lsquo;<tt>sdir</tt>&rsquo;.  &lsquo;<tt>first-dir/sdir</tt>&rsquo; 
contains
+a file &lsquo;<tt>sfile</tt>&rsquo;.
+</p>
+
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC159| Alias 
modules]]::<nowiki>             The simplest kind of module
+</nowiki>&bull;[[#SEC160| Regular modules]]::<nowiki>
+</nowiki>&bull;[[#SEC161| Ampersand modules]]::<nowiki>
+</nowiki>&bull;[[#SEC162| Excluding directories]]::<nowiki>     Excluding 
directories from a module
+</nowiki>&bull;[[#SEC163| Module options]]::<nowiki>            Regular and 
ampersand modules can take options
+</nowiki>&bull;[[#SEC164| Module program options]]::<nowiki>    How the 
modules ``program options'' programs
+                              are run. 
+</nowiki></pre>
+<hr size="6">
+<div id="Alias-modules"></div>
+<div id="SEC159"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC158| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC160| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC158| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Alias modules ====
+
+<p>Alias modules are the simplest kind of module:
+</p>
+<dl compact="compact">
+<dt> <code><var>mname</var> -a <var>aliases</var>&hellip;</code></dt>
+<dd><p>This represents the simplest way of defining a module
+<var>mname</var>.  The &lsquo;<samp>-a</samp>&rsquo; flags the definition as a
+simple alias: <small>CVS</small> will treat any use of <var>mname</var> (as
+a command argument) as if the list of names
+<var>aliases</var> had been specified instead.
+<var>aliases</var> may contain either other module names or
+paths.  When you use paths in aliases, <code>checkout</code>
+creates all intermediate directories in the working
+directory, just as if the path had been specified
+explicitly in the <small>CVS</small> arguments.
+</p></dd>
+</dl>
+
+<p>For example, if the modules file contains:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>amodule -a first-dir
+</nowiki></pre></td></tr></table>
+
+<p>then the following two commands are equivalent:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs co amodule
+$ cvs co first-dir
+</nowiki></pre></td></tr></table>
+
+<p>and they each would provide output such as:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs checkout: 
Updating first-dir
+U first-dir/file1
+U first-dir/file2
+cvs checkout: Updating first-dir/sdir
+U first-dir/sdir/sfile
+</nowiki></pre></td></tr></table>
+
+<hr size="6">
+<div id="Regular-modules"></div>
+<div id="SEC160"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC159| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC161| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC158| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Regular modules ====
+
+<dl compact="compact">
+<dt> <code><var>mname</var> [ options ] <var>dir</var> [ 
<var>files</var>&hellip; ]</code></dt>
+<dd><p>In the simplest case, this form of module definition
+reduces to &lsquo;<samp><var>mname</var> <var>dir</var></samp>&rsquo;.  This 
defines
+all the files in directory <var>dir</var> as module mname.
+<var>dir</var> is a relative path (from <code>$CVSROOT</code>) to a
+directory of source in the source repository.  In this
+case, on checkout, a single directory called
+<var>mname</var> is created as a working directory; no
+intermediate directory levels are used by default, even
+if <var>dir</var> was a path involving several directory
+levels.
+</p></dd>
+</dl>
+
+<p>For example, if a module is defined by:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>regmodule first-dir
+</nowiki></pre></td></tr></table>
+
+<p>then regmodule will contain the files from first-dir:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs co regmodule
+cvs checkout: Updating regmodule
+U regmodule/file1
+U regmodule/file2
+cvs checkout: Updating regmodule/sdir
+U regmodule/sdir/sfile
+$
+</nowiki></pre></td></tr></table>
+
+<p>By explicitly specifying files in the module definition
+after <var>dir</var>, you can select particular files from
+directory <var>dir</var>.  Here is
+an example:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>regfiles 
first-dir/sdir sfile
+</nowiki></pre></td></tr></table>
+
+<p>With this definition, getting the regfiles module
+will create a single working directory
+&lsquo;<tt>regfiles</tt>&rsquo; containing the file listed, which
+comes from a directory deeper
+in the <small>CVS</small> source repository:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs co regfiles
+U regfiles/sfile
+$
+</nowiki></pre></td></tr></table>
+
+<hr size="6">
+<div id="Ampersand-modules"></div>
+<div id="SEC161"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC160| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC162| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC158| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Ampersand modules ====
+
+<p>A module definition can refer to other modules by
+including &lsquo;<samp>&amp;<var>module</var></samp>&rsquo; in its definition.
+</p><table><tr><td>&nbsp;</td><td><pre 
class="example"><nowiki><var>mname</var> [ options ] 
<var>&amp;module</var>&hellip;
+</nowiki></pre></td></tr></table>
+
+<p>Then getting the module creates a subdirectory for each such
+module, in the directory containing the module.  For
+example, if modules contains
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>ampermod 
&amp;first-dir
+</nowiki></pre></td></tr></table>
+
+<p>then a checkout will create an <code>ampermod</code> directory
+which contains a directory called <code>first-dir</code>,
+which in turns contains all the directories and files
+which live there.  For example, the command
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ cvs co ampermod
+</nowiki></pre></td></tr></table>
+
+<p>will create the following files:
+</p>
+<table><tr><td>&nbsp;</td><td><pre 
class="example"><nowiki>ampermod/first-dir/file1
+ampermod/first-dir/file2
+ampermod/first-dir/sdir/sfile
+</nowiki></pre></td></tr></table>
+
+<p>There is one quirk/bug: the messages that <small>CVS</small>
+prints omit the &lsquo;<tt>ampermod</tt>&rsquo;, and thus do not
+correctly display the location to which it is checking
+out the files:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>$ 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
+$
+</nowiki></pre></td></tr></table>
+
+<p>Do not rely on this buggy behavior; it may get fixed in
+a future release of <small>CVS</small>.
+</p>
+
+<hr size="6">
+<div id="Excluding-directories"></div>
+<div id="SEC162"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC161| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC163| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC158| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Excluding directories ====
+
+<p>An alias module may exclude particular directories from
+other modules by using an exclamation mark (&lsquo;<samp>!</samp>&rsquo;)
+before the name of each directory to be excluded.
+</p>
+<p>For example, if the modules file contains:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>exmodule -a 
!first-dir/sdir first-dir
+</nowiki></pre></td></tr></table>
+
+<p>then checking out the module &lsquo;<samp>exmodule</samp>&rsquo; will check
+out everything in &lsquo;<samp>first-dir</samp>&rsquo; except any files in
+the subdirectory &lsquo;<samp>first-dir/sdir</samp>&rsquo;.
+</p>
+<hr size="6">
+<div id="Module-options"></div>
+<div id="SEC163"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC162| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC164| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC158| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Module options ====
+
+<p>Either regular modules or ampersand modules can contain
+options, which supply additional information concerning
+the module.
+</p>
+<dl compact="compact">
+<dd><div id="IDX251"></div>
+</dd>
+<dt> <code>-d <var>name</var></code></dt>
+<dd><p>Name the working directory something other than the
+module name.
+</p>
+<div id="IDX252"></div>
+<div id="IDX253"></div>
+</dd>
+<dt> <code>-e <var>prog</var></code></dt>
+<dd><p>Specify a program <var>prog</var> to run whenever files in a
+module are exported.  <var>prog</var> runs with a single
+argument, the module name.
+</p>
+<div id="IDX254"></div>
+<div id="IDX255"></div>
+</dd>
+<dt> <code>-o <var>prog</var></code></dt>
+<dd><p>Specify a program <var>prog</var> to run whenever files in a
+module are checked out.  <var>prog</var> runs with a single
+argument, the module name.  See [[#SEC164|How the modules file &ldquo;program 
options&rdquo; programs are run]] for
+information on how <var>prog</var> is called.
+</p>
+<div id="IDX256"></div>
+<div id="IDX257"></div>
+<div id="IDX258"></div>
+</dd>
+<dt> <code>-s <var>status</var></code></dt>
+<dd><p>Assign a status to the module.  When the module file is
+printed with &lsquo;<samp>cvs checkout -s</samp>&rsquo; 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.
+</p>
+<div id="IDX259"></div>
+<div id="IDX260"></div>
+</dd>
+<dt> <code>-t <var>prog</var></code></dt>
+<dd><p>Specify a program <var>prog</var> to run whenever files in a
+module are tagged with <code>rtag</code>.  <var>prog</var> runs
+with two arguments: the module name and the symbolic
+tag specified to <code>rtag</code>.  It is not run
+when <code>tag</code> is executed.  Generally you will find
+that taginfo is a better solution (see section [[#SEC78|User-defined 
logging]]).
+</p></dd>
+</dl>
+
+<p>You should also see see section [[#SEC164|How the modules file 
&ldquo;program options&rdquo; programs are run]] about how the
+&ldquo;program options&rdquo; programs are run.
+</p>
+
+<hr size="6">
+<div id="Module-program-options"></div>
+<div id="SEC164"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC163| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC165| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC158| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== How the modules file &ldquo;program options&rdquo; programs are run ====
+
+<p>For checkout, rtag, and export, the program is server-based, and as such the
+following applies:-
+</p>
+<p>If using remote access methods (pserver, ext, etc.),
+<small>CVS</small> will execute this program on the server from a temporary
+directory. The path is searched for this program.
+</p>
+<p>If using &ldquo;local access&rdquo; (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.
+</p>
+<p>The programs are all run after the operation has effectively
+completed.
+</p>
+
+<hr size="6">
+<div id="Wrappers"></div>
+<div id="SEC165"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC164| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC166| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC157| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== The cvswrappers file ===
+
+
+<p>Wrappers refers to a <small>CVS</small> feature which lets you
+control certain settings based on the name of the file
+which is being operated on.  The settings are &lsquo;<samp>-k</samp>&rsquo;
+for binary files, and &lsquo;<samp>-m</samp>&rsquo; for nonmergeable text
+files.
+</p>
+<p>The &lsquo;<samp>-m</samp>&rsquo; option
+specifies the merge methodology that should be used when
+a non-binary file is updated.  <code>MERGE</code> means the usual
+<small>CVS</small> behavior: try to merge the files.  <code>COPY</code>
+means that <code>cvs update</code> will refuse to merge
+files, as it also does for files specified as binary
+with &lsquo;<samp>-kb</samp>&rsquo; (but if the file is specified as
+binary, there is no need to specify &lsquo;<samp>-m 'COPY'</samp>&rsquo;).
+<small>CVS</small> will provide the user with the
+two versions of the files, and require the user using
+mechanisms outside <small>CVS</small>, to insert any necessary
+changes.
+</p>
+<p><strong>WARNING: do not use <code>COPY</code> with
+<small>CVS</small> 1.9 or earlier - such versions of <small>CVS</small> will
+copy one version of your file over the other, wiping
+out the previous contents.</strong>
+The &lsquo;<samp>-m</samp>&rsquo; wrapper option only affects behavior when
+merging is done on update; it does not affect how files
+are stored.  See [[#SEC80|Handling binary files]], for more on
+binary files.
+</p>
+<p>The basic format of the file &lsquo;<tt>cvswrappers</tt>&rsquo; is:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>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.
+</nowiki></pre></td></tr></table>
+
+
+<p>For example, the following command imports a
+directory, treating files whose name ends in
+&lsquo;<samp>.exe</samp>&rsquo; as binary:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs import -I ! -W 
&quot;*.exe -k 'b'&quot; first-dir vendortag reltag
+</nowiki></pre></td></tr></table>
+
+
+<hr size="6">
+<div id="commit-files"></div>
+<div id="SEC166"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC165| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC167| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC157| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== The commit support files ===
+
+<p>The &lsquo;<samp>-i</samp>&rsquo; flag in the 
&lsquo;<tt>modules</tt>&rsquo; file can be
+used to run a certain program whenever files are
+committed (see section [[#SEC158|The modules file]]).  The files described in
+this section provide other, more flexible, ways to run
+programs whenever something is committed.
+</p>
+<p>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.
+</p>
+<dl compact="compact">
+<dt> &lsquo;<tt>commitinfo</tt>&rsquo;</dt>
+<dd><p>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.
+</p>
+</dd>
+<dt> &lsquo;<tt>verifymsg</tt>&rsquo;</dt>
+<dd><p>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
+&lsquo;<tt>rcsinfo</tt>&rsquo; file, which can hold a log message
+template (see section [[#SEC175|Rcsinfo]]).
+</p>
+</dd>
+<dt> &lsquo;<tt>editinfo</tt>&rsquo;</dt>
+<dd><p>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
+&lsquo;<tt>rcsinfo</tt>&rsquo; file, which can hold a log message
+template (see section [[#SEC175|Rcsinfo]]).  (obsolete)
+</p>
+</dd>
+<dt> &lsquo;<tt>loginfo</tt>&rsquo;</dt>
+<dd><p>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&hellip;  Your
+imagination is the limit!
+</p></dd>
+</dl>
+
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC167| 
syntax]]::<nowiki>                      The common syntax
+</nowiki>&bull;[[#SEC168| commitinfo]]::<nowiki>                  Pre-commit 
checking
+</nowiki>&bull;[[#SEC169| verifymsg]]::<nowiki>                   How are log 
messages evaluated?
+</nowiki>&bull;[[#SEC170| editinfo]]::<nowiki>                    Specifying 
how log messages are created
+                                (obsolete)
+</nowiki>&bull;[[#SEC172| loginfo]]::<nowiki>                     Where should 
log messages be sent?
+</nowiki></pre>
+<hr size="6">
+<div id="syntax"></div>
+<div id="SEC167"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC166| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC168| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC166| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== The common syntax ====
+
+
+<p>The administrative files such as &lsquo;<tt>commitinfo</tt>&rsquo;,
+&lsquo;<tt>loginfo</tt>&rsquo;, &lsquo;<tt>rcsinfo</tt>&rsquo;, 
&lsquo;<tt>verifymsg</tt>&rsquo;, etc.,
+all have a common format.  The purpose of the files are
+described later on.  The common syntax is described
+here.
+</p>
+<div id="IDX261"></div>
+<p>Each line contains the following:
+</p><ul>
+<li>
+A regular expression.  This is a basic regular
+expression in the syntax used by GNU emacs.
+
+</li><li>
+A whitespace separator&mdash;one or more spaces and/or tabs.
+
+</li><li>
+A file name or command-line template.
+</li></ul>
+
+<p>Blank lines are ignored.  Lines that start with the
+character &lsquo;<samp>#</samp>&rsquo; are treated as comments.  Long lines
+unfortunately can <em>not</em> be broken in two parts in
+any way.
+</p>
+<p>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.
+</p>
+
+<hr size="6">
+<div id="commitinfo"></div>
+<div id="SEC168"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC167| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC169| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC166| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Commitinfo ====
+
+<p>The &lsquo;<tt>commitinfo</tt>&rsquo; file defines programs to execute
+whenever &lsquo;<samp>cvs commit</samp>&rsquo; 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&rsquo;s standards for coding practice.
+</p>
+<p>As mentioned earlier, each line in the
+&lsquo;<tt>commitinfo</tt>&rsquo; 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).
+</p>
+<div id="IDX262"></div>
+<p>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.
+</p>
+<div id="IDX263"></div>
+<p>If the repository name does not match any of the
+regular expressions in this file, the &lsquo;<samp>DEFAULT</samp>&rsquo;
+line is used, if it is specified.
+</p>
+<div id="IDX264"></div>
+<p>All occurrences of the name &lsquo;<samp>ALL</samp>&rsquo; appearing as a
+regular expression are used in addition to the first
+matching regular expression or the name &lsquo;<samp>DEFAULT</samp>&rsquo;.
+</p>
+<div id="IDX265"></div>
+<div id="IDX266"></div>
+<p>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), <em>or in a copy of the workspace on
+the server (see section [[#SEC26|Remote repositories]])</em>.  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.
+</p>
+<p>Note that both the repository directory and the corresponding
+Attic (see section [[#SEC15|The 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.
+</p>
+
+<hr size="6">
+<div id="verifymsg"></div>
+<div id="SEC169"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC168| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC170| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC166| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Verifying log messages ====
+
+<p>Once you have entered a log message, you can evaluate
+that message to check for specific content, such as
+a bug ID.  Use the &lsquo;<tt>verifymsg</tt>&rsquo; 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.
+</p>
+<p>The &lsquo;<tt>verifymsg</tt>&rsquo; file is often most useful together
+with the &lsquo;<tt>rcsinfo</tt>&rsquo; file, which can be used to
+specify a log message template.
+</p>
+<p>Each line in the &lsquo;<tt>verifymsg</tt>&rsquo; 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.
+</p>
+<p>One thing that should be noted is that the &lsquo;<samp>ALL</samp>&rsquo;
+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.
+</p>
+<div id="IDX267"></div>
+<p>If the repository name does not match any of the
+regular expressions in this file, the &lsquo;<samp>DEFAULT</samp>&rsquo;
+line is used, if it is specified.
+</p>
+<div id="IDX268"></div>
+<p>If the verification script exits with a non-zero exit status,
+the commit is aborted.
+</p>
+<div id="IDX269"></div>
+<p>In the default configuration, CVS allows the
+verification script to change the log message. This is
+controlled via the RereadLogAfterVerify CVSROOT/config
+option.
+</p>
+<p>When &lsquo;<samp>RereadLogAfterVerify=always</samp>&rsquo; or
+&lsquo;<samp>RereadLogAfterVerify=stat</samp>&rsquo;, 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.
+</p>
+<p>See section [[#SEC180|The CVSROOT/config configuration file]], for more on 
CVSROOT/config options.
+</p>
+<p>It is NOT a good idea for a &lsquo;<tt>verifymsg</tt>&rsquo; script to
+interact directly with the user in the various
+client/server methods. For the <code>pserver</code> method,
+there is no protocol support for communicating between
+&lsquo;<tt>verifymsg</tt>&rsquo; and the client on the remote end. For the
+<code>ext</code> and <code>server</code> methods, it is possible
+for CVS to become confused by the characters going
+along the same channel as the CVS protocol
+messages. See [[#SEC26|Remote repositories]], for more
+information on client/server setups.  In addition, at the time
+the &lsquo;<tt>verifymsg</tt>&rsquo; 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.
+</p>
+<p>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 &lsquo;<tt>verifymsg</tt>&rsquo;.
+</p>
+<p>An example of an update might be to change all
+occurrences of &rsquo;BugId:&rsquo; to be &rsquo;DefectId:&rsquo; (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).
+</p>
+<p>Another example of an update might be to delete a line
+that contains &rsquo;BugID: none&rsquo; from the log message after
+validation of that value as being allowed is made.
+</p>
+<p>The following is a little silly example of a
+&lsquo;<tt>verifymsg</tt>&rsquo; file, together with the corresponding
+&lsquo;<tt>rcsinfo</tt>&rsquo; 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
+&lsquo;<tt>/usr/cvssupport/tc.template</tt>&rsquo;.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>BugId:
+</nowiki></pre></td></tr></table>
+
+<p>The script &lsquo;<tt>/usr/cvssupport/bugid.verify</tt>&rsquo; is used to
+evaluate the log message.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>#!/bin/sh
+#
+#       bugid.verify filename
+#
+#  Verify that the log message contains a valid bugid
+#  on the first line.
+#
+if head -1 &lt; $1 | grep '^BugId:[ ]*[0-9][0-9]*$' &gt; /dev/null; then
+    exit 0
+elif head -1 &lt; $1 | grep '^BugId:[ ]*none$' &gt; /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$' &gt; $1.rewrite
+    mv $1.rewrite $1
+    exit 0
+else
+    echo &quot;No BugId found.&quot;
+    exit 1
+fi
+</nowiki></pre></td></tr></table>
+
+<p>The &lsquo;<tt>verifymsg</tt>&rsquo; file contains this line:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>^tc     
/usr/cvssupport/bugid.verify
+</nowiki></pre></td></tr></table>
+
+<p>The &lsquo;<tt>rcsinfo</tt>&rsquo; file contains this line:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>^tc     
/usr/cvssupport/tc.template
+</nowiki></pre></td></tr></table>
+
+<p>The &lsquo;<tt>config</tt>&rsquo; file contains this line:
+</p>
+<table><tr><td>&nbsp;</td><td><pre 
class="example"><nowiki>RereadLogAfterVerify=always
+</nowiki></pre></td></tr></table>
+
+
+
+<hr size="6">
+<div id="editinfo"></div>
+<div id="SEC170"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC169| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC171| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC166| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Editinfo ====
+
+<p><strong>Note: The &lsquo;<tt>editinfo</tt>&rsquo; feature has been
+rendered obsolete.  To set a default editor for log
+messages use the <code>CVSEDITOR</code>, <code>EDITOR</code> environment 
variables
+(see section [[#SEC181|All environment variables which affect CVS]]) or the 
&lsquo;<samp>-e</samp>&rsquo; global
+option (see section [[#SEC118|Global options]]).  See [[#SEC169|Verifying log 
messages]],
+for information on the use of the &lsquo;<tt>verifymsg</tt>&rsquo;
+feature for evaluating log messages.</strong>
+</p>
+<p>If you want to make sure that all log messages look the
+same way, you can use the &lsquo;<tt>editinfo</tt>&rsquo; 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.
+</p>
+<p>If no matching line is found in the &lsquo;<tt>editinfo</tt>&rsquo;
+file, the editor specified in the environment variable
+<code>$CVSEDITOR</code> is used instead.  If that variable is
+not set, then the environment variable <code>$EDITOR</code>
+is used instead.  If that variable is not
+set a default will be used.  See [[#SEC6|Committing your changes]].
+</p>
+<p>The &lsquo;<tt>editinfo</tt>&rsquo; file is often most useful together
+with the &lsquo;<tt>rcsinfo</tt>&rsquo; file, which can be used to
+specify a log message template.
+</p>
+<p>Each line in the &lsquo;<tt>editinfo</tt>&rsquo; 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.
+</p>
+<p>One thing that should be noted is that the &lsquo;<samp>ALL</samp>&rsquo;
+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.
+</p>
+<div id="IDX270"></div>
+<p>If the repository name does not match any of the
+regular expressions in this file, the &lsquo;<samp>DEFAULT</samp>&rsquo;
+line is used, if it is specified.
+</p>
+<p>If the edit script exits with a non-zero exit status,
+the commit is aborted.
+</p>
+<p>Note: when <small>CVS</small> is accessing a remote repository,
+or when the &lsquo;<samp>-m</samp>&rsquo; or &lsquo;<samp>-F</samp>&rsquo; 
options to <code>cvs
+commit</code> are used, &lsquo;<tt>editinfo</tt>&rsquo; will not be consulted.
+There is no good workaround for this; use
+&lsquo;<tt>verifymsg</tt>&rsquo; instead.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC171| editinfo 
example]]::<nowiki>            Editinfo example
+</nowiki></pre>
+<hr size="6">
+<div id="editinfo-example"></div>
+<div id="SEC171"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC170| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC172| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC170| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+===== Editinfo example =====
+
+<p>The following is a little silly example of a
+&lsquo;<tt>editinfo</tt>&rsquo; file, together with the corresponding
+&lsquo;<tt>rcsinfo</tt>&rsquo; 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
+&lsquo;<tt>/usr/cvssupport/tc.template</tt>&rsquo;.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>BugId:
+</nowiki></pre></td></tr></table>
+
+<p>The script &lsquo;<tt>/usr/cvssupport/bugid.edit</tt>&rsquo; is used to
+edit the log message.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>#!/bin/sh
+#
+#       bugid.edit filename
+#
+#  Call $EDITOR on FILENAME, and verify that the
+#  resulting file contains a valid bugid on the first
+#  line.
+if [ &quot;x$EDITOR&quot; = &quot;x&quot; ]; then EDITOR=vi; fi
+if [ &quot;x$CVSEDITOR&quot; = &quot;x&quot; ]; then CVSEDITOR=$EDITOR; fi
+$CVSEDITOR $1
+until head -1|grep '^BugId:[ ]*[0-9][0-9]*$' &lt; $1
+do  echo -n  &quot;No BugId found.  Edit again? ([y]/n)&quot;
+    read ans
+    case ${ans} in
+        n*) exit 1;;
+    esac
+    $CVSEDITOR $1
+done
+</nowiki></pre></td></tr></table>
+
+<p>The &lsquo;<tt>editinfo</tt>&rsquo; file contains this line:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>^tc     
/usr/cvssupport/bugid.edit
+</nowiki></pre></td></tr></table>
+
+<p>The &lsquo;<tt>rcsinfo</tt>&rsquo; file contains this line:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>^tc     
/usr/cvssupport/tc.template
+</nowiki></pre></td></tr></table>
+
+<hr size="6">
+<div id="loginfo"></div>
+<div id="SEC172"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC171| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC173| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC166| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+==== Loginfo ====
+
+<p>The &lsquo;<tt>loginfo</tt>&rsquo; file is used to control where
+&lsquo;<samp>cvs commit</samp>&rsquo; log information is sent.  The first
+entry on a line is a regular expression which is tested
+against the directory that the change is being made to,
+relative to the <code>$CVSROOT</code>.  If a match is found, then
+the remainder of the line is a filter program that
+should expect log information on its standard input.
+</p>
+<p>If the repository name does not match any of the
+regular expressions in this file, the &lsquo;<samp>DEFAULT</samp>&rsquo;
+line is used, if it is specified.
+</p>
+<p>All occurrences of the name &lsquo;<samp>ALL</samp>&rsquo; appearing as a
+regular expression are used in addition to the first
+matching regular expression or &lsquo;<samp>DEFAULT</samp>&rsquo;.
+</p>
+<p>The first matching regular expression is used.
+</p>
+<p>See section [[#SEC166|The commit support files]], for a description of the 
syntax of
+the &lsquo;<tt>loginfo</tt>&rsquo; file.
+</p>
+<p>The user may specify a format string as
+part of the filter.  The string is composed of a
+&lsquo;<samp>%</samp>&rsquo; followed by a space, or followed by a single
+format character, or followed by a set of format
+characters surrounded by &lsquo;<samp>{</samp>&rsquo; and 
&lsquo;<samp>}</samp>&rsquo; as
+separators.  The format characters are:
+</p>
+<dl compact="compact">
+<dt> <tt>s</tt></dt>
+<dd><p>file name
+</p></dd>
+<dt> <tt>V</tt></dt>
+<dd><p>old version number (pre-checkin)
+</p></dd>
+<dt> <tt>v</tt></dt>
+<dd><p>new version number (post-checkin)
+</p></dd>
+</dl>
+
+<p>All other characters that appear in a format string
+expand to an empty field (commas separating fields are
+still provided).
+</p>
+<p>For example, some valid format strings are &lsquo;<samp>%</samp>&rsquo;,
+&lsquo;<samp>%s</samp>&rsquo;, &lsquo;<samp>%{s}</samp>&rsquo;, and 
&lsquo;<samp>%{sVv}</samp>&rsquo;.
+</p>
+<p>The output will be a space separated string of tokens enclosed in
+quotation marks (<tt>&quot;</tt>).
+Any embedded dollar signs (<tt>$</tt>), backticks (<tt>&lsquo;</tt>),
+backslashes (<tt>\</tt>), 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
+&lsquo;<samp>/u/src/master/yoyodyne/tc</samp>&rsquo; is the repository, 
&lsquo;<samp>%{sVv}</samp>&rsquo;
+is the format string, and three files (<tt>ChangeLog</tt>,
+<tt>Makefile</tt>, <tt>foo.c</tt>) were modified, the output
+might be:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>&quot;yoyodyne/tc 
ChangeLog,1.1,1.2 Makefile,1.3,1.4 foo.c,1.12,1.13&quot;
+</nowiki></pre></td></tr></table>
+
+<p>As another example, &lsquo;<samp>%{}</samp>&rsquo; means that only the
+name of the repository will be generated.
+</p>
+<p>Note: when <small>CVS</small> is accessing a remote repository,
+&lsquo;<tt>loginfo</tt>&rsquo; will be run on the <em>remote</em>
+(i.e., server) side, not the client side (see section [[#SEC26|Remote 
repositories]]).
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC173| loginfo 
example]]::<nowiki>             Loginfo example
+</nowiki>&bull;[[#SEC174| Keeping a checked out copy]]::<nowiki>  Updating a 
tree on every checkin
+</nowiki></pre>
+<hr size="6">
+<div id="loginfo-example"></div>
+<div id="SEC173"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC172| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC174| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC172| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+===== Loginfo example =====
+
+<p>The following &lsquo;<tt>loginfo</tt>&rsquo; file, together with the
+tiny shell-script below, appends all log messages
+to the file &lsquo;<tt>$CVSROOT/CVSROOT/commitlog</tt>&rsquo;,
+and any commits to the administrative files (inside
+the &lsquo;<tt>CVSROOT</tt>&rsquo; directory) are also logged in
+&lsquo;<tt>/usr/adm/cvsroot-log</tt>&rsquo;.
+Commits to the &lsquo;<tt>prog1</tt>&rsquo; directory are mailed to 
<tt>ceder</tt>.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>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
+</nowiki></pre></td></tr></table>
+
+<p>The shell-script &lsquo;<tt>/usr/local/bin/cvs-log</tt>&rsquo; looks
+like this:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>#!/bin/sh
+(echo &quot;------------------------------------------------------&quot;;
+ echo -n $2&quot;  &quot;;
+ date;
+ echo;
+ cat) &gt;&gt; $1
+</nowiki></pre></td></tr></table>
+
+<hr size="6">
+<div id="Keeping-a-checked-out-copy"></div>
+<div id="SEC174"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC173| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC175| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC172| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+===== Keeping a checked out copy =====
+
+
+<p>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 <small>CVS</small> and want every checkin to cause the files
+used by the web server to be updated.
+</p>
+<p>The way to do this is by having loginfo invoke
+<code>cvs update</code>.  Doing so in the naive way will
+cause a problem with locks, so the <code>cvs update</code>
+must be run in the background.
+Here is an example for unix (this should all be on one line):
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>^cyclic-pages       
        (date; cat; (sleep 2; cd /u/www/local-docs;
+ cvs -q update -d) &amp;) &gt;&gt; $CVSROOT/CVSROOT/updatelog 2&gt;&amp;1
+</nowiki></pre></td></tr></table>
+
+<p>This will cause checkins to repository directories
+starting with <code>cyclic-pages</code> to update the checked
+out tree in &lsquo;<tt>/u/www/local-docs</tt>&rsquo;.
+</p>
+<hr size="6">
+<div id="rcsinfo"></div>
+<div id="SEC175"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC174| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC176| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC157| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Rcsinfo ===
+
+<p>The &lsquo;<tt>rcsinfo</tt>&rsquo; file can be used to specify a form to
+edit when filling out the commit log.  The
+&lsquo;<tt>rcsinfo</tt>&rsquo; file has a syntax similar to the
+&lsquo;<tt>verifymsg</tt>&rsquo;, &lsquo;<tt>commitinfo</tt>&rsquo; and 
&lsquo;<tt>loginfo</tt>&rsquo;
+files.  See section [[#SEC167|The common syntax]].  Unlike the other files the 
second
+part is <em>not</em> a command-line template.  Instead,
+the part after the regular expression should be a full pathname to
+a file containing the log message template.
+</p>
+<p>If the repository name does not match any of the
+regular expressions in this file, the &lsquo;<samp>DEFAULT</samp>&rsquo;
+line is used, if it is specified.
+</p>
+<p>All occurrences of the name &lsquo;<samp>ALL</samp>&rsquo; appearing as a
+regular expression are used in addition to the first
+matching regular expression or &lsquo;<samp>DEFAULT</samp>&rsquo;.
+</p>
+<p>The log message template will be used as a default log
+message.  If you specify a log message with &lsquo;<samp>cvs
+commit -m <var>message</var></samp>&rsquo; or &lsquo;<samp>cvs commit -f
+<var>file</var></samp>&rsquo; that log message will override the
+template.
+</p>
+<p>See section [[#SEC169|Verifying log messages]], for an example 
&lsquo;<tt>rcsinfo</tt>&rsquo;
+file.
+</p>
+<p>When <small>CVS</small> is accessing a remote repository,
+the contents of &lsquo;<tt>rcsinfo</tt>&rsquo; at the time a directory
+is first checked out will specify a template. This
+template will be updated on all &lsquo;<samp>cvs update</samp>&rsquo;
+commands. It will also be added to new directories
+added with a &lsquo;<samp>cvs add new-directry</samp>&rsquo; command.
+In versions of <small>CVS</small> prior to version 1.12, the
+&lsquo;<tt>CVS/Template</tt>&rsquo; file was not updated. If the
+<small>CVS</small> server is at version 1.12 or higher an older
+client may be used and the &lsquo;<tt>CVS/Template</tt>&rsquo; will
+be updated from the server.
+</p>
+<hr size="6">
+<div id="cvsignore"></div>
+<div id="SEC176"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC175| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC177| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC157| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Ignoring files via cvsignore ===
+
+<p>There are certain file names that frequently occur
+inside your working copy, but that you don&rsquo;t want to
+put under <small>CVS</small> control.  Examples are all the object
+files that you get while you compile your sources.
+Normally, when you run &lsquo;<samp>cvs update</samp>&rsquo;, it prints a
+line for each file it encounters that it doesn&rsquo;t know
+about (see section [[#SEC155|update output]]).
+</p>
+<p><small>CVS</small> has a list of files (or sh(1) file name patterns)
+that it should ignore while running <code>update</code>,
+<code>import</code> and <code>release</code>.
+This list is constructed in the following way.
+</p>
+<ul>
+<li>
+The list is initialized to include certain file name
+patterns: names associated with <small>CVS</small>
+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:
+
+<div id="IDX271"></div>
+<div id="IDX272"></div>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>    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
+</nowiki></pre></td></tr></table>
+
+</li><li>
+The per-repository list in
+&lsquo;<tt>$CVSROOT/CVSROOT/cvsignore</tt>&rsquo; is appended to
+the list, if that file exists.
+
+</li><li>
+The per-user list in &lsquo;<tt>.cvsignore</tt>&rsquo; in your home
+directory is appended to the list, if it exists.
+
+</li><li>
+Any entries in the environment variable
+<code>$CVSIGNORE</code> is appended to the list.
+
+</li><li>
+Any &lsquo;<samp>-I</samp>&rsquo; options given to <small>CVS</small> is 
appended.
+
+</li><li>
+As <small>CVS</small> traverses through your directories, the contents
+of any &lsquo;<tt>.cvsignore</tt>&rsquo; will be appended to the list.
+The patterns found in &lsquo;<tt>.cvsignore</tt>&rsquo; are only valid
+for the directory that contains them, not for
+any sub-directories.
+</li></ul>
+
+<p>In any of the 5 places listed above, a single
+exclamation mark (&lsquo;<samp>!</samp>&rsquo;) clears the ignore list.
+This can be used if you want to store any file which
+normally is ignored by <small>CVS</small>.
+</p>
+<p>Specifying &lsquo;<samp>-I !</samp>&rsquo; to <code>cvs import</code> 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 &lsquo;<tt>.cvsignore</tt>&rsquo; files, then
+the patterns from those files will be processed even if
+&lsquo;<samp>-I !</samp>&rsquo; is specified.  The only workaround is to
+remove the &lsquo;<tt>.cvsignore</tt>&rsquo; files in order to do the
+import.  Because this is awkward, in the future
+&lsquo;<samp>-I !</samp>&rsquo; might be modified to override
+&lsquo;<tt>.cvsignore</tt>&rsquo; files in each directory.
+</p>
+<p>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 &lsquo;<tt>foo?bar</tt>&rsquo; to match a file
+named &lsquo;<tt>foo bar</tt>&rsquo; (it also matches 
&lsquo;<tt>fooxbar</tt>&rsquo;
+and the like).  Also note that there is currently no
+way to specify comments.
+</p>
+<hr size="6">
+<div id="checkoutlist"></div>
+<div id="SEC177"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC176| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC178| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC157| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== The checkoutlist file ===
+
+<p>It may be helpful to use <small>CVS</small> to maintain your own
+files in the &lsquo;<tt>CVSROOT</tt>&rsquo; directory.  For example,
+suppose that you have a script &lsquo;<tt>logcommit.pl</tt>&rsquo;
+which you run by including the following line in the
+&lsquo;<tt>commitinfo</tt>&rsquo; administrative file:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>ALL   
$CVSROOT/CVSROOT/logcommit.pl
+</nowiki></pre></td></tr></table>
+
+<p>To maintain &lsquo;<tt>logcommit.pl</tt>&rsquo; with <small>CVS</small> you 
would
+add the following line to the &lsquo;<tt>checkoutlist</tt>&rsquo;
+administrative file:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>logcommit.pl
+</nowiki></pre></td></tr></table>
+
+<p>The format of &lsquo;<tt>checkoutlist</tt>&rsquo; is one line for each
+file that you want to maintain using <small>CVS</small>, giving
+the name of the file.
+</p>
+<p>After setting up &lsquo;<tt>checkoutlist</tt>&rsquo; in this fashion,
+the files listed there will function just like
+<small>CVS</small>&rsquo;s built-in administrative files.  For example,
+when checking in one of the files you should get a
+message such as:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs commit: 
Rebuilding administrative file database
+</nowiki></pre></td></tr></table>
+
+<p>and the checked out copy in the &lsquo;<tt>CVSROOT</tt>&rsquo;
+directory should be updated.
+</p>
+<p>Note that listing &lsquo;<tt>passwd</tt>&rsquo; (see section 
[[#SEC30|Setting up the server for password authentication]]) in 
&lsquo;<tt>checkoutlist</tt>&rsquo; is not
+recommended for security reasons.
+</p>
+<p>For information about keeping a checkout out copy in a
+more general context than the one provided by
+&lsquo;<tt>checkoutlist</tt>&rsquo;, see [[#SEC174|Keeping a checked out 
copy]].
+</p>
+<hr size="6">
+<div id="history-file"></div>
+<div id="SEC178"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC177| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC179| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC157| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== The history file ===
+
+<p>The file &lsquo;<tt>$CVSROOT/CVSROOT/history</tt>&rsquo; is used
+to log information for the <code>history</code> command
+(see section [[#SEC137|history&mdash;Show status of files and users]]).  This 
file must be created to turn
+on logging.  This is done automatically if the
+<code>cvs init</code> command is used to set up the
+repository (see section [[#SEC23|Creating a repository]]).
+</p>
+<p>The file format of the &lsquo;<tt>history</tt>&rsquo; file is
+documented only in comments in the <small>CVS</small> source
+code, but generally programs should use the <code>cvs
+history</code> command to access it anyway, in case the
+format changes with future releases of <small>CVS</small>.
+</p>
+<hr size="6">
+<div id="Variables"></div>
+<div id="SEC179"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC178| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC180| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC157| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Expansions in administrative files ===
+
+<p>Sometimes in writing an administrative file, you might
+want the file to be able to know various things based
+on environment <small>CVS</small> is running in.  There are
+several mechanisms to do that.
+</p>
+<p>To find the home directory of the user running <small>CVS</small>
+(from the <code>HOME</code> environment variable), use
+&lsquo;<samp>~</samp>&rsquo; followed by &lsquo;<samp>/</samp>&rsquo; or the 
end of the line.
+Likewise for the home directory of <var>user</var>, use
+&lsquo;<samp>~<var>user</var></samp>&rsquo;.  These variables are expanded on
+the server machine, and don&rsquo;t get any reasonable
+expansion if pserver (see section [[#SEC29|Direct connection with password 
authentication]])
+is in use; therefore user variables (see below) may be
+a better choice to customize behavior based on the user
+running <small>CVS</small>.
+</p>
+<p>One may want to know about various pieces of
+information internal to <small>CVS</small>.  A <small>CVS</small> internal
+variable has the syntax <code>${<var>variable</var>}</code>,
+where <var>variable</var> starts with a letter and consists
+of alphanumeric characters and &lsquo;<samp>_</samp>&rsquo;.  If the
+character following <var>variable</var> is a
+non-alphanumeric character other than &lsquo;<samp>_</samp>&rsquo;, the
+&lsquo;<samp>{</samp>&rsquo; and &lsquo;<samp>}</samp>&rsquo; can be omitted.  
The <small>CVS</small>
+internal variables are:
+</p>
+<dl compact="compact">
+<dt> <code>CVSROOT</code></dt>
+<dd><div id="IDX273"></div>
+<p>This is the absolute path to the current <small>CVS</small> root directory.
+See section [[#SEC9|The 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.
+</p>
+</dd>
+<dt> <code>RCSBIN</code></dt>
+<dd><div id="IDX274"></div>
+<p>In <small>CVS</small> 1.9.18 and older, this specified the
+directory where <small>CVS</small> was looking for <small>RCS</small>
+programs.  Because <small>CVS</small> no longer runs <small>RCS</small>
+programs, specifying this internal variable is now an
+error.
+</p>
+</dd>
+<dt> <code>CVSEDITOR</code></dt>
+<dd><div id="IDX275"></div>
+</dd>
+<dt> <code>EDITOR</code></dt>
+<dd><div id="IDX276"></div>
+</dd>
+<dt> <code>VISUAL</code></dt>
+<dd><div id="IDX277"></div>
+<p>These all expand to the same value, which is the editor
+that <small>CVS</small> is using.  See section [[#SEC118|Global options]], for 
how
+to specify this.
+</p>
+</dd>
+<dt> <code>USER</code></dt>
+<dd><div id="IDX278"></div>
+<p>Username of the user running <small>CVS</small> (on the <small>CVS</small>
+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 (see section [[#SEC30|Setting up the server for password 
authentication]]).
+Do not confuse this with the environment variable of the same name.
+</p></dd>
+</dl>
+
+<p>If you want to pass a value to the administrative files
+which the user who is running <small>CVS</small> can specify,
+use a user variable.
+<div id="IDX279"></div>
+To expand a user variable, the
+administrative file contains
+<code>${=<var>variable</var>}</code>.  To set a user variable,
+specify the global option &lsquo;<samp>-s</samp>&rsquo; to <small>CVS</small>, 
with
+argument <code><var>variable</var>=<var>value</var></code>.  It may be
+particularly useful to specify this option via
+&lsquo;<tt>.cvsrc</tt>&rsquo; (see section [[#SEC117|Default options and the 
~/.cvsrc file]]).
+</p>
+<p>For example, if you want the administrative file to
+refer to a test directory you might create a user
+variable <code>TESTDIR</code>.  Then if <small>CVS</small> is invoked
+as
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs -s 
TESTDIR=/work/local/tests
+</nowiki></pre></td></tr></table>
+
+<p>and the
+administrative file contains <code>sh
+${=TESTDIR}/runtests</code>, then that string is expanded
+to <code>sh /work/local/tests/runtests</code>.
+</p>
+<p>All other strings containing &lsquo;<samp>$</samp>&rsquo; are reserved;
+there is no way to quote a &lsquo;<samp>$</samp>&rsquo; character so that
+&lsquo;<samp>$</samp>&rsquo; represents itself.
+</p>
+<p>Environment variables passed to administrative files are:
+</p>
+<dl compact="compact">
+<dd><div id="IDX280"></div>
+
+</dd>
+<dt> <code>CVS_USER</code></dt>
+<dd><div id="IDX281"></div>
+<p>The <small>CVS</small>-specific username provided by the user, if it
+can be provided (currently just for the pserver access
+method), and to the empty string otherwise.  (<code>CVS_USER</code>
+and <code>USER</code> may differ when 
&lsquo;<tt>$CVSROOT/CVSROOT/passwd</tt>&rsquo;
+is used to map <small>CVS</small> usernames to system usernames.)
+</p>
+</dd>
+<dt> <code>LOGNAME</code></dt>
+<dd><div id="IDX282"></div>
+<p>The username of the system user.
+</p>
+</dd>
+<dt> <code>USER</code></dt>
+<dd><div id="IDX283"></div>
+<p>Same as <code>LOGNAME</code>.
+Do not confuse this with the internal variable of the same name.
+</p></dd>
+</dl>
+
+<hr size="6">
+<div id="config"></div>
+<div id="SEC180"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC179| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC157| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC181| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== The CVSROOT/config configuration file ===
+
+
+<p>The administrative file &lsquo;<tt>config</tt>&rsquo; contains various
+miscellaneous settings which affect the behavior of
+<small>CVS</small>.  The syntax is slightly different from the
+other administrative files.  Variables are not
+expanded.  Lines which start with &lsquo;<samp>#</samp>&rsquo; are
+considered comments.
+Other lines consist of a keyword, &lsquo;<samp>=</samp>&rsquo;, and a
+value.  Note that this syntax is very strict.
+Extraneous spaces or tabs are not permitted.
+</p>
+<p>Currently defined keywords are:
+</p>
+<dl compact="compact">
+<dd><div id="IDX284"></div>
+</dd>
+<dt> <code>RCSBIN=<var>bindir</var></code></dt>
+<dd><p>For <small>CVS</small> 1.9.12 through 1.9.18, this setting told
+<small>CVS</small> to look for <small>RCS</small> programs in the
+<var>bindir</var> directory.  Current versions of <small>CVS</small>
+do not run <small>RCS</small> programs; for compatibility this
+setting is accepted, but it does nothing.
+</p>
+<div id="IDX285"></div>
+</dd>
+<dt> <code>SystemAuth=<var>value</var></code></dt>
+<dd><p>If <var>value</var> is &lsquo;<samp>yes</samp>&rsquo;, then pserver 
should check
+for users in the system&rsquo;s user database if not found in
+&lsquo;<tt>CVSROOT/passwd</tt>&rsquo;.  If it is 
&lsquo;<samp>no</samp>&rsquo;, then all
+pserver users must exist in &lsquo;<tt>CVSROOT/passwd</tt>&rsquo;.
+The default is &lsquo;<samp>yes</samp>&rsquo;.  For more on pserver, see
+[[#SEC29|Direct connection with password authentication]].
+</p>
+
+<div id="IDX286"></div>
+</dd>
+<dt> <code>TopLevelAdmin=<var>value</var></code></dt>
+<dd><p>Modify the &lsquo;<samp>checkout</samp>&rsquo; command to create a
+&lsquo;<samp>CVS</samp>&rsquo; directory at the top level of the new
+working directory, in addition to &lsquo;<samp>CVS</samp>&rsquo;
+directories created within checked-out directories.
+The default value is &lsquo;<samp>no</samp>&rsquo;.
+</p>
+<p>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 &lsquo;<tt>CVS</tt>&rsquo; directory created there
+will mean you don&rsquo;t have to specify <code>CVSROOT</code> for
+each command.  It also provides a place for the
+&lsquo;<tt>CVS/Template</tt>&rsquo; file (see section [[#SEC19|How data is 
stored in the working directory]]).
+</p>
+<div id="IDX287"></div>
+</dd>
+<dt> <code>LockDir=<var>directory</var></code></dt>
+<dd><p>Put <small>CVS</small> lock files in <var>directory</var> 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 <var>directory</var>, 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 <var>directory</var>, but
+<small>CVS</small> will create subdirectories of <var>directory</var> as it
+needs them.  For information on <small>CVS</small> locks, see
+[[#SEC88|Several developers simultaneously attempting to run CVS]].
+</p>
+<p>Before enabling the LockDir option, make sure that you
+have tracked down and removed any copies of <small>CVS</small> 1.9 or
+older.  Such versions neither support LockDir, nor will
+give an error indicating that they don&rsquo;t support it.
+The result, if this is allowed to happen, is that some
+<small>CVS</small> users will put the locks one place, and others will
+put them another place, and therefore the repository
+could become corrupted.  <small>CVS</small> 1.10 does not support
+LockDir but it will print a warning if run on a
+repository with LockDir enabled.
+</p>
+<div id="IDX288"></div>
+</dd>
+<dt> <code>LogHistory=<var>value</var></code></dt>
+<dd><p>Control what is logged to the &lsquo;<tt>CVSROOT/history</tt>&rsquo; 
file (see section [[#SEC137|history&mdash;Show status of files and users]]).
+Default of &lsquo;<samp>TOEFWUCGMAR</samp>&rsquo; (or simply 
&lsquo;<samp>all</samp>&rsquo;) will log
+all transactions.  Any subset of the default is
+legal.  (For example, to only log transactions that modify the
+&lsquo;<tt>*,v</tt>&rsquo; files, use 
&lsquo;<samp>LogHistory=TMAR</samp>&rsquo;.)
+</p>
+<div id="IDX289"></div>
+<div id="IDX290"></div>
+</dd>
+<dt> <code>RereadLogAfterVerify=<var>value</var></code></dt>
+<dd><p>Modify the &lsquo;<samp>commit</samp>&rsquo; command such that CVS will 
reread the
+log message after running the program specified by 
&lsquo;<tt>verifymsg</tt>&rsquo;.
+<var>value</var> may be one of &lsquo;<samp>yes</samp>&rsquo; or 
&lsquo;<samp>always</samp>&rsquo;, indicating that
+the log message should always be reread; &lsquo;<samp>no</samp>&rsquo;
+or &lsquo;<samp>never</samp>&rsquo;, indicating that it should never be
+reread; or <var>value</var> may be &lsquo;<samp>stat</samp>&rsquo;, indicating
+that the file should be checked with the filesystem
+&lsquo;<samp>stat()</samp>&rsquo; function to see if it has changed (see 
warning below)
+before rereading.  The default value is &lsquo;<samp>always</samp>&rsquo;.
+</p>
+<p><strong>Note: the &lsquo;stat&rsquo; 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</strong>
+</p>
+<p>See section [[#SEC169|Verifying log messages]], for more information on how 
verifymsg
+may be used.
+</p>
+<div id="IDX291"></div>
+</dd>
+<dt> <code>UserAdminOptions=<var>value</var></code></dt>
+<dd><p>Control what options will be allowed with the <code>cvs admin</code>
+command (see section [[#SEC120|admin&mdash;Administration]]) for users not in 
the <code>cvsadmin</code> group.
+The <var>value</var> string is a list of single character options
+which should be allowed.  If a user who is not a member of the
+<code>cvsadmin</code> group tries to execute any <code>cvs admin</code>
+option which is not listed they will will receive an error message
+reporting that the option is restricted.
+</p>
+<p>If no <code>cvsadmin</code> group exists on the server, <small>CVS</small> 
will
+ignore the <code>UserAdminOptions</code> keyword (see section 
[[#SEC120|admin&mdash;Administration]]).
+</p>
+<p>When not specified, <code>UserAdminOptions</code> defaults to
+&lsquo;<samp>k</samp>&rsquo;.  In other words, it defaults to allowing
+users outside of the <code>cvsadmin</code> group to use the
+<code>cvs admin</code> command only to change the default keyword
+expansion mode for files.
+</p>
+<p>As an example, to restrict users not in the <code>cvsadmin</code>
+group to using <code>cvs admin</code> to change the default keyword
+substitution mode, lock revisions, unlock revisions, and
+replace the log message, use &lsquo;<samp>UserAdminOptions=klum</samp>&rsquo;.
+</p></dd>
+</dl>
+
+<hr size="6">
+<div id="Environment-variables"></div>
+<div id="SEC181"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC180| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC182| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC157| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC182| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== All environment variables which affect CVS ==
+
+<p>This is a complete list of all environment variables
+that affect <small>CVS</small>.
+</p>
+<dl compact="compact">
+<dd><div id="IDX292"></div>
+</dd>
+<dt> <code>$CVSIGNORE</code></dt>
+<dd><p>A whitespace-separated list of file name patterns that
+<small>CVS</small> should ignore. See section [[#SEC176|Ignoring files via 
cvsignore]].
+</p>
+<div id="IDX293"></div>
+</dd>
+<dt> <code>$CVSWRAPPERS</code></dt>
+<dd><p>A whitespace-separated list of file name patterns that
+<small>CVS</small> should treat as wrappers. See section [[#SEC165|The 
cvswrappers file]].
+</p>
+<div id="IDX294"></div>
+<div id="IDX295"></div>
+</dd>
+<dt> <code>$CVSREAD</code></dt>
+<dd><p>If this is set, <code>checkout</code> and <code>update</code> 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.
+</p>
+<div id="IDX296"></div>
+</dd>
+<dt> <code>$CVSREADONLYFS</code></dt>
+<dd><p>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.
+</p>
+<p>It has the same effect as if the &lsquo;<samp>-R</samp>&rsquo; command-line
+option is used. This can also allow the use of
+read-only NFS repositories.
+</p>
+</dd>
+<dt> <code>$CVSUMASK</code></dt>
+<dd><p>Controls permissions of files in the repository.  See
+[[#SEC13|File permissions]].
+</p>
+</dd>
+<dt> <code>$CVSROOT</code></dt>
+<dd><p>Should contain the full pathname to the root of the <small>CVS</small>
+source repository (where the <small>RCS</small> files are
+kept).  This information must be available to <small>CVS</small> for
+most commands to execute; if <code>$CVSROOT</code> is not set,
+or if you wish to override it for one invocation, you
+can supply it on the command line: &lsquo;<samp>cvs -d cvsroot
+cvs_command&hellip;</samp>&rsquo; Once you have checked out a working
+directory, <small>CVS</small> stores the appropriate root (in
+the file &lsquo;<tt>CVS/Root</tt>&rsquo;), so normally you only need to
+worry about this when initially checking out a working
+directory.
+</p>
+</dd>
+<dt> <code>$CVSEDITOR</code></dt>
+<dd><div id="IDX297"></div>
+</dd>
+<dt> <code>$EDITOR</code></dt>
+<dd><div id="IDX298"></div>
+</dd>
+<dt> <code>$VISUAL</code></dt>
+<dd><div id="IDX299"></div>
+<p>Specifies the program to use for recording log messages
+during commit.  <code>$CVSEDITOR</code> overrides
+<code>$EDITOR</code>, which overrides <code>$VISUAL</code>.
+See [[#SEC6|Committing your changes]] for more or
+[[#SEC118|Global options]] for alternative ways of specifying a
+log editor.
+</p>
+<div id="IDX300"></div>
+</dd>
+<dt> <code>$PATH</code></dt>
+<dd><p>If <code>$RCSBIN</code> is not set, and no path is compiled
+into <small>CVS</small>, it will use <code>$PATH</code> to try to find all
+programs it uses.
+</p>
+<div id="IDX301"></div>
+</dd>
+<dt> <code>$HOME</code></dt>
+<dd><div id="IDX302"></div>
+</dd>
+<dt> <code>$HOMEPATH</code></dt>
+<dd><div id="IDX303"></div>
+</dd>
+<dt> <code>$HOMEDRIVE</code></dt>
+<dd><p>Used to locate the directory where the &lsquo;<tt>.cvsrc</tt>&rsquo;
+file, and other such files, are searched.  On Unix, <small>CVS</small>
+just checks for <code>HOME</code>.  On Windows NT, the system will
+set <code>HOMEDRIVE</code>, for example to &lsquo;<samp>d:</samp>&rsquo; and 
<code>HOMEPATH</code>,
+for example to &lsquo;<tt>\joe</tt>&rsquo;.  On Windows 95, you&rsquo;ll
+probably need to set <code>HOMEDRIVE</code> and <code>HOMEPATH</code> yourself.
+</p>
+<div id="IDX304"></div>
+</dd>
+<dt> <code>$CVS_RSH</code></dt>
+<dd><p>Specifies the external program which <small>CVS</small> connects with,
+when <code>:ext:</code> access method is specified.
+see section [[#SEC28|Connecting with rsh]].
+</p>
+</dd>
+<dt> <code>$CVS_SERVER</code></dt>
+<dd><p>Used in client-server mode when accessing a remote
+repository using <small>RSH</small>.  It specifies the name of
+the program to start on the server side (and any
+necessary arguments) when accessing a remote repository
+using the <code>:ext:</code>, <code>:fork:</code>, or <code>:server:</code> 
access methods.
+The default value for <code>:ext:</code> and <code>:server:</code> is 
<code>cvs</code>;
+the default value for <code>:fork:</code> is the name used to run the client.
+see section [[#SEC28|Connecting with rsh]]
+</p>
+</dd>
+<dt> <code>$CVS_PASSFILE</code></dt>
+<dd><p>Used in client-server mode when accessing the <code>cvs
+login server</code>.  Default value is &lsquo;<tt>$HOME/.cvspass</tt>&rsquo;.
+see section [[#SEC31|Using the client with password authentication]]
+</p>
+</dd>
+<dt> <code>$CVS_CLIENT_PORT</code></dt>
+<dd><p>Used in client-server mode to set the port to use when accessing the 
server
+via Kerberos, GSSAPI, or <small>CVS</small>&rsquo;s password authentication 
protocol
+if the port is not specified in the CVSROOT.
+see section [[#SEC26|Remote repositories]]
+</p>
+<div id="IDX305"></div>
+</dd>
+<dt> <code>$CVS_RCMD_PORT</code></dt>
+<dd><p>Used in client-server mode.  If set, specifies the port
+number to be used when accessing the <small>RCMD</small> demon on
+the server side. (Currently not used for Unix clients).
+</p>
+<div id="IDX306"></div>
+</dd>
+<dt> <code>$CVS_CLIENT_LOG</code></dt>
+<dd><p>Used for debugging only in client-server
+mode.  If set, everything sent to the server is logged
+into &lsquo;<tt><code>$CVS_CLIENT_LOG</code>.in</tt>&rsquo; and everything
+sent from the server is logged into
+&lsquo;<tt><code>$CVS_CLIENT_LOG</code>.out</tt>&rsquo;.
+</p>
+<div id="IDX307"></div>
+</dd>
+<dt> <code>$CVS_SERVER_SLEEP</code></dt>
+<dd><p>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.
+</p>
+<div id="IDX308"></div>
+</dd>
+<dt> <code>$CVS_IGNORE_REMOTE_ROOT</code></dt>
+<dd><p>For <small>CVS</small> 1.10 and older, setting this variable
+prevents <small>CVS</small> from overwriting the 
&lsquo;<tt>CVS/Root</tt>&rsquo;
+file when the &lsquo;<samp>-d</samp>&rsquo; global option is specified.
+Later versions of <small>CVS</small> do not rewrite
+&lsquo;<tt>CVS/Root</tt>&rsquo;, so <code>CVS_IGNORE_REMOTE_ROOT</code> has no
+effect.
+</p>
+<div id="IDX309"></div>
+</dd>
+<dt> <code>$CVS_LOCAL_BRANCH_NUM</code></dt>
+<dd><p>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
+<code>CVS_LOCAL_BRANCH_NUM</code> 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.
+</p>
+<div id="IDX310"></div>
+</dd>
+<dt> <code>$COMSPEC</code></dt>
+<dd><p>Used under OS/2 only.  It specifies the name of the
+command interpreter and defaults to <small>CMD.EXE</small>.
+</p>
+<div id="IDX311"></div>
+</dd>
+<dt> <code>$TMPDIR</code></dt>
+<dd><div id="IDX312"></div>
+</dd>
+<dt> <code>$TMP</code></dt>
+<dd><div id="IDX313"></div>
+</dd>
+<dt> <code>$TEMP</code></dt>
+<dd><div id="IDX314"></div>
+<p>Directory in which temporary files are located.
+The <small>CVS</small> server uses
+<code>TMPDIR</code>.  See section [[#SEC118|Global options]], for a
+description of how to specify this.
+Some parts of <small>CVS</small> will always use &lsquo;<tt>/tmp</tt>&rsquo; 
(via
+the <code>tmpnam</code> function provided by the system).
+</p>
+<p>On Windows NT, <code>TMP</code> is used (via the <code>_tempnam</code>
+function provided by the system).
+</p>
+<p>The <code>patch</code> program which is used by the <small>CVS</small>
+client uses <code>TMPDIR</code>, and if it is not set, uses
+&lsquo;<tt>/tmp</tt>&rsquo; (at least with GNU patch 2.1).  Note that
+if your server and client are both running <small>CVS</small>
+1.9.10 or later, <small>CVS</small> will not invoke an external
+<code>patch</code> program.
+</p>
+<div id="IDX315"></div>
+</dd>
+<dt> <code>$CVS_PID</code></dt>
+<dd><p>This is the process identification (aka pid) number of
+the <small>CVS</small> process. It is often useful in the
+programs and/or scripts specified by the
+&lsquo;<tt>commitinfo</tt>&rsquo;, &lsquo;<tt>verifymsg</tt>&rsquo;, 
&lsquo;<tt>loginfo</tt>&rsquo;
+files.
+</p></dd>
+</dl>
+
+<hr size="6">
+<div id="Compatibility"></div>
+<div id="SEC182"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC181| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC183| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC181| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC183| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== Compatibility between CVS Versions ==
+
+<p>The repository format is compatible going back to
+<small>CVS</small> 1.3.  But see [[#SEC94|Using watches with old versions of 
CVS]], if
+you have copies of <small>CVS</small> 1.6 or older and you want
+to use the optional developer communication features.
+</p>
+<p>The working directory format is compatible going back
+to <small>CVS</small> 1.5.  It did change between <small>CVS</small> 1.3
+and <small>CVS</small> 1.5.  If you run <small>CVS</small> 1.5 or newer on
+a working directory checked out with <small>CVS</small> 1.3,
+<small>CVS</small> will convert it, but to go back to <small>CVS</small>
+1.3 you need to check out a new working directory with
+<small>CVS</small> 1.3.
+</p>
+<p>The remote protocol is interoperable going back to <small>CVS</small> 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.
+</p>
+
+<hr size="6">
+<div id="Troubleshooting"></div>
+<div id="SEC183"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC182| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC184| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC182| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC187| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== Troubleshooting ==
+
+<p>If you are having trouble with <small>CVS</small>, 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.
+</p>
+<pre class="menu-preformatted"><nowiki></nowiki>&bull;[[#SEC184| Error 
messages]]::<nowiki>              Partial list of CVS errors
+</nowiki>&bull;[[#SEC185| Connection]]::<nowiki>                  Trouble 
making a connection to a CVS server
+</nowiki>&bull;[[#SEC186| Other problems]]::<nowiki>              Problems not 
readily listed by error message
+</nowiki></pre>
+
+<hr size="6">
+<div id="Error-messages"></div>
+<div id="SEC184"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC183| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC185| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC183| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC183| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC187| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Partial list of error messages ===
+
+<p>Here is a partial list of error messages that you may
+see from <small>CVS</small>.  It is not a complete 
list&mdash;<small>CVS</small>
+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.
+</p>
+<p>The messages are alphabetical, but introductory text
+such as &lsquo;<samp>cvs update: </samp>&rsquo; is not considered in
+ordering them.
+</p>
+<p>In some cases the list includes messages printed by old
+versions of <small>CVS</small> (partly because users may not be
+sure which version of <small>CVS</small> they are using at any
+particular moment).
+</p>
+<dl compact="compact">
+<dt> <code><var>file</var>:<var>line</var>: Assertion '<var>text</var>' 
failed</code></dt>
+<dd><p>The exact format of this message may vary depending on
+your system.  It indicates a bug in <small>CVS</small>, which can
+be handled as described in [[#SEC188|Dealing with bugs in CVS or this manual]].
+</p>
+</dd>
+<dt> <code>cvs <var>command</var>: authorization failed: server 
<var>host</var> rejected access</code></dt>
+<dd><p>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 <code>CVSROOT</code> specified is allowed by 
&lsquo;<samp>--allow-root</samp>&rsquo;
+in &lsquo;<tt>inetd.conf</tt>&rsquo;.  See [[#SEC29|Direct connection with 
password authentication]].
+</p>
+</dd>
+<dt> <code>cvs <var>command</var>: conflict: removed <var>file</var> was 
modified by second party</code></dt>
+<dd><p>This message indicates that you removed a file, and
+someone else modified it.  To resolve the conflict,
+first run &lsquo;<samp>cvs add <var>file</var></samp>&rsquo;.  If desired, look
+at the other party&rsquo;s modification to decide whether you
+still want to remove it.  If you don&rsquo;t want to remove
+it, stop here.  If you do want to remove it, proceed
+with &lsquo;<samp>cvs remove <var>file</var></samp>&rsquo; and commit your
+removal.
+</p>
+</dd>
+<dt> <code>cannot change permissions on temporary directory</code></dt>
+<dd><table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>Operation not 
permitted
+</nowiki></pre></td></tr></table>
+<p>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&rsquo;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, &lsquo;<samp>Operation not permitted</samp>&rsquo; would be
+likely to read &lsquo;<samp>Not owner</samp>&rsquo; or whatever the system
+in question uses for the unix <code>EPERM</code> error.  If
+you have any information to add, please let us know as
+described in [[#SEC188|Dealing with bugs in CVS or this manual]].  If you 
experience this error
+while using <small>CVS</small>, retrying the operation which
+produced it should work fine.
+</p>
+</dd>
+<dt> <code>cvs [server aborted]: Cannot check out files into the repository 
itself</code></dt>
+<dd><p>The obvious cause for this message (especially for
+non-client/server <small>CVS</small>) is that the <small>CVS</small> root
+is, for example, &lsquo;<tt>/usr/local/cvsroot</tt>&rsquo; and you try
+to check out files when you are in a subdirectory, such
+as &lsquo;<tt>/usr/local/cvsroot/test</tt>&rsquo;.  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 &lsquo;<tt>/var/tmp</tt>&rsquo;; see <code>TMPDIR</code> in
+[[#SEC181|All environment variables which affect CVS]], for how to set the
+temporary directory.
+</p>
+</dd>
+<dt> <code>cannot commit files as 'root'</code></dt>
+<dd><p>See &lsquo;<samp>'root' is not allowed to commit files</samp>&rsquo;.
+</p>
+</dd>
+<dt> <code>cannot open CVS/Entries for reading: No such file or 
directory</code></dt>
+<dd><p>This generally indicates a <small>CVS</small> internal error, and
+can be handled as with other <small>CVS</small> bugs
+(see section [[#SEC188|Dealing with bugs in CVS or this manual]]).  Usually 
there is a workaround&mdash;the
+exact nature of which would depend on the situation but
+which hopefully could be figured out.
+</p>
+</dd>
+<dt> <code>cvs [init aborted]: cannot open CVS/Root: No such file or 
directory</code></dt>
+<dd><p>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 <small>CVS</small>, but it is documented
+here for the benefit of <small>CVS</small> 1.9 and older.
+</p>
+</dd>
+<dt> <code>cvs server: cannot open /root/.cvsignore: Permission 
denied</code></dt>
+<dt> <code>cvs [server aborted]: can't chdir(/root): Permission 
denied</code></dt>
+<dd><p>See [[#SEC185|Trouble making a connection to a CVS server]].
+</p>
+</dd>
+<dt> <code>cvs [checkout aborted]: cannot rename file <var>file</var> to 
CVS/,,<var>file</var>: Invalid argument</code></dt>
+<dd><p>This message has been reported as intermittently
+happening with <small>CVS</small> 1.9 on Solaris 2.5.  The cause is
+unknown; if you know more about what causes it, let us
+know as described in [[#SEC188|Dealing with bugs in CVS or this manual]].
+</p>
+</dd>
+<dt> <code>cvs [<var>command</var> aborted]: cannot start server via 
rcmd</code></dt>
+<dd><p>This, unfortunately, is a rather nonspecific error
+message which <small>CVS</small> 1.9 will print if you are
+running the <small>CVS</small> client and it is having trouble
+connecting to the server.  Current versions of <small>CVS</small>
+should print a much more specific error message.  If
+you get this message when you didn&rsquo;t mean to run the
+client at all, you probably forgot to specify
+<code>:local:</code>, as described in [[#SEC9|The Repository]].
+</p>
+</dd>
+<dt> <code>ci: <var>file</var>,v: bad diff output line: Binary files - and 
/tmp/T2a22651 differ</code></dt>
+<dd><p><small>CVS</small> 1.9 and older will print this message
+when trying to check in a binary file if
+<small>RCS</small> is not correctly installed.  Re-read the
+instructions that came with your <small>RCS</small> distribution
+and the <small>INSTALL</small> file in the <small>CVS</small>
+distribution.  Alternately, upgrade to a current
+version of <small>CVS</small>, which checks in files itself
+rather than via <small>RCS</small>.
+</p>
+</dd>
+<dt> <code>cvs checkout: could not check out <var>file</var></code></dt>
+<dd><p>With <small>CVS</small> 1.9, this can mean that the <code>co</code> 
program
+(part of <small>RCS</small>) 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 <small>CVS</small>,
+which does not run <code>co</code>, if this message occurs
+without another error message, it is definitely a <small>CVS</small>
+bug (see section [[#SEC188|Dealing with bugs in CVS or this manual]]).
+</p>
+</dd>
+<dt> <code>cvs [login aborted]: could not find out home directory</code></dt>
+<dd><p>This means that you need to set the environment
+variables that <small>CVS</small> uses to locate your home directory.
+See the discussion of <code>HOME</code>, <code>HOMEDRIVE</code>, and 
<code>HOMEPATH</code> in
+[[#SEC181|All environment variables which affect CVS]].
+</p>
+</dd>
+<dt> <code>cvs update: could not merge revision <var>rev</var> of 
<var>file</var>: No such file or directory</code></dt>
+<dd><p><small>CVS</small> 1.9 and older will print this message if there was
+a problem finding the <code>rcsmerge</code> program.  Make
+sure that it is in your <code>PATH</code>, or upgrade to a
+current version of <small>CVS</small>, which does not require
+an external <code>rcsmerge</code> program.
+</p>
+</dd>
+<dt> <code>cvs [update aborted]: could not patch <var>file</var>: No such file 
or directory</code></dt>
+<dd><p>This means that there was a problem finding the
+<code>patch</code> program.  Make sure that it is in your
+<code>PATH</code>.  Note that despite appearances the message
+is <em>not</em> referring to whether it can find <var>file</var>.
+If both the client and the server are running a current
+version of <small>CVS</small>, 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
+<small>CVS</small> 1.9, then you need <code>patch</code>.
+</p>
+</dd>
+<dt> <code>cvs update: could not patch <var>file</var>; will 
refetch</code></dt>
+<dd><p>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 <small>CVS</small> does.
+</p>
+</dd>
+<dt> <code>dying gasps from <var>server</var> unexpected</code></dt>
+<dd><p>There is a known bug in the server for <small>CVS</small> 1.9.18
+and older which can cause this.  For me, this was
+reproducible if I used the &lsquo;<samp>-t</samp>&rsquo; global option.  It
+was fixed by Andy Piper&rsquo;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 [[#SEC188|Dealing with bugs in CVS 
or this manual]].
+</p>
+</dd>
+<dt> <code>end of file from server (consult above messages if any)</code></dt>
+<dd><p>The most common cause for this message is if you are
+using an external <code>rsh</code> program and it exited with
+an error.  In this case the <code>rsh</code> program should
+have printed a message, which will appear before the
+above message.  For more information on setting up a
+<small>CVS</small> client and server, see [[#SEC26|Remote repositories]].
+</p>
+</dd>
+<dt> <code>cvs [update aborted]: EOF in key in RCS file 
<var>file</var>,v</code></dt>
+<dt> <code>cvs [checkout aborted]: EOF while looking for end of string in RCS 
file <var>file</var>,v</code></dt>
+<dd><p>This means that there is a syntax error in the given
+<small>RCS</small> file.  Note that this might be true even if 
<small>RCS</small> can
+read the file OK; <small>CVS</small> does more error checking of
+errors in the RCS file.  That is why you may see this
+message when upgrading from <small>CVS</small> 1.9 to <small>CVS</small>
+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 <small>CVS</small> seems to
+corrupting the file, by all means report it,
+(see section [[#SEC188|Dealing with bugs in CVS or this manual]]).
+There are quite a few variations of this error message,
+depending on exactly where in the <small>RCS</small> file <small>CVS</small>
+finds the syntax error.
+</p>
+<div id="IDX316"></div>
+</dd>
+<dt> <code>cvs commit: Executing 'mkmodules'</code></dt>
+<dd><p>This means that your repository is set up for a version
+of <small>CVS</small> prior to <small>CVS</small> 1.8.  When using 
<small>CVS</small>
+1.8 or later, the above message will be preceded by
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs commit: 
Rebuilding administrative file database
+</nowiki></pre></td></tr></table>
+
+<p>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
+<small>CVS</small> 1.7 or earlier in use, remove <code>-i mkmodules</code>
+every place it appears in your <code>modules</code>
+file.  For more information on the <code>modules</code> file,
+see [[#SEC158|The modules file]].
+</p>
+</dd>
+<dt> <code>missing author</code></dt>
+<dd><p>Typically this can happen if you created an RCS file
+with your username set to empty.  <small>CVS</small> 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.
+</p>
+</dd>
+<dt> <code>cvs [checkout aborted]: no such tag <var>tag</var></code></dt>
+<dd><p>This message means that <small>CVS</small> isn&rsquo;t familiar with
+the tag <var>tag</var>.  Usually this means that you have
+mistyped a tag name; however there are (relatively
+obscure) cases in which <small>CVS</small> will require you to
+try a few other <small>CVS</small> commands involving that tag,
+before you find one which will cause <small>CVS</small> to update
+the &lsquo;<tt>val-tags</tt>&rsquo; file; see discussion of val-tags in
+[[#SEC13|File permissions]].  You only need to worry about
+this once for a given tag; when a tag is listed in
+&lsquo;<tt>val-tags</tt>&rsquo;, it stays there.  Note that using
+&lsquo;<samp>-f</samp>&rsquo; to not require tag matches does not override
+this check; see [[#SEC119|Common command options]].
+</p>
+</dd>
+<dt> <code>*PANIC* administration files missing</code></dt>
+<dd><p>This typically means that there is a directory named
+<small>CVS</small> but it does not contain the administrative files
+which <small>CVS</small> puts in a CVS directory.  If the problem is
+that you created a CVS directory via some mechanism
+other than <small>CVS</small>, then the answer is simple, use a name
+other than <small>CVS</small>.  If not, it indicates a <small>CVS</small> bug
+(see section [[#SEC188|Dealing with bugs in CVS or this manual]]).
+</p>
+</dd>
+<dt> <code>rcs error: Unknown option: -x,v/</code></dt>
+<dd><p>This message will be followed by a usage message for
+<small>RCS</small>.  It means that you have an old version of
+<small>RCS</small> (probably supplied with your operating
+system), as well as an old version of <small>CVS</small>.
+<small>CVS</small> 1.9.18 and earlier only work with <small>RCS</small> 
version 5 and
+later; current versions of <small>CVS</small> do not run <small>RCS</small> 
programs.
+</p>
+</dd>
+<dt> <code>cvs [server aborted]: received broken pipe signal</code></dt>
+<dd><p>This message seems to be caused by a hard-to-track-down
+bug in <small>CVS</small> or the systems it runs on (we don&rsquo;t
+know&mdash;we haven&rsquo;t tracked it down yet!).  It seems to
+happen only after a <small>CVS</small> 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 [[#SEC188|Dealing with bugs in CVS 
or this manual]].
+</p>
+</dd>
+<dt> <code>'root' is not allowed to commit files</code></dt>
+<dd><p>When committing a permanent change, <small>CVS</small> makes a log 
entry of
+who committed the change.  If you are committing the change logged
+in as &quot;root&quot; (not under &quot;su&quot; or other root-priv giving 
program),
+<small>CVS</small> cannot determine who is actually making the change.
+As such, by default, <small>CVS</small> disallows changes to be committed by 
users
+logged in as &quot;root&quot;.  (You can disable this option by passing the
+<code>--enable-rootcommit</code> option to &lsquo;<tt>configure</tt>&rsquo; 
and recompiling <small>CVS</small>.
+On some systems this means editing the appropriate 
&lsquo;<tt>config.h</tt>&rsquo; file
+before building <small>CVS</small>.)
+</p>
+</dd>
+<dt> <code>Too many arguments!</code></dt>
+<dd><p>This message is typically printed by the &lsquo;<tt>log.pl</tt>&rsquo;
+script which is in the &lsquo;<tt>contrib</tt>&rsquo; directory in the
+<small>CVS</small> source distribution.  In some versions of
+<small>CVS</small>, &lsquo;<tt>log.pl</tt>&rsquo; has been part of the default
+<small>CVS</small> installation.  The &lsquo;<tt>log.pl</tt>&rsquo; script gets
+called from the &lsquo;<tt>loginfo</tt>&rsquo; administrative file.
+Check that the arguments passed in &lsquo;<tt>loginfo</tt>&rsquo; match
+what your version of &lsquo;<tt>log.pl</tt>&rsquo; expects.  In
+particular, the &lsquo;<tt>log.pl</tt>&rsquo; from <small>CVS</small> 1.3 and
+older expects the logfile as an argument whereas the
+&lsquo;<tt>log.pl</tt>&rsquo; from <small>CVS</small> 1.5 and newer expects the
+logfile to be specified with a &lsquo;<samp>-f</samp>&rsquo; option.  Of
+course, if you don&rsquo;t need &lsquo;<tt>log.pl</tt>&rsquo; you can just
+comment it out of &lsquo;<tt>loginfo</tt>&rsquo;.
+</p>
+</dd>
+<dt> <code>cvs [update aborted]: unexpected EOF reading 
<var>file</var>,v</code></dt>
+<dd><p>See &lsquo;<samp>EOF in key in RCS file</samp>&rsquo;.
+</p>
+</dd>
+<dt> <code>cvs [login aborted]: unrecognized auth response from 
<var>server</var></code></dt>
+<dd><p>This message typically means that the server is not set
+up properly.  For example, if &lsquo;<tt>inetd.conf</tt>&rsquo; points
+to a nonexistent cvs executable.  To debug it further,
+find the log file which inetd writes
+(&lsquo;<tt>/var/log/messages</tt>&rsquo; or whatever inetd uses on
+your system).  For details, see [[#SEC185|Trouble making a connection to a CVS 
server]], and
+[[#SEC30|Setting up the server for password authentication]].
+</p>
+</dd>
+<dt> <code>cvs commit: Up-to-date check failed for 
`<var>file</var>'</code></dt>
+<dd><p>This means that someone else has committed a change to
+that file since the last time that you did a <code>cvs
+update</code>.  So before proceeding with your <code>cvs
+commit</code> you need to <code>cvs update</code>.  <small>CVS</small> 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 &lsquo;<samp>M <var>file</var></samp>&rsquo; and you are ready
+to <code>cvs commit</code>.  If it detects conflicts it will
+print a message saying so, will report &lsquo;<samp>C 
<var>file</var></samp>&rsquo;,
+and you need to manually resolve the
+conflict.  For more details on this process see
+[[#SEC86|Conflicts example]].
+</p>
+</dd>
+<dt> <code>Usage:      diff3 [-exEX3 [-i | -m] [-L label1 -L label3]] file1 
file2 file3</code></dt>
+<dd><table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>Only one of 
[exEX3] allowed
+</nowiki></pre></td></tr></table>
+<p>This indicates a problem with the installation of
+<code>diff3</code> and <code>rcsmerge</code>.  Specifically
+<code>rcsmerge</code> 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
+<small>CVS</small>, which does not rely on external
+<code>rcsmerge</code> or <code>diff3</code> programs.
+</p>
+</dd>
+<dt> <code>warning: unrecognized response `<var>text</var>' from cvs 
server</code></dt>
+<dd><p>If <var>text</var> contains a valid response (such as
+&lsquo;<samp>ok</samp>&rsquo;) 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 &lsquo;<samp>:ext:</samp>&rsquo;
+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 &lsquo;<samp>:server:</samp>&rsquo; instead of
+&lsquo;<samp>:ext:</samp>&rsquo;.  If <var>text</var> is something else, this
+may signify a problem with your <small>CVS</small> server.
+Double-check your installation against the instructions
+for setting up the <small>CVS</small> server.
+</p>
+</dd>
+<dt> <code>cvs commit: [<var>time</var>] waiting for <var>user</var>'s lock in 
<var>directory</var></code></dt>
+<dd><p>This is a normal message, not an error.  See
+[[#SEC88|Several developers simultaneously attempting to run CVS]], for more 
details.
+</p>
+</dd>
+<dt> <code>cvs commit: warning: editor session failed</code></dt>
+<dd><div id="IDX317"></div>
+<p>This means that the editor which <small>CVS</small> 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
+<code>CVSEDITOR</code> environment variable to a small script
+such as:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>#!/bin/sh
+vi $*
+exit 0
+</nowiki></pre></td></tr></table>
+
+</dd>
+</dl>
+
+<hr size="6">
+<div id="Connection"></div>
+<div id="SEC185"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC184| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC186| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC183| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC183| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC187| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Trouble making a connection to a CVS server ===
+
+<p>This section concerns what to do if you are having
+trouble making a connection to a <small>CVS</small> server.  If
+you are running the <small>CVS</small> command line client
+running on Windows, first upgrade the client to
+<small>CVS</small> 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,
+<small>CVS</small> 1.9 should be fine.
+</p>
+<p>If the error messages are not sufficient to track down
+the problem, the next steps depend largely on which
+access method you are using.
+</p>
+<dl compact="compact">
+<dd><div id="IDX318"></div>
+</dd>
+<dt> <code>:ext:</code></dt>
+<dd><p>Try running the rsh program from the command line.  For
+example: &quot;rsh servername cvs -v&quot; should print <small>CVS</small>
+version information.  If this doesn&rsquo;t work, you need to
+fix it before you can worry about <small>CVS</small> problems.
+</p>
+<div id="IDX319"></div>
+</dd>
+<dt> <code>:server:</code></dt>
+<dd><p>You don&rsquo;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:.
+</p>
+<div id="IDX320"></div>
+</dd>
+<dt> <code>:pserver:</code></dt>
+<dd><p>Errors along the lines of &quot;connection refused&quot; typically 
indicate
+that inetd isn&rsquo;t even listening for connections on port 2401
+whereas errors like &quot;connection reset by peer&quot;,
+&quot;received broken pipe signal&quot;, &quot;recv() from server: EOF&quot;,
+or &quot;end of file from server&quot;
+typically indicate that inetd is listening for
+connections but is unable to start <small>CVS</small> (this is frequently
+caused by having an incorrect path in &lsquo;<tt>inetd.conf</tt>&rsquo;
+or by firewall software rejecting the connection).
+&quot;unrecognized auth response&quot; errors are caused by a bad command
+line in &lsquo;<tt>inetd.conf</tt>&rsquo;, typically an invalid option or 
forgetting
+to put the &lsquo;<samp>pserver</samp>&rsquo; command at the end of the line.
+Another less common problem is invisible control characters that
+your editor &quot;helpfully&quot; added without you noticing.
+</p>
+<p>One good debugging tool is to &quot;telnet servername
+2401&quot;.  After connecting, send any text (for example
+&quot;foo&quot; followed by return).  If <small>CVS</small> is working
+correctly, it will respond with
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs [pserver 
aborted]: bad auth protocol start: foo
+</nowiki></pre></td></tr></table>
+
+<p>If instead you get:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>Usage: cvs 
[cvs-options] command [command-options-and-arguments]
+...
+</nowiki></pre></td></tr></table>
+
+<p>then you&rsquo;re missing the &lsquo;<samp>pserver</samp>&rsquo; command at 
the end of the
+line in &lsquo;<tt>inetd.conf</tt>&rsquo;; check to make sure that the entire 
command
+is on one line and that it&rsquo;s complete.
+</p>
+<p>Likewise, if you get something like:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>Unknown command: 
`pserved'
+
+CVS commands are:
+        add          Add a new file/directory to the repository
+...
+</nowiki></pre></td></tr></table>
+
+<p>then you&rsquo;ve misspelled &lsquo;<samp>pserver</samp>&rsquo; in some 
way.  If it isn&rsquo;t
+obvious, check for invisible control characters (particularly
+carriage returns) in &lsquo;<tt>inetd.conf</tt>&rsquo;.
+</p>
+<p>If it fails to work at all, then make sure inetd is working
+right.  Change the invocation in &lsquo;<tt>inetd.conf</tt>&rsquo; to run the
+echo program instead of cvs.  For example:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>2401  stream  tcp  
nowait  root /bin/echo echo hello
+</nowiki></pre></td></tr></table>
+
+<p>After making that change and instructing inetd to
+re-read its configuration file, &quot;telnet servername
+2401&quot; should show you the text hello and then the
+server should close the connection.  If this doesn&rsquo;t
+work, you need to fix it before you can worry about
+<small>CVS</small> problems.
+</p>
+<p>On AIX systems, the system will often have its own
+program trying to use port 2401.  This is AIX&rsquo;s problem
+in the sense that port 2401 is registered for use with
+<small>CVS</small>.  I hear that there is an AIX patch available
+to address this problem.
+</p>
+<p>Another good debugging tool is the &lsquo;<samp>-d</samp>&rsquo;
+(debugging) option to inetd.  Consult your system
+documentation for more information.
+</p>
+<p>If you seem to be connecting but get errors like:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>cvs server: cannot 
open /root/.cvsignore: Permission denied
+cvs [server aborted]: can't chdir(/root): Permission denied
+</nowiki></pre></td></tr></table>
+
+<p>then you probably haven&rsquo;t specified &lsquo;<samp>-f</samp>&rsquo; in 
&lsquo;<tt>inetd.conf</tt>&rsquo;.
+(In releases prior to <small>CVS</small> 1.11.1, this problem can be caused by
+your system setting the <code>$HOME</code> environment variable
+for programs being run by inetd.  In this case, you can either
+have inetd run a shell script that unsets <code>$HOME</code> and then runs
+<small>CVS</small>, or you can use <code>env</code> to run <small>CVS</small> 
with a pristine
+environment.)
+</p>
+<p>If you can connect successfully for a while but then can&rsquo;t,
+you&rsquo;ve probably hit inetd&rsquo;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.)
+</p></dd>
+</dl>
+
+<hr size="6">
+<div id="Other-problems"></div>
+<div id="SEC186"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC185| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC187| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC183| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC183| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC187| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+=== Other common problems ===
+
+<p>Here is a list of problems which do not fit into the
+above categories.  They are in no particular order.
+</p>
+<ul>
+<li>
+On Windows, if there is a 30 second or so delay when
+you run a <small>CVS</small> command, it may mean that you have
+your home directory set to &lsquo;<tt>C:/</tt>&rsquo;, for example (see
+<code>HOMEDRIVE</code> and <code>HOMEPATH</code> in
+[[#SEC181|All environment variables which affect CVS]]).  <small>CVS</small> 
expects the home
+directory to not end in a slash, for example &lsquo;<tt>C:</tt>&rsquo;
+or &lsquo;<tt>C:\cvs</tt>&rsquo;.
+
+</li><li>
+If you are running <small>CVS</small> 1.9.18 or older, and
+<code>cvs update</code> finds a conflict and tries to
+merge, as described in [[#SEC86|Conflicts example]], but
+doesn&rsquo;t tell you there were conflicts, then you may
+have an old version of <small>RCS</small>.  The easiest solution
+probably is to upgrade to a current version of
+<small>CVS</small>, which does not rely on external <small>RCS</small>
+programs.
+</li></ul>
+
+<hr size="6">
+<div id="Credits"></div>
+<div id="SEC187"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC186| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC188| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC183| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC188| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== Credits ==
+
+<p>Roland Pesch, then of Cygnus Support &lt;<tt>address@hidden</tt>&gt;
+wrote the manual pages which were distributed with
+<small>CVS</small> 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.
+</p>
+<p>The mailing-list <code>info-cvs</code> is sometimes
+informative. I have included information from postings
+made by the following persons:
+David G. Grubbs &lt;<tt>address@hidden</tt>&gt;.
+</p>
+<p>Some text has been extracted from the man pages for
+<small>RCS</small>.
+</p>
+<p>The <small>CVS</small> <small>FAQ</small> by David G. Grubbs has provided
+useful material.  The <small>FAQ</small> 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 <small>CVS</small>, at least).
+</p>
+<p>In addition, the following persons have helped by
+telling me about mistakes I&rsquo;ve made:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="display"><nowiki>Roxanne Brunskill 
&lt;<tt>address@hidden</tt>&gt;,
+Kathy Dyer &lt;<tt>address@hidden</tt>&gt;,
+Karl Pingle &lt;<tt>address@hidden</tt>&gt;,
+Thomas A Peterson &lt;<tt>address@hidden</tt>&gt;,
+Inge Wallin &lt;<tt>address@hidden</tt>&gt;,
+Dirk Koschuetzki &lt;<tt>address@hidden</tt>&gt;
+and Michael Brown &lt;<tt>address@hidden</tt>&gt;.
+</nowiki></pre></td></tr></table>
+
+<p>The list of contributors here is not comprehensive; for a more
+complete list of who has contributed to this manual see
+the file &lsquo;<tt>doc/ChangeLog</tt>&rsquo; in the <small>CVS</small> source
+distribution.
+</p>
+<hr size="6">
+<div id="BUGS"></div>
+<div id="SEC188"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC187| &lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC189| &gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC187| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">|[[#SEC189| &gt;&gt; ]]|</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== Dealing with bugs in CVS or this manual ==
+
+<p>Neither <small>CVS</small> nor this manual is perfect, and they
+probably never will be.  If you are having trouble
+using <small>CVS</small>, 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 <small>CVS</small> itself.
+</p>
+<div id="IDX321"></div>
+<div id="IDX322"></div>
+<div id="IDX323"></div>
+<ul>
+<li>
+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:
+
+<div id="IDX324"></div>
+<div id="IDX325"></div>
+<table><tr><td>&nbsp;</td><td><pre class="example"><nowiki>Ximbiot
+319 S. River St.
+Harrisburg, PA  17104-1657
+USA
+Email: address@hidden
+Phone: (717) 579-6168
+Fax:   (717) 234-3125
+http://ximbiot.com/
+
+</nowiki></pre></td></tr></table>
+
+</li><li>
+If you got <small>CVS</small> through a distributor, such as an
+operating system vendor or a vendor of freeware
+<small>CD-ROM</small>s, 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.
+
+</li><li>
+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 <small>CVS</small>, see
+the file <small>HACKING</small> in the <small>CVS</small> source
+distribution.  It contains much more information on the
+process of submitting fixes.
+
+</li><li>
+There may be resources on the net which can help.  Two
+good places to start are:
+
+<table><tr><td>&nbsp;</td><td><pre 
class="example"><nowiki>http://www.cvshome.org
+http://www.loria.fr/~molli/cvs-index.html
+</nowiki></pre></td></tr></table>
+
+<p>If you are so inspired, increasing the information
+available on the net is likely to be appreciated.  For
+example, before the standard <small>CVS</small> distribution
+worked on Windows 95, there was a web page with some
+explanation and patches for running <small>CVS</small> on Windows
+95, and various people helped out by mentioning this
+page on mailing lists or newsgroups when the subject
+came up.
+</p>
+</li><li>
+It is also possible to report bugs to <code>bug-cvs</code>.
+Note that someone may or may not want to do anything
+with your bug report&mdash;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 <code>address@hidden</code>.  Note
+that submissions to <code>bug-cvs</code> may be distributed
+under the terms of the <small>GNU</small> Public License, so if
+you don&rsquo;t like this, don&rsquo;t submit them.  There is
+usually no justification for sending mail directly to
+one of the <small>CVS</small> maintainers rather than to
+<code>bug-cvs</code>; those maintainers who want to hear
+about such bug reports read <code>bug-cvs</code>.  Also note
+that sending a bug report to other mailing lists or
+newsgroups is <em>not</em> a substitute for sending it to
+<code>bug-cvs</code>.  It is fine to discuss <small>CVS</small> bugs on
+whatever forum you prefer, but there are not
+necessarily any maintainers reading bug reports sent
+anywhere except <code>bug-cvs</code>.
+</li></ul>
+
+<div id="IDX326"></div>
+<p>People often ask if there is a list of known bugs or
+whether a particular bug is a known one.  The file
+<small>BUGS</small> in the <small>CVS</small> source distribution is one
+list of known bugs, but it doesn&rsquo;t necessarily try to
+be comprehensive.  Perhaps there will never be a
+comprehensive, detailed list of known bugs.
+</p>
+<hr size="6">
+<div id="Index"></div>
+<div id="SEC189"></div>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">|[[#SEC188| &lt; ]]|</td>
+<td valign="middle" align="left">[ &gt; ]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC188| &lt;&lt; ]]|</td>
+<td valign="middle" align="left">|[[#SEC_Top| Up ]]|</td>
+<td valign="middle" align="left">[ &gt;&gt; ]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">|[[#SEC_Top|Top]]|</td>
+<td valign="middle" align="left">|[[#SEC_Contents|Contents]]|</td>
+<td valign="middle" align="left">|[[#SEC189|Index]]|</td>
+<td valign="middle" align="left">|[[#SEC_About| ? ]]|</td>
+</tr></table>
+== Index ==
+
+<table cellpadding="1" cellspacing="1" border="0"><tr><th valign="top">Jump 
to:</th>
+<td>[[#SEC189_0|<b>!</b>]]</td>
+<td>[[#SEC189_1|<b>#</b>]]</td>
+<td>[[#SEC189_2|<b>&amp;</b>]]</td>
+<td>[[#SEC189_3|<b>-</b>]]</td>
+<td>[[#SEC189_4|<b>.</b>]]</td>
+<td>[[#SEC189_5|<b>/</b>]]</td>
+<td>[[#SEC189_6|<b>:</b>]]</td>
+<td>[[#SEC189_7|<b>&lt;</b>]]</td>
+<td>[[#SEC189_8|<b>=</b>]]</td>
+<td>[[#SEC189_9|<b>&gt;</b>]]</td>
+<td>[[#SEC189_10|<b>_</b>]]</td>
+<td>[[#SEC189_11|<b>A</b>]]</td>
+<td>[[#SEC189_12|<b>B</b>]]</td>
+<td>[[#SEC189_13|<b>C</b>]]</td>
+<td>[[#SEC189_14|<b>D</b>]]</td>
+<td>[[#SEC189_15|<b>E</b>]]</td>
+<td>[[#SEC189_16|<b>F</b>]]</td>
+<td>[[#SEC189_17|<b>G</b>]]</td>
+<td>[[#SEC189_18|<b>H</b>]]</td>
+<td>[[#SEC189_19|<b>I</b>]]</td>
+<td>[[#SEC189_20|<b>J</b>]]</td>
+<td>[[#SEC189_21|<b>K</b>]]</td>
+<td>[[#SEC189_22|<b>L</b>]]</td>
+<td>[[#SEC189_23|<b>M</b>]]</td>
+<td>[[#SEC189_24|<b>N</b>]]</td>
+<td>[[#SEC189_25|<b>O</b>]]</td>
+<td>[[#SEC189_26|<b>P</b>]]</td>
+<td>[[#SEC189_27|<b>R</b>]]</td>
+<td>[[#SEC189_28|<b>S</b>]]</td>
+<td>[[#SEC189_29|<b>T</b>]]</td>
+<td>[[#SEC189_30|<b>U</b>]]</td>
+<td>[[#SEC189_31|<b>V</b>]]</td>
+<td>[[#SEC189_32|<b>W</b>]]</td>
+<td>[[#SEC189_33|<b>X</b>]]</td>
+<td>[[#SEC189_34|<b>Z</b>]]</td>
+<table border="0" class="index-cp">
+<tr><td></td><th align="left">Index Entry</th><th align="left"> 
Section</th></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><div id="SEC189_0"></div>!</th><td></td><td></td></tr>
+<tr><td></td><td valign="top">[[#SEC162|!, in modules file]]</td><td 
valign="top">[[#SEC162|Excluding directories]]</td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><div id="SEC189_1"></div>#</th><td></td><td></td></tr>
+<tr><td></td><td valign="top">[[#IDX159|#cvs.lock, removing]]</td><td 
valign="top">[[#SEC88|Several developers simultaneously attempting to run 
CVS]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC17|#cvs.lock, technical details]]</td><td 
valign="top">[[#SEC17|CVS locks in the repository]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX63|#cvs.rfl, and backups]]</td><td 
valign="top">[[#SEC24|Backing up a repository]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX157|#cvs.rfl, removing]]</td><td 
valign="top">[[#SEC88|Several developers simultaneously attempting to run 
CVS]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC17|#cvs.rfl, technical details]]</td><td 
valign="top">[[#SEC17|CVS locks in the repository]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX29|#cvs.tfl]]</td><td 
valign="top">[[#SEC17|CVS locks in the repository]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX158|#cvs.wfl, removing]]</td><td 
valign="top">[[#SEC88|Several developers simultaneously attempting to run 
CVS]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC17|#cvs.wfl, technical details]]</td><td 
valign="top">[[#SEC17|CVS locks in the repository]]</td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><div id="SEC189_2"></div>&amp;</th><td></td><td></td></tr>
+<tr><td></td><td valign="top">[[#SEC161|&amp;, in modules file]]</td><td 
valign="top">[[#SEC161|Ampersand modules]]</td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><div id="SEC189_3"></div>-</th><td></td><td></td></tr>
+<tr><td></td><td valign="top">[[#SEC159|-a, in modules file]]</td><td 
valign="top">[[#SEC159|Alias modules]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX251|-d, in modules file]]</td><td 
valign="top">[[#SEC163|Module options]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX253|-e, in modules file]]</td><td 
valign="top">[[#SEC163|Module options]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC164|-e, in modules file]]</td><td 
valign="top">[[#SEC164|How the modules file &ldquo;program options&rdquo; 
programs are run]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC60|-j (merging branches)]]</td><td 
valign="top">[[#SEC60|Merging an entire branch]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC64|-j (merging branches), and keyword 
substitution]]</td><td valign="top">[[#SEC64|Merging and keywords]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC102|-k (keyword substitution)]]</td><td 
valign="top">[[#SEC102|Substitution modes]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC64|-kk, to avoid conflicts during a 
merge]]</td><td valign="top">[[#SEC64|Merging and keywords]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX255|-o, in modules file]]</td><td 
valign="top">[[#SEC163|Module options]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC164|-o, in modules file]]</td><td 
valign="top">[[#SEC164|How the modules file &ldquo;program options&rdquo; 
programs are run]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX258|-s, in modules file]]</td><td 
valign="top">[[#SEC163|Module options]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX260|-t, in modules file]]</td><td 
valign="top">[[#SEC163|Module options]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC164|-t, in modules file]]</td><td 
valign="top">[[#SEC164|How the modules file &ldquo;program options&rdquo; 
programs are run]]</td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><div id="SEC189_4"></div>.</th><td></td><td></td></tr>
+<tr><td></td><td valign="top">[[#IDX246|.# files]]</td><td 
valign="top">[[#SEC155|update output]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX16|.bashrc, setting CVSROOT in]]</td><td 
valign="top">[[#SEC10|Telling CVS where your repository is]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX14|.cshrc, setting CVSROOT in]]</td><td 
valign="top">[[#SEC10|Telling CVS where your repository is]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC117|.cvsrc file]]</td><td 
valign="top">[[#SEC117|Default options and the ~/.cvsrc file]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX13|.profile, setting CVSROOT in]]</td><td 
valign="top">[[#SEC10|Telling CVS where your repository is]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX15|.tcshrc, setting CVSROOT in]]</td><td 
valign="top">[[#SEC10|Telling CVS where your repository is]]</td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><div id="SEC189_5"></div>/</th><td></td><td></td></tr>
+<tr><td></td><td valign="top">[[#SEC9|/usr/local/cvsroot, as example 
repository]]</td><td valign="top">[[#SEC9|The Repository]]</td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><div id="SEC189_6"></div>:</th><td></td><td></td></tr>
+<tr><td></td><td valign="top">[[#IDX66|:ext:, setting up]]</td><td 
valign="top">[[#SEC28|Connecting with rsh]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX318|:ext:, troubleshooting]]</td><td 
valign="top">[[#SEC185|Trouble making a connection to a CVS server]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC35|:fork:, setting up]]</td><td 
valign="top">[[#SEC35|Connecting with fork]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC33|:gserver:, setting up]]</td><td 
valign="top">[[#SEC33|Direct connection with GSSAPI]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC34|:kserver:, setting up]]</td><td 
valign="top">[[#SEC34|Direct connection with kerberos]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX12|:local:, setting up]]</td><td 
valign="top">[[#SEC9|The Repository]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC31|:pserver:, setting up]]</td><td 
valign="top">[[#SEC31|Using the client with password authentication]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX320|:pserver:, troubleshooting]]</td><td 
valign="top">[[#SEC185|Trouble making a connection to a CVS server]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX65|:server:, setting up]]</td><td 
valign="top">[[#SEC28|Connecting with rsh]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX319|:server:, troubleshooting]]</td><td 
valign="top">[[#SEC185|Trouble making a connection to a CVS server]]</td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><div id="SEC189_7"></div>&lt;</th><td></td><td></td></tr>
+<tr><td></td><td valign="top">[[#IDX151|&lt;&lt;&lt;&lt;&lt;&lt;&lt;]]</td><td 
valign="top">[[#SEC86|Conflicts example]]</td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><div id="SEC189_8"></div>=</th><td></td><td></td></tr>
+<tr><td></td><td valign="top">[[#IDX153|=======]]</td><td 
valign="top">[[#SEC86|Conflicts example]]</td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><div id="SEC189_9"></div>&gt;</th><td></td><td></td></tr>
+<tr><td></td><td valign="top">[[#IDX152|&gt;&gt;&gt;&gt;&gt;&gt;&gt;]]</td><td 
valign="top">[[#SEC86|Conflicts example]]</td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><div id="SEC189_10"></div>_</th><td></td><td></td></tr>
+<tr><td></td><td valign="top">[[#IDX247|__ files (VMS)]]</td><td 
valign="top">[[#SEC155|update output]]</td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><div id="SEC189_11"></div>A</th><td></td><td></td></tr>
+<tr><td></td><td valign="top">[[#IDX176|Abandoning work]]</td><td 
valign="top">[[#SEC92|How to edit a file which is being watched]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC57|Access a branch]]</td><td 
valign="top">[[#SEC57|Accessing branches]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX129|add (subcommand)]]</td><td 
valign="top">[[#SEC67|Adding files to a directory]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX100|Adding a tag]]</td><td 
valign="top">[[#SEC48|Tags&ndash;Symbolic revisions]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC67|Adding files]]</td><td 
valign="top">[[#SEC67|Adding files to a directory]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC120|Admin (subcommand)]]</td><td 
valign="top">[[#SEC120|admin&mdash;Administration]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC20|Administrative files (intro)]]</td><td 
valign="top">[[#SEC20|The administrative files]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC157|Administrative files 
(reference)]]</td><td valign="top">[[#SEC157|Reference manual for 
Administrative files]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC21|Administrative files, editing 
them]]</td><td valign="top">[[#SEC21|Editing administrative files]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC159|Alias modules]]</td><td 
valign="top">[[#SEC159|Alias modules]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX264|ALL in commitinfo]]</td><td 
valign="top">[[#SEC168|Commitinfo]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC161|Ampersand modules]]</td><td 
valign="top">[[#SEC161|Ampersand modules]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC79|annotate (subcommand)]]</td><td 
valign="top">[[#SEC79|Annotate command]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX160|Atomic transactions, lack of]]</td><td 
valign="top">[[#SEC88|Several developers simultaneously attempting to run 
CVS]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC15|Attic]]</td><td 
valign="top">[[#SEC15|The attic]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC31|Authenticated client, using]]</td><td 
valign="top">[[#SEC31|Using the client with password authentication]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX79|Authenticating server, setting 
up]]</td><td valign="top">[[#SEC30|Setting up the server for password 
authentication]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX202|Authentication, stream]]</td><td 
valign="top">[[#SEC118|Global options]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX182|Author keyword]]</td><td 
valign="top">[[#SEC99|Keyword List]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX272|Automatically ignored files]]</td><td 
valign="top">[[#SEC176|Ignoring files via cvsignore]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX228|Avoiding editor invocation]]</td><td 
valign="top">[[#SEC119|Common command options]]</td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><div id="SEC189_12"></div>B</th><td></td><td></td></tr>
+<tr><td></td><td valign="top">[[#SEC24|Backing up, repository]]</td><td 
valign="top">[[#SEC24|Backing up a repository]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX53|Base directory, in CVS 
directory]]</td><td valign="top">[[#SEC19|How data is stored in the working 
directory]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX99|BASE, as reserved tag name]]</td><td 
valign="top">[[#SEC48|Tags&ndash;Symbolic revisions]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX230|BASE, special tag]]</td><td 
valign="top">[[#SEC119|Common command options]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX55|Baserev file, in CVS 
directory]]</td><td valign="top">[[#SEC19|How data is stored in the working 
directory]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX57|Baserev.tmp file, in CVS 
directory]]</td><td valign="top">[[#SEC19|How data is stored in the working 
directory]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX201|Bill of materials]]</td><td 
valign="top">[[#SEC112|How your build system interacts with CVS]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC80|Binary files]]</td><td 
valign="top">[[#SEC80|Handling binary files]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX122|Branch merge example]]</td><td 
valign="top">[[#SEC60|Merging an entire branch]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC45|Branch number]]</td><td 
valign="top">[[#SEC45|Revision numbers]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC58|Branch number]]</td><td 
valign="top">[[#SEC58|Branches and revisions]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX109|Branch tags, deleting]]</td><td 
valign="top">[[#SEC51|Deleting, moving, and renaming tags]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX113|Branch tags, moving]]</td><td 
valign="top">[[#SEC51|Deleting, moving, and renaming tags]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC57|Branch, accessing]]</td><td 
valign="top">[[#SEC57|Accessing branches]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC57|Branch, check out]]</td><td 
valign="top">[[#SEC57|Accessing branches]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC56|Branch, creating a]]</td><td 
valign="top">[[#SEC56|Creating a branch]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC57|Branch, identifying]]</td><td 
valign="top">[[#SEC57|Accessing branches]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC57|Branch, retrieving]]</td><td 
valign="top">[[#SEC57|Accessing branches]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX199|Branch, vendor-]]</td><td 
valign="top">[[#SEC105|Tracking third-party sources]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC55|Branches motivation]]</td><td 
valign="top">[[#SEC55|What branches are good for]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC54|Branches, copying changes 
between]]</td><td valign="top">[[#SEC54|Branching and merging]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX120|Branches, sticky]]</td><td 
valign="top">[[#SEC57|Accessing branches]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC54|Branching]]</td><td 
valign="top">[[#SEC54|Branching and merging]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC85|Bringing a file up to date]]</td><td 
valign="top">[[#SEC85|Bringing a file up to date]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC188|Bugs in this manual or CVS]]</td><td 
valign="top">[[#SEC188|Dealing with bugs in CVS or this manual]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX322|Bugs, reporting]]</td><td 
valign="top">[[#SEC188|Dealing with bugs in CVS or this manual]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC112|Builds]]</td><td 
valign="top">[[#SEC112|How your build system interacts with CVS]]</td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><div id="SEC189_13"></div>C</th><td></td><td></td></tr>
+<tr><td></td><td valign="top">[[#SEC54|Changes, copying between 
branches]]</td><td valign="top">[[#SEC54|Branching and merging]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX234|Changing a log message]]</td><td 
valign="top">[[#SEC121|admin options]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC57|Check out a branch]]</td><td 
valign="top">[[#SEC57|Accessing branches]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC174|Checked out copy, keeping]]</td><td 
valign="top">[[#SEC174|Keeping a checked out copy]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC5|Checking out source]]</td><td 
valign="top">[[#SEC5|Getting the source]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC122|checkout (subcommand)]]</td><td 
valign="top">[[#SEC122|checkout&mdash;Check out sources for editing]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX254|Checkout program]]</td><td 
valign="top">[[#SEC163|Module options]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC92|Checkout, as term for getting ready to 
edit]]</td><td valign="top">[[#SEC92|How to edit a file which is being 
watched]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC5|Checkout, example]]</td><td 
valign="top">[[#SEC5|Getting the source]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC177|checkoutlist]]</td><td 
valign="top">[[#SEC177|The checkoutlist file]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC95|Choosing, reserved or unreserved 
checkouts]]</td><td valign="top">[[#SEC95|Choosing between reserved or 
unreserved checkouts]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC7|Cleaning up]]</td><td 
valign="top">[[#SEC7|Cleaning up]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC26|Client/Server Operation]]</td><td 
valign="top">[[#SEC26|Remote repositories]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC26|Client/Server Operation, port 
specification]]</td><td valign="top">[[#SEC26|Remote repositories]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX73|Client/Server Operation, port 
specification]]</td><td valign="top">[[#SEC30|Setting up the server for 
password authentication]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC122|co (subcommand)]]</td><td 
valign="top">[[#SEC122|checkout&mdash;Check out sources for editing]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC156|Command reference]]</td><td 
valign="top">[[#SEC156|Quick reference to CVS commands]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC115|Command structure]]</td><td 
valign="top">[[#SEC115|Overall structure of CVS commands]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX233|Comment leader]]</td><td 
valign="top">[[#SEC121|admin options]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC125|commit (subcommand)]]</td><td 
valign="top">[[#SEC125|commit&mdash;Check files into the repository]]</td></tr>
+<tr><td></td><td 
valign="top">[[#SEC168|&lsquo;<tt>commitinfo</tt>&rsquo;]]</td><td 
valign="top">[[#SEC168|Commitinfo]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX266|&lsquo;<tt>commitinfo</tt>&rsquo;, 
command environment]]</td><td valign="top">[[#SEC168|Commitinfo]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX265|&lsquo;<tt>commitinfo</tt>&rsquo;, 
working directory]]</td><td valign="top">[[#SEC168|Commitinfo]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC168|Commits, precommit verification 
of]]</td><td valign="top">[[#SEC168|Commitinfo]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC6|Committing changes to files]]</td><td 
valign="top">[[#SEC6|Committing your changes]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC166|Committing, administrative support 
files]]</td><td valign="top">[[#SEC166|The commit support files]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC97|Committing, when to]]</td><td 
valign="top">[[#SEC97|When to commit?]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC119|Common options]]</td><td 
valign="top">[[#SEC119|Common command options]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC167|Common syntax of info files]]</td><td 
valign="top">[[#SEC167|The common syntax]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC182|Compatibility, between CVS 
versions]]</td><td valign="top">[[#SEC182|Compatibility between CVS 
Versions]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX219|Compression]]</td><td 
valign="top">[[#SEC118|Global options]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX248|Compression]]</td><td 
valign="top">[[#SEC156|Quick reference to CVS commands]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX310|COMSPEC, environment 
variable]]</td><td valign="top">[[#SEC181|All environment variables which 
affect CVS]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC180|config, in CVSROOT]]</td><td 
valign="top">[[#SEC180|The CVSROOT/config configuration file]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC103|Configuring keyword 
expansion]]</td><td valign="top">[[#SEC103|Configuring Keyord 
Expansion]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX150|Conflict markers]]</td><td 
valign="top">[[#SEC86|Conflicts example]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX155|Conflict resolution]]</td><td 
valign="top">[[#SEC86|Conflicts example]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX148|Conflicts (merge example)]]</td><td 
valign="top">[[#SEC86|Conflicts example]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX4|Contributors (CVS program)]]</td><td 
valign="top">[[#SEC2|What is CVS?]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC187|Contributors (manual)]]</td><td 
valign="top">[[#SEC187|Credits]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC25|Copying a repository]]</td><td 
valign="top">[[#SEC25|Moving a repository]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC54|Copying changes]]</td><td 
valign="top">[[#SEC54|Branching and merging]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX236|Correcting a log message]]</td><td 
valign="top">[[#SEC121|admin options]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC56|Creating a branch]]</td><td 
valign="top">[[#SEC56|Creating a branch]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC38|Creating a project]]</td><td 
valign="top">[[#SEC38|Starting a project with CVS]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC23|Creating a repository]]</td><td 
valign="top">[[#SEC23|Creating a repository]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX3|Credits (CVS program)]]</td><td 
valign="top">[[#SEC2|What is CVS?]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC187|Credits (manual)]]</td><td 
valign="top">[[#SEC187|Credits]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC94|CVS 1.6, and watches]]</td><td 
valign="top">[[#SEC94|Using watches with old versions of CVS]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC115|CVS command structure]]</td><td 
valign="top">[[#SEC115|Overall structure of CVS commands]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC16|CVS directory, in repository]]</td><td 
valign="top">[[#SEC16|The CVS directory in the repository]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC19|CVS directory, in working 
directory]]</td><td valign="top">[[#SEC19|How data is stored in the working 
directory]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX82|CVS passwd file]]</td><td 
valign="top">[[#SEC30|Setting up the server for password 
authentication]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX2|CVS, history of]]</td><td 
valign="top">[[#SEC2|What is CVS?]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC2|CVS, introduction to]]</td><td 
valign="top">[[#SEC2|What is CVS?]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC182|CVS, versions of]]</td><td 
valign="top">[[#SEC182|Compatibility between CVS Versions]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX54|CVS/Base directory]]</td><td 
valign="top">[[#SEC19|How data is stored in the working directory]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX56|CVS/Baserev file]]</td><td 
valign="top">[[#SEC19|How data is stored in the working directory]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX58|CVS/Baserev.tmp file]]</td><td 
valign="top">[[#SEC19|How data is stored in the working directory]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX38|CVS/Entries file]]</td><td 
valign="top">[[#SEC19|How data is stored in the working directory]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX42|CVS/Entries.Backup file]]</td><td 
valign="top">[[#SEC19|How data is stored in the working directory]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX40|CVS/Entries.Log file]]</td><td 
valign="top">[[#SEC19|How data is stored in the working directory]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX44|CVS/Entries.Static file]]</td><td 
valign="top">[[#SEC19|How data is stored in the working directory]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX50|CVS/Notify file]]</td><td 
valign="top">[[#SEC19|How data is stored in the working directory]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX52|CVS/Notify.tmp file]]</td><td 
valign="top">[[#SEC19|How data is stored in the working directory]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX34|CVS/Repository file]]</td><td 
valign="top">[[#SEC19|How data is stored in the working directory]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX19|CVS/Root file]]</td><td 
valign="top">[[#SEC10|Telling CVS where your repository is]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX46|CVS/Tag file]]</td><td 
valign="top">[[#SEC19|How data is stored in the working directory]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX60|CVS/Template file]]</td><td 
valign="top">[[#SEC19|How data is stored in the working directory]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX306|CVS_CLIENT_LOG, environment 
variable]]</td><td valign="top">[[#SEC181|All environment variables which 
affect CVS]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX87|CVS_CLIENT_PORT]]</td><td 
valign="top">[[#SEC34|Direct connection with kerberos]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX308|CVS_IGNORE_REMOTE_ROOT, environment 
variable]]</td><td valign="top">[[#SEC181|All environment variables which 
affect CVS]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX309|CVS_LOCAL_BRANCH_NUM, environment 
variable]]</td><td valign="top">[[#SEC181|All environment variables which 
affect CVS]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX85|CVS_PASSFILE, environment 
variable]]</td><td valign="top">[[#SEC31|Using the client with password 
authentication]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX315|CVS_PID, environment 
variable]]</td><td valign="top">[[#SEC181|All environment variables which 
affect CVS]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX305|CVS_RCMD_PORT, environment 
variable]]</td><td valign="top">[[#SEC181|All environment variables which 
affect CVS]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX304|CVS_RSH, environment 
variable]]</td><td valign="top">[[#SEC181|All environment variables which 
affect CVS]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX89|CVS_SERVER, and :fork:]]</td><td 
valign="top">[[#SEC35|Connecting with fork]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX64|CVS_SERVER, environment 
variable]]</td><td valign="top">[[#SEC28|Connecting with rsh]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX307|CVS_SERVER_SLEEP, environment 
variable]]</td><td valign="top">[[#SEC181|All environment variables which 
affect CVS]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX281|CVS_USER, environment 
variable]]</td><td valign="top">[[#SEC179|Expansions in administrative 
files]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX231|cvsadmin]]</td><td 
valign="top">[[#SEC120|admin&mdash;Administration]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX9|CVSEDITOR, environment 
variable]]</td><td valign="top">[[#SEC6|Committing your changes]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX297|CVSEDITOR, environment 
variable]]</td><td valign="top">[[#SEC181|All environment variables which 
affect CVS]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX275|CVSEDITOR, internal variable]]</td><td 
valign="top">[[#SEC179|Expansions in administrative files]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX183|CVSHeader keyword]]</td><td 
valign="top">[[#SEC99|Keyword List]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC176|cvsignore (admin file), 
global]]</td><td valign="top">[[#SEC176|Ignoring files via cvsignore]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX292|CVSIGNORE, environment 
variable]]</td><td valign="top">[[#SEC181|All environment variables which 
affect CVS]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX294|CVSREAD, environment 
variable]]</td><td valign="top">[[#SEC181|All environment variables which 
affect CVS]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX216|CVSREAD, overriding]]</td><td 
valign="top">[[#SEC118|Global options]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX296|CVSREADONLYFS, environment 
variable]]</td><td valign="top">[[#SEC181|All environment variables which 
affect CVS]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC9|cvsroot]]</td><td 
valign="top">[[#SEC9|The Repository]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC157|CVSROOT (file)]]</td><td 
valign="top">[[#SEC157|Reference manual for Administrative files]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX17|CVSROOT, environment variable]]</td><td 
valign="top">[[#SEC10|Telling CVS where your repository is]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX273|CVSROOT, internal variable]]</td><td 
valign="top">[[#SEC179|Expansions in administrative files]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC20|CVSROOT, module name]]</td><td 
valign="top">[[#SEC20|The administrative files]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC22|CVSROOT, multiple 
repositories]]</td><td valign="top">[[#SEC22|Multiple repositories]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX208|CVSROOT, overriding]]</td><td 
valign="top">[[#SEC118|Global options]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC18|CVSROOT, storage of files]]</td><td 
valign="top">[[#SEC18|How files are stored in the CVSROOT directory]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC180|CVSROOT/config]]</td><td 
valign="top">[[#SEC180|The CVSROOT/config configuration file]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX36|CVSROOT/Emptydir directory]]</td><td 
valign="top">[[#SEC19|How data is stored in the working directory]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX22|CVSUMASK, environment 
variable]]</td><td valign="top">[[#SEC13|File permissions]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC165|cvswrappers (admin file)]]</td><td 
valign="top">[[#SEC165|The cvswrappers file]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC165|CVSWRAPPERS, environment 
variable]]</td><td valign="top">[[#SEC165|The cvswrappers file]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX293|CVSWRAPPERS, environment 
variable]]</td><td valign="top">[[#SEC181|All environment variables which 
affect CVS]]</td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><div id="SEC189_14"></div>D</th><td></td><td></td></tr>
+<tr><td></td><td valign="top">[[#IDX184|Date keyword]]</td><td 
valign="top">[[#SEC99|Keyword List]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX221|Dates]]</td><td 
valign="top">[[#SEC119|Common command options]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX28|Dead state]]</td><td 
valign="top">[[#SEC15|The attic]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC45|Decimal revision number]]</td><td 
valign="top">[[#SEC45|Revision numbers]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX263|DEFAULT in commitinfo]]</td><td 
valign="top">[[#SEC168|Commitinfo]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX270|DEFAULT in editinfo]]</td><td 
valign="top">[[#SEC170|Editinfo]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX267|DEFAULT in 
&lsquo;<tt>verifymsg</tt>&rsquo;]]</td><td valign="top">[[#SEC169|Verifying log 
messages]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC43|Defining a module]]</td><td 
valign="top">[[#SEC43|Defining the module]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC20|Defining modules (intro)]]</td><td 
valign="top">[[#SEC20|The administrative files]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC158|Defining modules (reference 
manual)]]</td><td valign="top">[[#SEC158|The modules file]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX105|Deleting branch tags]]</td><td 
valign="top">[[#SEC51|Deleting, moving, and renaming tags]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC68|Deleting files]]</td><td 
valign="top">[[#SEC68|Removing files]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX239|Deleting revisions]]</td><td 
valign="top">[[#SEC121|admin options]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX118|Deleting sticky tags]]</td><td 
valign="top">[[#SEC53|Sticky tags]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX104|Deleting tags]]</td><td 
valign="top">[[#SEC51|Deleting, moving, and renaming tags]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC65|Descending directories]]</td><td 
valign="top">[[#SEC65|Recursive behavior]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC113|Device nodes]]</td><td 
valign="top">[[#SEC113|Special Files]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC8|Diff]]</td><td 
valign="top">[[#SEC8|Viewing differences]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC130|diff (subcommand)]]</td><td 
valign="top">[[#SEC130|diff&mdash;Show differences between revisions]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC62|Differences, merging]]</td><td 
valign="top">[[#SEC62|Merging differences between any two revisions]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC74|Directories, moving]]</td><td 
valign="top">[[#SEC74|Moving and renaming directories]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC69|Directories, removing]]</td><td 
valign="top">[[#SEC69|Removing directories]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC65|Directory, descending]]</td><td 
valign="top">[[#SEC65|Recursive behavior]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC22|Disjoint repositories]]</td><td 
valign="top">[[#SEC22|Multiple repositories]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC172|Distributing log messages]]</td><td 
valign="top">[[#SEC172|Loginfo]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC86|driver.c (merge example)]]</td><td 
valign="top">[[#SEC86|Conflicts example]]</td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><div id="SEC189_15"></div>E</th><td></td><td></td></tr>
+<tr><td></td><td valign="top">[[#IDX173|edit (subcommand)]]</td><td 
valign="top">[[#SEC92|How to edit a file which is being watched]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC170|editinfo (admin file)]]</td><td 
valign="top">[[#SEC170|Editinfo]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC21|Editing administrative files]]</td><td 
valign="top">[[#SEC21|Editing administrative files]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC43|Editing the modules file]]</td><td 
valign="top">[[#SEC43|Defining the module]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX227|Editor, avoiding invocation 
of]]</td><td valign="top">[[#SEC119|Common command options]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX10|EDITOR, environment variable]]</td><td 
valign="top">[[#SEC6|Committing your changes]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX298|EDITOR, environment variable]]</td><td 
valign="top">[[#SEC181|All environment variables which affect CVS]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX276|EDITOR, internal variable]]</td><td 
valign="top">[[#SEC179|Expansions in administrative files]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX210|EDITOR, overriding]]</td><td 
valign="top">[[#SEC118|Global options]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC170|Editor, specifying per 
module]]</td><td valign="top">[[#SEC170|Editinfo]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX180|editors (subcommand)]]</td><td 
valign="top">[[#SEC93|Information about who is watching and editing]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX156|emerge]]</td><td 
valign="top">[[#SEC86|Conflicts example]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX35|Emptydir, in CVSROOT 
directory]]</td><td valign="top">[[#SEC19|How data is stored in the working 
directory]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX218|Encryption]]</td><td 
valign="top">[[#SEC118|Global options]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX37|Entries file, in CVS 
directory]]</td><td valign="top">[[#SEC19|How data is stored in the working 
directory]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX41|Entries.Backup file, in CVS 
directory]]</td><td valign="top">[[#SEC19|How data is stored in the working 
directory]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX39|Entries.Log file, in CVS 
directory]]</td><td valign="top">[[#SEC19|How data is stored in the working 
directory]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX43|Entries.Static file, in CVS 
directory]]</td><td valign="top">[[#SEC19|How data is stored in the working 
directory]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC181|Environment variables]]</td><td 
valign="top">[[#SEC181|All environment variables which affect CVS]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX280|environment variables, passed to 
administrative files]]</td><td valign="top">[[#SEC179|Expansions in 
administrative files]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX323|Errors, reporting]]</td><td 
valign="top">[[#SEC188|Dealing with bugs in CVS or this manual]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC4|Example of a work-session]]</td><td 
valign="top">[[#SEC4|A sample session]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC86|Example of merge]]</td><td 
valign="top">[[#SEC86|Conflicts example]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX123|Example, branch merge]]</td><td 
valign="top">[[#SEC60|Merging an entire branch]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC162|Excluding directories, in modules 
file]]</td><td valign="top">[[#SEC162|Excluding directories]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX262|Exit status, of commitinfo]]</td><td 
valign="top">[[#SEC168|Commitinfo]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC116|Exit status, of CVS]]</td><td 
valign="top">[[#SEC116|CVS&rsquo;s exit status]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX317|Exit status, of editor]]</td><td 
valign="top">[[#SEC184|Partial list of error messages]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX134|Exit status, of taginfo]]</td><td 
valign="top">[[#SEC78|User-defined logging]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX268|Exit status, of 
&lsquo;<tt>verifymsg</tt>&rsquo;]]</td><td valign="top">[[#SEC169|Verifying log 
messages]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC135|export (subcommand)]]</td><td 
valign="top">[[#SEC135|export&mdash;Export sources from CVS, similar to 
checkout]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX252|Export program]]</td><td 
valign="top">[[#SEC163|Module options]]</td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><div id="SEC189_16"></div>F</th><td></td><td></td></tr>
+<tr><td></td><td valign="top">[[#SEC5|Fetching source]]</td><td 
valign="top">[[#SEC5|Getting the source]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX144|File had conflicts on merge]]</td><td 
valign="top">[[#SEC84|File status]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC83|File locking]]</td><td 
valign="top">[[#SEC83|Multiple developers]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC13|File permissions, general]]</td><td 
valign="top">[[#SEC13|File permissions]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC14|File permissions, 
Windows-specific]]</td><td valign="top">[[#SEC14|File Permission issues 
specific to Windows]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC84|File status]]</td><td 
valign="top">[[#SEC84|File status]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC70|Files, moving]]</td><td 
valign="top">[[#SEC70|Moving and renaming files]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC157|Files, reference manual]]</td><td 
valign="top">[[#SEC157|Reference manual for Administrative files]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX237|Fixing a log message]]</td><td 
valign="top">[[#SEC121|admin options]]</td></tr>
+<tr><td></td><td valign="top">[[#IDX226|Forcing a tag match]]</td><td 
valign="top">[[#SEC119|Common command options]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC35|fork, access method]]</td><td 
valign="top">[[#SEC35|Connecting with fork]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC175|Form for log message]]</td><td 
valign="top">[[#SEC175|Rcsinfo]]</td></tr>
+<tr><td></td><td valign="top">[[#SEC115|Format of CVS commands]]</td><td 
valign="top">[[#SEC115|Overall structure of CVS commands]]</td></tr>
+<tr><td c