trans-coord-devel
[Top][All Lists]
Advanced

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

trans-coord/manual/cvs cvs.dvi.gz cvs.html cvs....


From: Pavel Kharitonov
Subject: trans-coord/manual/cvs cvs.dvi.gz cvs.html cvs....
Date: Mon, 28 Dec 2015 15:58:35 +0000

CVSROOT:        /web/trans-coord
Module name:    trans-coord
Changes by:     Pavel Kharitonov <ineiev>       15/12/28 15:58:34

Added files:
        manual/cvs     : cvs.dvi.gz cvs.html cvs.html.gz 
                         cvs.html_node.tar.gz cvs.info.tar.gz cvs.pdf 
                         cvs.texi.tar.gz cvs.txt cvs.txt.gz index.html 
        manual/cvs/html_node: A-sample-session.html 
                              Accessing-branches.html 
                              Adding-and-removing.html Adding-files.html 
                              Administrative-files.html 
                              Alias-modules.html Ampersand-modules.html 
                              Assigning-revisions.html Attic.html 
                              Avoiding-substitution.html BUGS.html 
                              Backing-up.html 
                              Binary-files-in-imports.html 
                              Binary-files.html Binary-howto.html 
                              Binary-why.html 
                              Branches-and-revisions.html 
                              Branches-motivation.html 
                              Branching-and-merging.html Builds.html 
                              CVS-commands.html CVS-in-repository.html 
                              CVSROOT-storage.html Choosing-a-model.html 
                              Cleaning-up.html 
                              Committing-your-changes.html 
                              Common-options.html Compatibility.html 
                              Concurrency.html Conflicts-example.html 
                              Connecting-via-fork.html 
                              Connecting-via-rsh.html Connection.html 
                              Creating-a-branch.html 
                              Creating-a-repository.html Credits.html 
                              Defining-the-module.html 
                              Editing-files.html 
                              Environment-variables.html 
                              Error-messages.html 
                              Excluding-directories.html 
                              Exit-status.html File-permissions.html 
                              File-status.html First-import.html 
                              From-files.html 
                              From-other-version-control-systems.html 
                              From-scratch.html 
                              GSSAPI-authenticated.html 
                              Getting-Notified.html 
                              Getting-the-source.html 
                              Global-options.html History-browsing.html 
                              Index.html Informing-others.html 
                              Inside.html 
                              Intro-administrative-files.html 
                              Invoking-CVS.html 
                              Keeping-a-checked-out-copy.html 
                              Kerberos-authenticated.html 
                              Keyword-list.html 
                              Keyword-substitution.html 
                              Keywords-in-imports.html Line-formats.html 
                              Line-group-formats.html Locks.html 
                              Log-keyword.html Magic-branch-numbers.html 
                              Merging-a-branch.html 
                              Merging-adds-and-removals.html 
                              Merging-and-keywords.html 
                              Merging-more-than-once.html 
                              Merging-two-revisions.html 
                              Modifying-tags.html Module-options.html 
                              Module-program-options.html 
                              Moving-a-repository.html 
                              Moving-directories.html Moving-files.html 
                              Multiple-developers.html 
                              Multiple-repositories.html 
                              Multiple-vendor-branches.html 
                              Other-problems.html Outside.html 
                              Overview.html Password-authenticated.html 
                              Password-authentication-client.html 
                              Password-authentication-security.html 
                              Password-authentication-server.html 
                              Read_002donly-access.html 
                              Recursive-behavior.html 
                              Regular-modules.html 
                              Remote-repositories.html 
                              Removing-directories.html 
                              Removing-files.html Rename-by-copying.html 
                              Repository-files.html 
                              Repository-storage.html Repository.html 
                              Reverting-local-changes.html 
                              Revision-management.html 
                              Revision-numbers.html Revisions.html 
                              Server-requirements.html 
                              Server-temporary-directory.html 
                              Setting-a-watch.html 
                              Setting-up-the-files.html 
                              Special-Files.html 
                              Specifying-a-repository.html 
                              Starting-a-new-project.html 
                              Sticky-tags.html Structure.html 
                              Substitution-modes.html 
                              Tagging-add_002fremove.html 
                              Tagging-by-date_002ftag.html 
                              Tagging-the-working-directory.html 
                              Tags.html Tracking-sources.html 
                              Trigger-Script-Security.html 
                              Trigger-Scripts.html Troubleshooting.html 
                              Update-imports.html Updating-a-file.html 
                              Using-keywords.html Variables.html 
                              Versions-revisions-releases.html 
                              Viewing-differences.html 
                              Watch-information.html 
                              Watches-Compatibility.html Watches.html 
                              What-is-CVS-not_003f.html 
                              What-is-CVS_003f.html When-to-commit.html 
                              Windows-permissions.html 
                              Working-directory-storage.html 
                              Wrappers.html _007e_002f_002ecvsrc.html 
                              add-examples.html add-options.html 
                              add.html admin-options.html admin.html 
                              annotate-example.html 
                              annotate-options.html annotate.html 
                              checkout-examples.html 
                              checkout-options.html checkout.html 
                              checkoutlist.html commit-examples.html 
                              commit-files.html commit-options.html 
                              commit.html commitinfo.html config.html 
                              cvsignore.html diff-examples.html 
                              diff-options.html diff.html 
                              editinfo-example.html editinfo.html 
                              export-options.html export.html 
                              history-database.html history-file.html 
                              history-options.html history.html 
                              import-examples.html import-options.html 
                              import-output.html import.html index.html 
                              log-examples.html log-messages.html 
                              log-options.html log.html 
                              loginfo-example.html loginfo.html 
                              modules.html rcsinfo.html 
                              rdiff-examples.html rdiff-options.html 
                              rdiff.html release-examples.html 
                              release-options.html release-output.html 
                              release.html remove-examples.html 
                              remove-options.html remove.html 
                              syntax.html taginfo.html 
                              update-options.html update-output.html 
                              update.html user_002ddefined-logging.html 
                              verifymsg.html 

Log message:
        Add cvs manual RT #1073518.

CVSWeb URLs:
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/cvs.dvi.gz?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/cvs.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/cvs.html.gz?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/cvs.html_node.tar.gz?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/cvs.info.tar.gz?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/cvs.pdf?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/cvs.texi.tar.gz?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/cvs.txt?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/cvs.txt.gz?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/index.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/A-sample-session.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Accessing-branches.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Adding-and-removing.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Adding-files.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Administrative-files.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Alias-modules.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Ampersand-modules.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Assigning-revisions.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Attic.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Avoiding-substitution.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/BUGS.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Backing-up.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Binary-files-in-imports.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Binary-files.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Binary-howto.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Binary-why.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Branches-and-revisions.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Branches-motivation.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Branching-and-merging.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Builds.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/CVS-commands.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/CVS-in-repository.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/CVSROOT-storage.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Choosing-a-model.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Cleaning-up.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Committing-your-changes.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Common-options.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Compatibility.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Concurrency.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Conflicts-example.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Connecting-via-fork.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Connecting-via-rsh.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Connection.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Creating-a-branch.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Creating-a-repository.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Credits.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Defining-the-module.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Editing-files.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Environment-variables.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Error-messages.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Excluding-directories.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Exit-status.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/File-permissions.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/File-status.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/First-import.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/From-files.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/From-other-version-control-systems.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/From-scratch.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/GSSAPI-authenticated.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Getting-Notified.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Getting-the-source.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Global-options.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/History-browsing.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Index.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Informing-others.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Inside.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Intro-administrative-files.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Invoking-CVS.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Keeping-a-checked-out-copy.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Kerberos-authenticated.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Keyword-list.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Keyword-substitution.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Keywords-in-imports.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Line-formats.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Line-group-formats.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Locks.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Log-keyword.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Magic-branch-numbers.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Merging-a-branch.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Merging-adds-and-removals.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Merging-and-keywords.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Merging-more-than-once.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Merging-two-revisions.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Modifying-tags.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Module-options.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Module-program-options.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Moving-a-repository.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Moving-directories.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Moving-files.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Multiple-developers.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Multiple-repositories.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Multiple-vendor-branches.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Other-problems.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Outside.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Overview.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Password-authenticated.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Password-authentication-client.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Password-authentication-security.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Password-authentication-server.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Read_002donly-access.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Recursive-behavior.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Regular-modules.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Remote-repositories.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Removing-directories.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Removing-files.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Rename-by-copying.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Repository-files.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Repository-storage.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Repository.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Reverting-local-changes.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Revision-management.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Revision-numbers.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Revisions.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Server-requirements.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Server-temporary-directory.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Setting-a-watch.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Setting-up-the-files.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Special-Files.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Specifying-a-repository.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Starting-a-new-project.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Sticky-tags.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Structure.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Substitution-modes.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Tagging-add_002fremove.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Tagging-by-date_002ftag.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Tagging-the-working-directory.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Tags.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Tracking-sources.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Trigger-Script-Security.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Trigger-Scripts.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Troubleshooting.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Update-imports.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Updating-a-file.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Using-keywords.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Variables.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Versions-revisions-releases.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Viewing-differences.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Watch-information.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Watches-Compatibility.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Watches.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/What-is-CVS-not_003f.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/What-is-CVS_003f.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/When-to-commit.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Windows-permissions.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Working-directory-storage.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/Wrappers.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/_007e_002f_002ecvsrc.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/add-examples.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/add-options.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/add.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/admin-options.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/admin.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/annotate-example.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/annotate-options.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/annotate.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/checkout-examples.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/checkout-options.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/checkout.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/checkoutlist.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/commit-examples.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/commit-files.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/commit-options.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/commit.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/commitinfo.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/config.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/cvsignore.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/diff-examples.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/diff-options.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/diff.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/editinfo-example.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/editinfo.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/export-options.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/export.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/history-database.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/history-file.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/history-options.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/history.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/import-examples.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/import-options.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/import-output.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/import.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/index.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/log-examples.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/log-messages.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/log-options.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/log.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/loginfo-example.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/loginfo.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/modules.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/rcsinfo.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/rdiff-examples.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/rdiff-options.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/rdiff.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/release-examples.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/release-options.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/release-output.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/release.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/remove-examples.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/remove-options.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/remove.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/syntax.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/taginfo.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/update-options.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/update-output.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/update.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/user_002ddefined-logging.html?cvsroot=trans-coord&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/trans-coord/manual/cvs/html_node/verifymsg.html?cvsroot=trans-coord&rev=1.1

Patches:
Index: cvs.dvi.gz
===================================================================
RCS file: cvs.dvi.gz
diff -N cvs.dvi.gz
Binary files /dev/null and /tmp/cvsxK6bcI differ

Index: cvs.html
===================================================================
RCS file: cvs.html
diff -N cvs.html
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ cvs.html    28 Dec 2015 15:57:42 -0000      1.1
@@ -0,0 +1,15873 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd";>
+<html>
+<!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
+<head>
+<title>CVS&mdash;Concurrent Versions System v1.11.23</title>
+
+<meta name="description" content="CVS&mdash;Concurrent Versions System 
v1.11.23">
+<meta name="keywords" content="CVS&mdash;Concurrent Versions System v1.11.23">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<link href="#Top" rel="start" title="Top">
+<link href="#Index" rel="index" title="Index">
+<link href="#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="dir.html#Top" rel="up" title="(dir)">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+blockquote.smallquotation {font-size: smaller}
+div.display {margin-left: 3.2em}
+div.example {margin-left: 3.2em}
+div.indentedblock {margin-left: 3.2em}
+div.lisp {margin-left: 3.2em}
+div.smalldisplay {margin-left: 3.2em}
+div.smallexample {margin-left: 3.2em}
+div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
+div.smalllisp {margin-left: 3.2em}
+kbd {font-style:oblique}
+pre.display {font-family: inherit}
+pre.format {font-family: inherit}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: inherit; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: inherit; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.nocodebreak {white-space:nowrap}
+span.nolinebreak {white-space:nowrap}
+span.roman {font-family:serif; font-weight:normal}
+span.sansserif {font-family:sans-serif; font-weight:normal}
+ul.no-bullet {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" 
vlink="#800080" alink="#FF0000">
+<h1 class="settitle" align="center">CVS&mdash;Concurrent Versions System 
v1.11.23</h1>
+
+
+
+
+
+
+
+
+
+
+
+
+<a name="SEC_Overview"></a>
+<h2 class="shortcontents-heading">Short Table of Contents</h2>
+
+<div class="shortcontents">
+<ul class="no-bullet">
+<li><a name="stoc-Overview-1" href="#toc-Overview-1">1 Overview</a></li>
+<li><a name="stoc-The-Repository" href="#toc-The-Repository">2 The 
Repository</a></li>
+<li><a name="stoc-Starting-a-project-with-CVS" 
href="#toc-Starting-a-project-with-CVS">3 Starting a project with CVS</a></li>
+<li><a name="stoc-Revisions-1" href="#toc-Revisions-1">4 Revisions</a></li>
+<li><a name="stoc-Branching-and-merging-1" 
href="#toc-Branching-and-merging-1">5 Branching and merging</a></li>
+<li><a name="stoc-Recursive-behavior-1" href="#toc-Recursive-behavior-1">6 
Recursive behavior</a></li>
+<li><a 
name="stoc-Adding_002c-removing_002c-and-renaming-files-and-directories" 
href="#toc-Adding_002c-removing_002c-and-renaming-files-and-directories">7 
Adding, removing, and renaming files and directories</a></li>
+<li><a name="stoc-History-browsing-1" href="#toc-History-browsing-1">8 History 
browsing</a></li>
+<li><a name="stoc-Handling-binary-files" href="#toc-Handling-binary-files">9 
Handling binary files</a></li>
+<li><a name="stoc-Multiple-developers-1" href="#toc-Multiple-developers-1">10 
Multiple developers</a></li>
+<li><a name="stoc-Revision-management-1" href="#toc-Revision-management-1">11 
Revision management</a></li>
+<li><a name="stoc-Keyword-substitution-1" 
href="#toc-Keyword-substitution-1">12 Keyword substitution</a></li>
+<li><a name="stoc-Tracking-third_002dparty-sources" 
href="#toc-Tracking-third_002dparty-sources">13 Tracking third-party 
sources</a></li>
+<li><a name="stoc-How-your-build-system-interacts-with-CVS" 
href="#toc-How-your-build-system-interacts-with-CVS">14 How your build system 
interacts with CVS</a></li>
+<li><a name="stoc-Special-Files-1" href="#toc-Special-Files-1">15 Special 
Files</a></li>
+<li><a name="stoc-Guide-to-CVS-commands" 
href="#toc-Guide-to-CVS-commands">Appendix A Guide to CVS commands</a></li>
+<li><a name="stoc-Quick-reference-to-CVS-commands" 
href="#toc-Quick-reference-to-CVS-commands">Appendix B Quick reference to CVS 
commands</a></li>
+<li><a name="stoc-Reference-manual-for-Administrative-files" 
href="#toc-Reference-manual-for-Administrative-files">Appendix C Reference 
manual for Administrative files</a></li>
+<li><a name="stoc-All-environment-variables-which-affect-CVS" 
href="#toc-All-environment-variables-which-affect-CVS">Appendix D All 
environment variables which affect CVS</a></li>
+<li><a name="stoc-Compatibility-between-CVS-Versions" 
href="#toc-Compatibility-between-CVS-Versions">Appendix E Compatibility between 
CVS Versions</a></li>
+<li><a name="stoc-Troubleshooting-1" href="#toc-Troubleshooting-1">Appendix F 
Troubleshooting</a></li>
+<li><a name="stoc-Credits-1" href="#toc-Credits-1">Appendix G Credits</a></li>
+<li><a name="stoc-Dealing-with-bugs-in-CVS-or-this-manual" 
href="#toc-Dealing-with-bugs-in-CVS-or-this-manual">Appendix H Dealing with 
bugs in CVS or this manual</a></li>
+<li><a name="stoc-Index-1" href="#toc-Index-1">Index</a></li>
+</ul>
+</div>
+
+
+<a name="SEC_Contents"></a>
+<h2 class="contents-heading">Table of Contents</h2>
+
+<div class="contents">
+
+<ul class="no-bullet">
+  <li><a name="toc-Overview-1" href="#Overview">1 Overview</a>
+  <ul class="no-bullet">
+    <li><a name="toc-What-is-CVS_003f-1" href="#What-is-CVS_003f">1.1 What is 
CVS?</a></li>
+    <li><a name="toc-What-is-CVS-not_003f-1" href="#What-is-CVS-not_003f">1.2 
What is CVS not?</a></li>
+    <li><a name="toc-A-sample-session-1" href="#A-sample-session">1.3 A sample 
session</a>
+    <ul class="no-bullet">
+      <li><a name="toc-Getting-the-source-1" href="#Getting-the-source">1.3.1 
Getting the source</a></li>
+      <li><a name="toc-Committing-your-changes-1" 
href="#Committing-your-changes">1.3.2 Committing your changes</a></li>
+      <li><a name="toc-Cleaning-up-1" href="#Cleaning-up">1.3.3 Cleaning 
up</a></li>
+      <li><a name="toc-Viewing-differences-1" 
href="#Viewing-differences">1.3.4 Viewing differences</a></li>
+    </ul></li>
+  </ul></li>
+  <li><a name="toc-The-Repository" href="#Repository">2 The Repository</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Telling-CVS-where-your-repository-is" 
href="#Specifying-a-repository">2.1 Telling CVS where your repository 
is</a></li>
+    <li><a name="toc-How-data-is-stored-in-the-repository" 
href="#Repository-storage">2.2 How data is stored in the repository</a>
+    <ul class="no-bullet">
+      <li><a name="toc-Where-files-are-stored-within-the-repository" 
href="#Repository-files">2.2.1 Where files are stored within the 
repository</a></li>
+      <li><a name="toc-File-permissions-1" href="#File-permissions">2.2.2 File 
permissions</a></li>
+      <li><a name="toc-File-Permission-issues-specific-to-Windows" 
href="#Windows-permissions">2.2.3 File Permission issues specific to 
Windows</a></li>
+      <li><a name="toc-The-attic" href="#Attic">2.2.4 The attic</a></li>
+      <li><a name="toc-The-CVS-directory-in-the-repository" 
href="#CVS-in-repository">2.2.5 The CVS directory in the repository</a></li>
+      <li><a name="toc-CVS-locks-in-the-repository" href="#Locks">2.2.6 CVS 
locks in the repository</a></li>
+      <li><a name="toc-How-files-are-stored-in-the-CVSROOT-directory" 
href="#CVSROOT-storage">2.2.7 How files are stored in the CVSROOT 
directory</a></li>
+    </ul></li>
+    <li><a name="toc-How-data-is-stored-in-the-working-directory" 
href="#Working-directory-storage">2.3 How data is stored in the working 
directory</a></li>
+    <li><a name="toc-The-administrative-files" 
href="#Intro-administrative-files">2.4 The administrative files</a>
+    <ul class="no-bullet">
+      <li><a name="toc-Editing-administrative-files" 
href="#Editing-administrative-files">2.4.1 Editing administrative files</a></li>
+    </ul></li>
+    <li><a name="toc-Multiple-repositories-1" 
href="#Multiple-repositories">2.5 Multiple repositories</a></li>
+    <li><a name="toc-Creating-a-repository-1" 
href="#Creating-a-repository">2.6 Creating a repository</a></li>
+    <li><a name="toc-Backing-up-a-repository" href="#Backing-up">2.7 Backing 
up a repository</a></li>
+    <li><a name="toc-Moving-a-repository-1" href="#Moving-a-repository">2.8 
Moving a repository</a></li>
+    <li><a name="toc-Remote-repositories-1" href="#Remote-repositories">2.9 
Remote repositories</a>
+    <ul class="no-bullet">
+      <li><a name="toc-Server-requirements-1" 
href="#Server-requirements">2.9.1 Server requirements</a></li>
+      <li><a name="toc-Connecting-with-rsh-or-ssh" 
href="#Connecting-via-rsh">2.9.2 Connecting with rsh or ssh</a></li>
+      <li><a name="toc-Direct-connection-with-password-authentication" 
href="#Password-authenticated">2.9.3 Direct connection with password 
authentication</a>
+      <ul class="no-bullet">
+        <li><a name="toc-Setting-up-the-server-for-password-authentication" 
href="#Password-authentication-server">2.9.3.1 Setting up the server for 
password authentication</a></li>
+        <li><a name="toc-Using-the-client-with-password-authentication" 
href="#Password-authentication-client">2.9.3.2 Using the client with password 
authentication</a></li>
+        <li><a name="toc-Security-considerations-with-password-authentication" 
href="#Password-authentication-security">2.9.3.3 Security considerations with 
password authentication</a></li>
+      </ul></li>
+      <li><a name="toc-Direct-connection-with-GSSAPI" 
href="#GSSAPI-authenticated">2.9.4 Direct connection with GSSAPI</a></li>
+      <li><a name="toc-Direct-connection-with-Kerberos" 
href="#Kerberos-authenticated">2.9.5 Direct connection with Kerberos</a></li>
+      <li><a name="toc-Connecting-with-fork" href="#Connecting-via-fork">2.9.6 
Connecting with fork</a></li>
+    </ul></li>
+    <li><a name="toc-Read_002donly-repository-access" 
href="#Read_002donly-access">2.10 Read-only repository access</a></li>
+    <li><a name="toc-Temporary-directories-for-the-server" 
href="#Server-temporary-directory">2.11 Temporary directories for the 
server</a></li>
+  </ul></li>
+  <li><a name="toc-Starting-a-project-with-CVS" 
href="#Starting-a-new-project">3 Starting a project with CVS</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Setting-up-the-files-1" href="#Setting-up-the-files">3.1 
Setting up the files</a>
+    <ul class="no-bullet">
+      <li><a name="toc-Creating-a-directory-tree-from-a-number-of-files" 
href="#From-files">3.1.1 Creating a directory tree from a number of 
files</a></li>
+      <li><a name="toc-Creating-Files-From-Other-Version-Control-Systems" 
href="#From-other-version-control-systems">3.1.2 Creating Files From Other 
Version Control Systems</a></li>
+      <li><a name="toc-Creating-a-directory-tree-from-scratch" 
href="#From-scratch">3.1.3 Creating a directory tree from scratch</a></li>
+    </ul></li>
+    <li><a name="toc-Defining-the-module-1" href="#Defining-the-module">3.2 
Defining the module</a></li>
+  </ul></li>
+  <li><a name="toc-Revisions-1" href="#Revisions">4 Revisions</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Revision-numbers-1" href="#Revision-numbers">4.1 Revision 
numbers</a></li>
+    <li><a name="toc-Versions_002c-revisions-and-releases" 
href="#Versions-revisions-releases">4.2 Versions, revisions and 
releases</a></li>
+    <li><a name="toc-Assigning-revisions-1" href="#Assigning-revisions">4.3 
Assigning revisions</a></li>
+    <li><a name="toc-Tags_002d_002dSymbolic-revisions" href="#Tags">4.4 
Tags&ndash;Symbolic revisions</a></li>
+    <li><a name="toc-Specifying-what-to-tag-from-the-working-directory" 
href="#Tagging-the-working-directory">4.5 Specifying what to tag from the 
working directory</a></li>
+    <li><a name="toc-Specifying-what-to-tag-by-date-or-revision" 
href="#Tagging-by-date_002ftag">4.6 Specifying what to tag by date or 
revision</a></li>
+    <li><a name="toc-Deleting_002c-moving_002c-and-renaming-tags" 
href="#Modifying-tags">4.7 Deleting, moving, and renaming tags</a></li>
+    <li><a name="toc-Tagging-and-adding-and-removing-files" 
href="#Tagging-add_002fremove">4.8 Tagging and adding and removing 
files</a></li>
+    <li><a name="toc-Sticky-tags-1" href="#Sticky-tags">4.9 Sticky 
tags</a></li>
+  </ul></li>
+  <li><a name="toc-Branching-and-merging-1" href="#Branching-and-merging">5 
Branching and merging</a>
+  <ul class="no-bullet">
+    <li><a name="toc-What-branches-are-good-for" 
href="#Branches-motivation">5.1 What branches are good for</a></li>
+    <li><a name="toc-Creating-a-branch-1" href="#Creating-a-branch">5.2 
Creating a branch</a></li>
+    <li><a name="toc-Accessing-branches-1" href="#Accessing-branches">5.3 
Accessing branches</a></li>
+    <li><a name="toc-Branches-and-revisions-1" 
href="#Branches-and-revisions">5.4 Branches and revisions</a></li>
+    <li><a name="toc-Magic-branch-numbers-1" href="#Magic-branch-numbers">5.5 
Magic branch numbers</a></li>
+    <li><a name="toc-Merging-an-entire-branch" href="#Merging-a-branch">5.6 
Merging an entire branch</a></li>
+    <li><a name="toc-Merging-from-a-branch-several-times" 
href="#Merging-more-than-once">5.7 Merging from a branch several times</a></li>
+    <li><a name="toc-Merging-differences-between-any-two-revisions" 
href="#Merging-two-revisions">5.8 Merging differences between any two 
revisions</a></li>
+    <li><a name="toc-Merging-can-add-or-remove-files" 
href="#Merging-adds-and-removals">5.9 Merging can add or remove files</a></li>
+    <li><a name="toc-Merging-and-keywords-1" href="#Merging-and-keywords">5.10 
Merging and keywords</a></li>
+  </ul></li>
+  <li><a name="toc-Recursive-behavior-1" href="#Recursive-behavior">6 
Recursive behavior</a></li>
+  <li><a 
name="toc-Adding_002c-removing_002c-and-renaming-files-and-directories" 
href="#Adding-and-removing">7 Adding, removing, and renaming files and 
directories</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Adding-files-to-a-directory" href="#Adding-files">7.1 
Adding files to a directory</a></li>
+    <li><a name="toc-Removing-files-1" href="#Removing-files">7.2 Removing 
files</a></li>
+    <li><a name="toc-Removing-directories-1" href="#Removing-directories">7.3 
Removing directories</a></li>
+    <li><a name="toc-Moving-and-renaming-files" href="#Moving-files">7.4 
Moving and renaming files</a>
+    <ul class="no-bullet">
+      <li><a name="toc-The-Normal-way-to-Rename" href="#Outside">7.4.1 The 
Normal way to Rename</a></li>
+      <li><a name="toc-Moving-the-history-file" href="#Inside">7.4.2 Moving 
the history file</a></li>
+      <li><a name="toc-Copying-the-history-file" 
href="#Rename-by-copying">7.4.3 Copying the history file</a></li>
+    </ul></li>
+    <li><a name="toc-Moving-and-renaming-directories" 
href="#Moving-directories">7.5 Moving and renaming directories</a></li>
+  </ul></li>
+  <li><a name="toc-History-browsing-1" href="#History-browsing">8 History 
browsing</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Log-messages" href="#log-messages">8.1 Log 
messages</a></li>
+    <li><a name="toc-The-history-database" href="#history-database">8.2 The 
history database</a></li>
+    <li><a name="toc-User_002ddefined-logging" 
href="#user_002ddefined-logging">8.3 User-defined logging</a></li>
+  </ul></li>
+  <li><a name="toc-Handling-binary-files" href="#Binary-files">9 Handling 
binary files</a>
+  <ul class="no-bullet">
+    <li><a name="toc-The-issues-with-binary-files" href="#Binary-why">9.1 The 
issues with binary files</a></li>
+    <li><a name="toc-How-to-store-binary-files" href="#Binary-howto">9.2 How 
to store binary files</a></li>
+  </ul></li>
+  <li><a name="toc-Multiple-developers-1" href="#Multiple-developers">10 
Multiple developers</a>
+  <ul class="no-bullet">
+    <li><a name="toc-File-status-1" href="#File-status">10.1 File 
status</a></li>
+    <li><a name="toc-Bringing-a-file-up-to-date" href="#Updating-a-file">10.2 
Bringing a file up to date</a></li>
+    <li><a name="toc-Conflicts-example-1" href="#Conflicts-example">10.3 
Conflicts example</a></li>
+    <li><a name="toc-Informing-others-about-commits" 
href="#Informing-others">10.4 Informing others about commits</a></li>
+    <li><a name="toc-Several-developers-simultaneously-attempting-to-run-CVS" 
href="#Concurrency">10.5 Several developers simultaneously attempting to run 
CVS</a></li>
+    <li><a name="toc-Mechanisms-to-track-who-is-editing-files" 
href="#Watches">10.6 Mechanisms to track who is editing files</a>
+    <ul class="no-bullet">
+      <li><a name="toc-Telling-CVS-to-watch-certain-files" 
href="#Setting-a-watch">10.6.1 Telling CVS to watch certain files</a></li>
+      <li><a name="toc-Telling-CVS-to-notify-you" 
href="#Getting-Notified">10.6.2 Telling CVS to notify you</a></li>
+      <li><a name="toc-How-to-edit-a-file-which-is-being-watched" 
href="#Editing-files">10.6.3 How to edit a file which is being watched</a></li>
+      <li><a name="toc-Information-about-who-is-watching-and-editing" 
href="#Watch-information">10.6.4 Information about who is watching and 
editing</a></li>
+      <li><a name="toc-Using-watches-with-old-versions-of-CVS" 
href="#Watches-Compatibility">10.6.5 Using watches with old versions of 
CVS</a></li>
+    </ul></li>
+    <li><a name="toc-Choosing-between-reserved-or-unreserved-checkouts" 
href="#Choosing-a-model">10.7 Choosing between reserved or unreserved 
checkouts</a></li>
+  </ul></li>
+  <li><a name="toc-Revision-management-1" href="#Revision-management">11 
Revision management</a>
+  <ul class="no-bullet">
+    <li><a name="toc-When-to-commit_003f" href="#When-to-commit">11.1 When to 
commit?</a></li>
+  </ul></li>
+  <li><a name="toc-Keyword-substitution-1" href="#Keyword-substitution">12 
Keyword substitution</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Keyword-List" href="#Keyword-list">12.1 Keyword 
List</a></li>
+    <li><a name="toc-Using-keywords-1" href="#Using-keywords">12.2 Using 
keywords</a></li>
+    <li><a name="toc-Avoiding-substitution-1" 
href="#Avoiding-substitution">12.3 Avoiding substitution</a></li>
+    <li><a name="toc-Substitution-modes-1" href="#Substitution-modes">12.4 
Substitution modes</a></li>
+    <li><a name="toc-Problems-with-the-_0024Log_0024-keyword_002e" 
href="#Log-keyword">12.5 Problems with the $<i></i>Log$ keyword.</a></li>
+  </ul></li>
+  <li><a name="toc-Tracking-third_002dparty-sources" 
href="#Tracking-sources">13 Tracking third-party sources</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Importing-for-the-first-time" href="#First-import">13.1 
Importing for the first time</a></li>
+    <li><a name="toc-Updating-with-the-import-command" 
href="#Update-imports">13.2 Updating with the import command</a></li>
+    <li><a name="toc-Reverting-to-the-latest-vendor-release" 
href="#Reverting-local-changes">13.3 Reverting to the latest vendor 
release</a></li>
+    <li><a name="toc-How-to-handle-binary-files-with-cvs-import" 
href="#Binary-files-in-imports">13.4 How to handle binary files with cvs 
import</a></li>
+    <li><a name="toc-How-to-handle-keyword-substitution-with-cvs-import" 
href="#Keywords-in-imports">13.5 How to handle keyword substitution with cvs 
import</a></li>
+    <li><a name="toc-Multiple-vendor-branches-1" 
href="#Multiple-vendor-branches">13.6 Multiple vendor branches</a></li>
+  </ul></li>
+  <li><a name="toc-How-your-build-system-interacts-with-CVS" href="#Builds">14 
How your build system interacts with CVS</a></li>
+  <li><a name="toc-Special-Files-1" href="#Special-Files">15 Special 
Files</a></li>
+  <li><a name="toc-Guide-to-CVS-commands" href="#CVS-commands">Appendix A 
Guide to CVS commands</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Overall-structure-of-CVS-commands" href="#Structure">A.1 
Overall structure of CVS commands</a></li>
+    <li><a name="toc-CVS_0027s-exit-status" href="#Exit-status">A.2 
CVS&rsquo;s exit status</a></li>
+    <li><a name="toc-Default-options-and-the-_007e_002f_002ecvsrc-file" 
href="#g_t_007e_002f_002ecvsrc">A.3 Default options and the ~/.cvsrc 
file</a></li>
+    <li><a name="toc-Global-options-1" href="#Global-options">A.4 Global 
options</a></li>
+    <li><a name="toc-Common-command-options" href="#Common-options">A.5 Common 
command options</a></li>
+    <li><a 
name="toc-add_002d_002d_002dAdd-files-and-directories-to-the-repository" 
href="#add">A.6 add&mdash;Add files and directories to the repository</a>
+    <ul class="no-bullet">
+      <li><a name="toc-add-options-1" href="#add-options">A.6.1 add 
options</a></li>
+      <li><a name="toc-add-examples-1" href="#add-examples">A.6.2 add 
examples</a>
+      <ul class="no-bullet">
+        <li><a name="toc-Adding-a-directory" 
href="#Adding-a-directory">A.6.2.1 Adding a directory</a></li>
+        <li><a name="toc-Adding-a-file" href="#Adding-a-file">A.6.2.2 Adding a 
file</a></li>
+        <li><a name="toc-Undoing-a-remove-command" 
href="#Undoing-a-remove-command">A.6.2.3 Undoing a <code>remove</code> 
command</a></li>
+      </ul></li>
+    </ul></li>
+    <li><a name="toc-admin_002d_002d_002dAdministration" href="#admin">A.7 
admin&mdash;Administration</a>
+    <ul class="no-bullet">
+      <li><a name="toc-admin-options-1" href="#admin-options">A.7.1 admin 
options</a></li>
+    </ul></li>
+    <li><a 
name="toc-annotate_002d_002d_002dWhat-revision-modified-each-line-of-a-file_003f"
 href="#annotate">A.8 annotate&mdash;What revision modified each line of a 
file?</a>
+    <ul class="no-bullet">
+      <li><a name="toc-annotate-options-1" href="#annotate-options">A.8.1 
annotate options</a></li>
+      <li><a name="toc-annotate-example-1" href="#annotate-example">A.8.2 
annotate example</a></li>
+    </ul></li>
+    <li><a name="toc-checkout_002d_002d_002dCheck-out-sources-for-editing" 
href="#checkout">A.9 checkout&mdash;Check out sources for editing</a>
+    <ul class="no-bullet">
+      <li><a name="toc-checkout-options-1" href="#checkout-options">A.9.1 
checkout options</a></li>
+      <li><a name="toc-checkout-examples-1" href="#checkout-examples">A.9.2 
checkout examples</a></li>
+    </ul></li>
+    <li><a name="toc-commit_002d_002d_002dCheck-files-into-the-repository" 
href="#commit">A.10 commit&mdash;Check files into the repository</a>
+    <ul class="no-bullet">
+      <li><a name="toc-commit-options-1" href="#commit-options">A.10.1 commit 
options</a></li>
+      <li><a name="toc-commit-examples-1" href="#commit-examples">A.10.2 
commit examples</a>
+      <ul class="no-bullet">
+        <li><a name="toc-Committing-to-a-branch" 
href="#Committing-to-a-branch">A.10.2.1 Committing to a branch</a></li>
+        <li><a name="toc-Creating-the-branch-after-editing" 
href="#Creating-the-branch-after-editing">A.10.2.2 Creating the branch after 
editing</a></li>
+      </ul></li>
+    </ul></li>
+    <li><a name="toc-diff_002d_002d_002dShow-differences-between-revisions" 
href="#diff">A.11 diff&mdash;Show differences between revisions</a>
+    <ul class="no-bullet">
+      <li><a name="toc-diff-options-1" href="#diff-options">A.11.1 diff 
options</a>
+      <ul class="no-bullet">
+        <li><a name="toc-Line-group-formats-1" 
href="#Line-group-formats">A.11.1.1 Line group formats</a></li>
+        <li><a name="toc-Line-formats-1" href="#Line-formats">A.11.1.2 Line 
formats</a></li>
+      </ul></li>
+      <li><a name="toc-diff-examples-1" href="#diff-examples">A.11.2 diff 
examples</a></li>
+    </ul></li>
+    <li><a 
name="toc-export_002d_002d_002dExport-sources-from-CVS_002c-similar-to-checkout"
 href="#export">A.12 export&mdash;Export sources from CVS, similar to 
checkout</a>
+    <ul class="no-bullet">
+      <li><a name="toc-export-options-1" href="#export-options">A.12.1 export 
options</a></li>
+    </ul></li>
+    <li><a name="toc-history_002d_002d_002dShow-status-of-files-and-users" 
href="#history">A.13 history&mdash;Show status of files and users</a>
+    <ul class="no-bullet">
+      <li><a name="toc-history-options-1" href="#history-options">A.13.1 
history options</a></li>
+    </ul></li>
+    <li><a 
name="toc-import_002d_002d_002dImport-sources-into-CVS_002c-using-vendor-branches"
 href="#import">A.14 import&mdash;Import sources into CVS, using vendor 
branches</a>
+    <ul class="no-bullet">
+      <li><a name="toc-import-options-1" href="#import-options">A.14.1 import 
options</a></li>
+      <li><a name="toc-import-output-1" href="#import-output">A.14.2 import 
output</a></li>
+      <li><a name="toc-import-examples-1" href="#import-examples">A.14.3 
import examples</a></li>
+    </ul></li>
+    <li><a name="toc-log_002d_002d_002dPrint-out-log-information-for-files" 
href="#log">A.15 log&mdash;Print out log information for files</a>
+    <ul class="no-bullet">
+      <li><a name="toc-log-options-1" href="#log-options">A.15.1 log 
options</a></li>
+      <li><a name="toc-log-examples-1" href="#log-examples">A.15.2 log 
examples</a></li>
+    </ul></li>
+    <li><a 
name="toc-rdiff_002d_002d_002d_0027patch_0027-format-diffs-between-releases" 
href="#rdiff">A.16 rdiff&mdash;&rsquo;patch&rsquo; format diffs between 
releases</a>
+    <ul class="no-bullet">
+      <li><a name="toc-rdiff-options-1" href="#rdiff-options">A.16.1 rdiff 
options</a></li>
+      <li><a name="toc-rdiff-examples-1" href="#rdiff-examples">A.16.2 rdiff 
examples</a></li>
+    </ul></li>
+    <li><a 
name="toc-release_002d_002d_002dIndicate-that-a-Module-is-no-longer-in-use" 
href="#release">A.17 release&mdash;Indicate that a Module is no longer in 
use</a>
+    <ul class="no-bullet">
+      <li><a name="toc-release-options-1" href="#release-options">A.17.1 
release options</a></li>
+      <li><a name="toc-release-output-1" href="#release-output">A.17.2 release 
output</a></li>
+      <li><a name="toc-release-examples-1" href="#release-examples">A.17.3 
release examples</a></li>
+    </ul></li>
+    <li><a name="toc-remove_002d_002d_002dRemove-files-from-active-use" 
href="#remove">A.18 remove&mdash;Remove files from active use</a>
+    <ul class="no-bullet">
+      <li><a name="toc-remove-options-1" href="#remove-options">A.18.1 remove 
options</a></li>
+      <li><a name="toc-remove-examples-1" href="#remove-examples">A.18.2 
remove examples</a>
+      <ul class="no-bullet">
+        <li><a name="toc-Removing-a-file" href="#Removing-a-file">A.18.2.1 
Removing a file</a></li>
+        <li><a name="toc-Removing-entire-directories" 
href="#Removing-entire-directories">A.18.2.2 Removing entire 
directories</a></li>
+      </ul></li>
+    </ul></li>
+    <li><a 
name="toc-update_002d_002d_002dBring-work-tree-in-sync-with-repository" 
href="#update">A.19 update&mdash;Bring work tree in sync with repository</a>
+    <ul class="no-bullet">
+      <li><a name="toc-update-options-1" href="#update-options">A.19.1 update 
options</a></li>
+      <li><a name="toc-update-output-1" href="#update-output">A.19.2 update 
output</a></li>
+    </ul></li>
+  </ul></li>
+  <li><a name="toc-Quick-reference-to-CVS-commands" 
href="#Invoking-CVS">Appendix B Quick reference to CVS commands</a></li>
+  <li><a name="toc-Reference-manual-for-Administrative-files" 
href="#Administrative-files">Appendix C Reference manual for Administrative 
files</a>
+  <ul class="no-bullet">
+    <li><a name="toc-The-modules-file" href="#modules">C.1 The modules file</a>
+    <ul class="no-bullet">
+      <li><a name="toc-Alias-modules-1" href="#Alias-modules">C.1.1 Alias 
modules</a></li>
+      <li><a name="toc-Regular-modules-1" href="#Regular-modules">C.1.2 
Regular modules</a></li>
+      <li><a name="toc-Ampersand-modules-1" href="#Ampersand-modules">C.1.3 
Ampersand modules</a></li>
+      <li><a name="toc-Excluding-directories-1" 
href="#Excluding-directories">C.1.4 Excluding directories</a></li>
+      <li><a name="toc-Module-options-1" href="#Module-options">C.1.5 Module 
options</a></li>
+      <li><a 
name="toc-How-the-modules-file-_0060_0060program-options_0027_0027-programs-are-run"
 href="#Module-program-options">C.1.6 How the modules file &ldquo;program 
options&rdquo; programs are run</a></li>
+    </ul></li>
+    <li><a name="toc-The-cvswrappers-file" href="#Wrappers">C.2 The 
cvswrappers file</a></li>
+    <li><a name="toc-The-Trigger-Scripts" href="#Trigger-Scripts">C.3 The 
Trigger Scripts</a>
+    <ul class="no-bullet">
+      <li><a name="toc-The-common-syntax" href="#syntax">C.3.1 The common 
syntax</a></li>
+      <li><a name="toc-Security-and-the-Trigger-Scripts" 
href="#Trigger-Script-Security">C.3.2 Security and the Trigger Scripts</a></li>
+    </ul></li>
+    <li><a name="toc-The-commit-support-files" href="#commit-files">C.4 The 
commit support files</a>
+    <ul class="no-bullet">
+      <li><a name="toc-Commitinfo" href="#commitinfo">C.4.1 Commitinfo</a></li>
+      <li><a name="toc-Verifying-log-messages" href="#verifymsg">C.4.2 
Verifying log messages</a></li>
+      <li><a name="toc-Editinfo" href="#editinfo">C.4.3 Editinfo</a>
+      <ul class="no-bullet">
+        <li><a name="toc-Editinfo-example" href="#editinfo-example">C.4.3.1 
Editinfo example</a></li>
+      </ul></li>
+      <li><a name="toc-Loginfo" href="#loginfo">C.4.4 Loginfo</a>
+      <ul class="no-bullet">
+        <li><a name="toc-Loginfo-example" href="#loginfo-example">C.4.4.1 
Loginfo example</a></li>
+        <li><a name="toc-Keeping-a-checked-out-copy-1" 
href="#Keeping-a-checked-out-copy">C.4.4.2 Keeping a checked out copy</a></li>
+      </ul></li>
+    </ul></li>
+    <li><a name="toc-Rcsinfo" href="#rcsinfo">C.5 Rcsinfo</a></li>
+    <li><a name="toc-Taginfo" href="#taginfo">C.6 Taginfo</a></li>
+    <li><a name="toc-Ignoring-files-via-cvsignore" href="#cvsignore">C.7 
Ignoring files via cvsignore</a></li>
+    <li><a name="toc-The-checkoutlist-file" href="#checkoutlist">C.8 The 
checkoutlist file</a></li>
+    <li><a name="toc-The-history-file" href="#history-file">C.9 The history 
file</a></li>
+    <li><a name="toc-Expansions-in-administrative-files" 
href="#Variables">C.10 Expansions in administrative files</a></li>
+    <li><a name="toc-The-CVSROOT_002fconfig-configuration-file" 
href="#config">C.11 The CVSROOT/config configuration file</a></li>
+  </ul></li>
+  <li><a name="toc-All-environment-variables-which-affect-CVS" 
href="#Environment-variables">Appendix D All environment variables which affect 
CVS</a></li>
+  <li><a name="toc-Compatibility-between-CVS-Versions" 
href="#Compatibility">Appendix E Compatibility between CVS Versions</a></li>
+  <li><a name="toc-Troubleshooting-1" href="#Troubleshooting">Appendix F 
Troubleshooting</a>
+  <ul class="no-bullet">
+    <li><a name="toc-Partial-list-of-error-messages" 
href="#Error-messages">F.1 Partial list of error messages</a></li>
+    <li><a name="toc-Trouble-making-a-connection-to-a-CVS-server" 
href="#Connection">F.2 Trouble making a connection to a CVS server</a></li>
+    <li><a name="toc-Other-common-problems" href="#Other-problems">F.3 Other 
common problems</a></li>
+  </ul></li>
+  <li><a name="toc-Credits-1" href="#Credits">Appendix G Credits</a></li>
+  <li><a name="toc-Dealing-with-bugs-in-CVS-or-this-manual" 
href="#BUGS">Appendix H Dealing with bugs in CVS or this manual</a></li>
+  <li><a name="toc-Index-1" href="#Index">Index</a></li>
+</ul>
+</div>
+
+
+
+<a name="Top"></a>
+<div class="header">
+<p>
+Next: <a href="#Overview" accesskey="n" rel="next">Overview</a>, Up: <a 
href="dir.html#Top" accesskey="u" rel="up">(dir)</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="SEC_Top"></a>
+
+<p>This info manual describes how to use and administer
+<small>CVS</small> version 1.11.23.
+</p>
+
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Overview" 
accesskey="1">Overview</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">An introduction to CVS
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Repository" 
accesskey="2">Repository</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Where all your sources are stored
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Starting-a-new-project" 
accesskey="3">Starting a new project</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Starting a project with CVS
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Revisions" 
accesskey="4">Revisions</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Numeric and symbolic names for revisions
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Branching-and-merging" 
accesskey="5">Branching and merging</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Diverging/rejoining branches of development
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Recursive-behavior" 
accesskey="6">Recursive behavior</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">CVS descends directories
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Adding-and-removing" 
accesskey="7">Adding and removing</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Adding/removing/renaming files/directories
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#History-browsing" 
accesskey="8">History browsing</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Viewing the history of files in various ways
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+CVS and the Real World.
+&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&ndash;
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a 
href="#Binary-files" accesskey="9">Binary 
files</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">CVS can 
handle binary files
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#Multiple-developers">Multiple 
developers</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">How CVS 
helps a group of developers
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#Revision-management">Revision 
management</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Policy 
questions for revision management
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#Keyword-substitution">Keyword 
substitution</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">CVS 
can include the revision inside the file
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Tracking-sources">Tracking 
sources</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Tracking 
third-party sources
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#Builds">Builds</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Issues related to CVS and builds
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Special-Files">Special 
Files</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Devices, 
links and other non-regular files
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+References.
+&mdash;&mdash;&mdash;&ndash;
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a 
href="#CVS-commands">CVS commands</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">CVS commands share some things
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Invoking-CVS">Invoking 
CVS</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Quick reference 
to CVS commands
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#Administrative-files">Administrative 
files</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Reference 
manual for the Administrative files
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#Environment-variables">Environment 
variables</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">All 
environment variables which affect CVS
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#Compatibility">Compatibility</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Upgrading CVS versions
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#Troubleshooting">Troubleshooting</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Some tips when nothing works
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#Credits">Credits</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Some of the contributors to this manual
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#BUGS">BUGS</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Dealing with bugs in CVS or this manual
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#Index">Index</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Index
+</td></tr>
+</table>
+
+<hr>
+<a name="Overview"></a>
+<div class="header">
+<p>
+Next: <a href="#Repository" accesskey="n" rel="next">Repository</a>, Previous: 
<a href="#Top" accesskey="p" rel="prev">Top</a>, Up: <a href="#Top" 
accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of 
contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Overview-1"></a>
+<h2 class="chapter">1 Overview</h2>
+<a name="index-Overview"></a>
+
+<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>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#What-is-CVS_003f" 
accesskey="1">What is CVS?</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">What you can do with <small>CVS</small>
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#What-is-CVS-not_003f" 
accesskey="2">What is CVS not?</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Problems <small>CVS</small> doesn&rsquo;t try to solve
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#A-sample-session" 
accesskey="3">A sample session</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">A tour of basic <small>CVS</small> usage
+</td></tr>
+</table>
+
+<hr>
+<a name="What-is-CVS_003f"></a>
+<div class="header">
+<p>
+Next: <a href="#What-is-CVS-not_003f" accesskey="n" rel="next">What is CVS 
not?</a>, Up: <a href="#Overview" accesskey="u" rel="up">Overview</a> &nbsp; 
[<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="What-is-CVS_003f-1"></a>
+<h3 class="section">1.1 What is CVS?</h3>
+<a name="index-What-is-CVS_003f"></a>
+<a name="index-Introduction-to-CVS"></a>
+<a name="index-CVS_002c-introduction-to"></a>
+
+<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
+two people never modify the same file 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>
+<a name="index-History-of-CVS"></a>
+<a name="index-CVS_002c-history-of"></a>
+<a name="index-Credits-_0028CVS-program_0029"></a>
+<a name="index-Contributors-_0028CVS-program_0029"></a>
+<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>
+<a name="index-Source_002c-getting-CVS-source"></a>
+<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>
+<div class="example">
+<pre class="example"><a 
href="http://cvs.nongnu.org/";>http://cvs.nongnu.org/</a>
+</pre></div>
+
+<a name="index-Mailing-list"></a>
+<a name="index-List_002c-mailing-list"></a>
+<a name="index-Newsgroups"></a>
+<p>There is a mailing list, known as <a 
href="mailto:address@hidden";>address@hidden</a>,
+devoted to <small>CVS</small>.  To subscribe or
+unsubscribe
+write to
+<a href="mailto:address@hidden";>address@hidden</a>.
+If you prefer a Usenet group, there is a one-way mirror (posts to the email
+list are usually sent to the news group, but not vice versa) of
+<a href="mailto:address@hidden";>address@hidden</a> at <a 
href="news:gnu.cvs.help";>news:gnu.cvs.help</a>.  The right
+Usenet group for posts is <a 
href="news:comp.software.config-mgmt";>news:comp.software.config-mgmt</a> 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
+<a href="news:comp.software.config-mgmt";>news:comp.software.config-mgmt</a>.
+</p>
+<p>You can also subscribe to the <a 
href="mailto:address@hidden";>address@hidden</a> mailing list,
+described in more detail in <a href="#BUGS">BUGS</a>.  To subscribe
+send mail to <a href="mailto:address@hidden";>address@hidden</a>.  There is a 
two-way
+Usenet mirror (posts to the Usenet group are usually sent to the email list and
+vice versa) of <a href="mailto:address@hidden";>address@hidden</a> named <a 
href="news:gnu.cvs.bug";>news:gnu.cvs.bug</a>.
+</p>
+<hr>
+<a name="What-is-CVS-not_003f"></a>
+<div class="header">
+<p>
+Next: <a href="#A-sample-session" accesskey="n" rel="next">A sample 
session</a>, Previous: <a href="#What-is-CVS_003f" accesskey="p" 
rel="prev">What is CVS?</a>, Up: <a href="#Overview" accesskey="u" 
rel="up">Overview</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="What-is-CVS-not_003f-1"></a>
+<h3 class="section">1.2 What is CVS not?</h3>
+<a name="index-What-is-CVS-not_003f"></a>
+
+<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. <samp>Makefile</samp>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
+<samp>Makefile</samp>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 <samp>Makefile</samp>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, <samp>Makefile</samp>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 <a href="#Builds">Builds</a>, 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 <samp>A</samp>.  At the same time,
+someone edits file <samp>B</samp>, 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
+<samp>rcsinfo</samp> and <samp>verifymsg</samp> files
+(see <a href="#Administrative-files">Administrative files</a>).
+</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 <samp>ChangeLog</samp>
+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
+test suite 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 built-in 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 <samp>commitinfo</samp>,
+<samp>loginfo</samp>, <samp>rcsinfo</samp>, or <samp>verifymsg</samp>
+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>
+<a name="A-sample-session"></a>
+<div class="header">
+<p>
+Previous: <a href="#What-is-CVS-not_003f" accesskey="p" rel="prev">What is CVS 
not?</a>, Up: <a href="#Overview" accesskey="u" rel="up">Overview</a> &nbsp; 
[<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="A-sample-session-1"></a>
+<h3 class="section">1.3 A sample session</h3>
+<a name="index-Example-of-a-work_002dsession"></a>
+<a name="index-Getting-started"></a>
+<a name="index-Work_002dsession_002c-example-of"></a>
+<a name="index-tc_002c-Trivial-Compiler-_0028example_0029"></a>
+<a name="index-Trivial-Compiler-_0028example_0029"></a>
+
+
+<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 <a href="#Repository">Repository</a>); 
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 <samp>Makefile</samp>.
+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>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Getting-the-source" 
accesskey="1">Getting the source</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Creating a workspace
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Committing-your-changes" 
accesskey="2">Committing your changes</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Making your work available to others
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Cleaning-up" 
accesskey="3">Cleaning up</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Cleaning up
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Viewing-differences" 
accesskey="4">Viewing differences</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Viewing differences
+</td></tr>
+</table>
+
+<hr>
+<a name="Getting-the-source"></a>
+<div class="header">
+<p>
+Next: <a href="#Committing-your-changes" accesskey="n" rel="next">Committing 
your changes</a>, Up: <a href="#A-sample-session" accesskey="u" rel="up">A 
sample session</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Getting-the-source-1"></a>
+<h4 class="subsection">1.3.1 Getting the source</h4>
+<a name="index-Getting-the-source"></a>
+<a name="index-Checking-out-source"></a>
+<a name="index-Fetching-source"></a>
+<a name="index-Source_002c-getting-from-CVS"></a>
+<a name="index-Checkout_002c-example"></a>
+
+<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>
+<div class="example">
+<pre class="example">$ cvs checkout tc
+</pre></div>
+
+<p>This will create a new directory called <samp>tc</samp> and populate it with
+the source files.
+</p>
+<div class="example">
+<pre class="example">$ cd tc
+$ ls
+CVS         Makefile    backend.c   driver.c    frontend.c  parser.c
+</pre></div>
+
+<p>The <samp>CVS</samp> 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 <samp>backend.c</samp>, 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 <a href="#Multiple-developers">Multiple developers</a>, 
for an explanation.
+</p>
+<hr>
+<a name="Committing-your-changes"></a>
+<div class="header">
+<p>
+Next: <a href="#Cleaning-up" accesskey="n" rel="next">Cleaning up</a>, 
Previous: <a href="#Getting-the-source" accesskey="p" rel="prev">Getting the 
source</a>, Up: <a href="#A-sample-session" accesskey="u" rel="up">A sample 
session</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Committing-your-changes-1"></a>
+<h4 class="subsection">1.3.2 Committing your changes</h4>
+<a name="index-Committing-changes-to-files"></a>
+<a name="index-Log-message-entry"></a>
+
+<p>When you have checked that the compiler is still compilable you decide
+to make a new version of <samp>backend.c</samp>.  This will
+store your new <samp>backend.c</samp> in the repository and
+make it available to anyone else who is using that same
+repository.
+</p>
+<div class="example">
+<pre class="example">$ cvs commit backend.c
+</pre></div>
+
+<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>
+<a name="index-CVSEDITOR_002c-environment-variable"></a>
+<a name="index-EDITOR_002c-environment-variable"></a>
+<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>
+<a name="index-VISUAL_002c-environment-variable"></a>
+<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>
+<div class="example">
+<pre class="example">$ cvs commit -m &quot;Added an optimization pass&quot; 
backend.c
+</pre></div>
+
+<hr>
+<a name="Cleaning-up"></a>
+<div class="header">
+<p>
+Next: <a href="#Viewing-differences" accesskey="n" rel="next">Viewing 
differences</a>, Previous: <a href="#Committing-your-changes" accesskey="p" 
rel="prev">Committing your changes</a>, Up: <a href="#A-sample-session" 
accesskey="u" rel="up">A sample session</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Cleaning-up-1"></a>
+<h4 class="subsection">1.3.3 Cleaning up</h4>
+<a name="index-Cleaning-up"></a>
+<a name="index-Working-copy_002c-removing"></a>
+<a name="index-Removing-your-working-copy"></a>
+<a name="index-Releasing-your-working-copy"></a>
+
+<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>
+<div class="example">
+<pre class="example">$ cd ..
+$ rm -r tc
+</pre></div>
+
+<p>but a better way is to use the <code>release</code> command (see <a 
href="#release">release</a>):
+</p>
+<div class="example">
+<pre class="example">$ cd ..
+$ cvs release -d tc
+M driver.c
+? tc
+You have [1] altered files in this repository.
+Are you sure you want to release (and delete) directory `tc': n
+** `release' aborted by user choice.
+</pre></div>
+
+<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 <a href="#history-file">history file</a>.
+</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 
<samp>tc</samp> is unknown to <small>CVS</small>.
+That is nothing to worry about: <samp>tc</samp> is the executable compiler,
+and it should not be stored in the repository.  See <a 
href="#cvsignore">cvsignore</a>,
+for information about how to make that warning go away.
+See <a href="#release-output">release output</a>, 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 <samp>driver.c</samp> 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 <span 
class="key">RET</span></kbd>
+when <code>release</code> asks for confirmation.
+</p>
+<hr>
+<a name="Viewing-differences"></a>
+<div class="header">
+<p>
+Previous: <a href="#Cleaning-up" accesskey="p" rel="prev">Cleaning up</a>, Up: 
<a href="#A-sample-session" accesskey="u" rel="up">A sample session</a> &nbsp; 
[<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Viewing-differences-1"></a>
+<h4 class="subsection">1.3.4 Viewing differences</h4>
+<a name="index-Viewing-differences"></a>
+<a name="index-Diff"></a>
+
+<p>You do not remember modifying <samp>driver.c</samp>, so you want to see what
+has happened to that file.
+</p>
+<div class="example">
+<pre class="example">$ cd tc
+$ cvs diff driver.c
+</pre></div>
+
+<p>This command runs <code>diff</code> to compare the version of 
<samp>driver.c</samp>
+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>
+<div class="example">
+<pre class="example">$ 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
+</pre></div>
+
+<hr>
+<a name="Repository"></a>
+<div class="header">
+<p>
+Next: <a href="#Starting-a-new-project" accesskey="n" rel="next">Starting a 
new project</a>, Previous: <a href="#Overview" accesskey="p" 
rel="prev">Overview</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="The-Repository"></a>
+<h2 class="chapter">2 The Repository</h2>
+<a name="index-Repository-_0028intro_0029"></a>
+<a name="index-Repository_002c-example"></a>
+<a name="index-Layout-of-repository"></a>
+<a name="index-Typical-repository"></a>
+<a name="index-_002fusr_002flocal_002fcvsroot_002c-as-example-repository"></a>
+<a name="index-cvsroot"></a>
+
+<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>
+<a name="index-_003alocal_003a_002c-setting-up"></a>
+<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 <samp>/usr/local/cvsroot</samp> on the
+computer running <small>CVS</small>.  For information on other
+access methods, see <a href="#Remote-repositories">Remote repositories</a>.
+</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
+<samp>/usr/local/cvsroot</samp>, 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
+<samp>c:\src\cvsroot</samp>, then you must specify the access
+method, as in <code>:local:c:/src/cvsroot</code>.
+</p>
+<p>The repository is split in two parts.  <samp>$CVSROOT/CVSROOT</samp> 
contains
+administrative files for <small>CVS</small>.  The other directories contain 
the actual
+user-defined modules.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Specifying-a-repository" 
accesskey="1">Specifying a repository</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Telling CVS where your repository is
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Repository-storage" 
accesskey="2">Repository storage</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">The structure of the repository
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Working-directory-storage" 
accesskey="3">Working directory storage</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">The structure of working directories
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Intro-administrative-files" 
accesskey="4">Intro administrative files</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Defining modules
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Multiple-repositories" 
accesskey="5">Multiple repositories</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Multiple repositories
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Creating-a-repository" 
accesskey="6">Creating a repository</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Creating a repository
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Backing-up" 
accesskey="7">Backing up</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Backing up a repository
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Moving-a-repository" 
accesskey="8">Moving a repository</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Moving a repository
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Remote-repositories" 
accesskey="9">Remote repositories</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Accessing repositories on remote machines
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#Read_002donly-access">Read-only access</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Granting read-only access to the repository
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#Server-temporary-directory">Server temporary 
directory</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">The 
server creates temporary directories
+</td></tr>
+</table>
+
+<hr>
+<a name="Specifying-a-repository"></a>
+<div class="header">
+<p>
+Next: <a href="#Repository-storage" accesskey="n" rel="next">Repository 
storage</a>, Up: <a href="#Repository" accesskey="u" rel="up">Repository</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Telling-CVS-where-your-repository-is"></a>
+<h3 class="section">2.1 Telling CVS where your repository is</h3>
+
+<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>
+<div class="example">
+<pre class="example">cvs -d /usr/local/cvsroot checkout yoyodyne/tc
+</pre></div>
+
+<a name="index-_002eprofile_002c-setting-CVSROOT-in"></a>
+<a name="index-_002ecshrc_002c-setting-CVSROOT-in"></a>
+<a name="index-_002etcshrc_002c-setting-CVSROOT-in"></a>
+<a name="index-_002ebashrc_002c-setting-CVSROOT-in"></a>
+<a name="index-CVSROOT_002c-environment-variable"></a>
+<p>Or you can set the <code>$CVSROOT</code> environment
+variable to an absolute path to the root of the
+repository, <samp>/usr/local/cvsroot</samp> in this example.
+To set <code>$CVSROOT</code>, <code>csh</code> and <code>tcsh</code>
+users should have this line in their <samp>.cshrc</samp> or
+<samp>.tcshrc</samp> files:
+</p>
+<div class="example">
+<pre class="example">setenv CVSROOT /usr/local/cvsroot
+</pre></div>
+
+<p><code>sh</code> and <code>bash</code> users should instead have these lines 
in their
+<samp>.profile</samp> or <samp>.bashrc</samp>:
+</p>
+<div class="example">
+<pre class="example">CVSROOT=/usr/local/cvsroot
+export CVSROOT
+</pre></div>
+
+<a name="index-Root-file_002c-in-CVS-directory"></a>
+<a name="index-CVS_002fRoot-file"></a>
+<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
+<samp>CVS/Root</samp> file in the working copy).
+</p>
+<p>The <code>-d</code> option and the <samp>CVS/Root</samp> file both
+override the <code>$CVSROOT</code> environment variable.  If
+<code>-d</code> option differs from <samp>CVS/Root</samp>, the
+former is used.  Of course, for proper operation they
+should be two ways of referring to the same repository.
+</p>
+<hr>
+<a name="Repository-storage"></a>
+<div class="header">
+<p>
+Next: <a href="#Working-directory-storage" accesskey="n" rel="next">Working 
directory storage</a>, Previous: <a href="#Specifying-a-repository" 
accesskey="p" rel="prev">Specifying a repository</a>, Up: <a href="#Repository" 
accesskey="u" rel="up">Repository</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="How-data-is-stored-in-the-repository"></a>
+<h3 class="section">2.2 How data is stored in the repository</h3>
+<a name="index-Repository_002c-how-data-is-stored"></a>
+
+<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 <a href="#Concurrency">Concurrency</a>) or you might need to deal with
+the file permissions appropriate for the repository.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Repository-files" 
accesskey="1">Repository files</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">What files are stored in the repository
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#File-permissions" 
accesskey="2">File permissions</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">File permissions
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Windows-permissions" 
accesskey="3">Windows permissions</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Issues specific to Windows
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Attic" 
accesskey="4">Attic</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Some files are stored in the Attic
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#CVS-in-repository" 
accesskey="5">CVS in repository</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Additional information in CVS directory
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Locks" 
accesskey="6">Locks</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">CVS locks control concurrent accesses
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#CVSROOT-storage" 
accesskey="7">CVSROOT storage</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">A few things about CVSROOT are different
+</td></tr>
+</table>
+
+<hr>
+<a name="Repository-files"></a>
+<div class="header">
+<p>
+Next: <a href="#File-permissions" accesskey="n" rel="next">File 
permissions</a>, Up: <a href="#Repository-storage" accesskey="u" 
rel="up">Repository storage</a> &nbsp; [<a href="#SEC_Contents" title="Table of 
contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Where-files-are-stored-within-the-repository"></a>
+<h4 class="subsection">2.2.1 Where files are stored within the repository</h4>
+
+
+<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>
+<div class="example">
+<pre class="example">/usr/local/cvsroot
+</pre></div>
+
+<p>here is a possible directory tree (showing only the
+directories):
+</p>
+<div class="example">
+<pre class="example"><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)
+</pre></div>
+
+<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 <samp>yoyodyne/tc</samp> directory might look like:
+</p><div class="example">
+<pre class="example">  <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>
+</pre></div>
+
+<a name="index-History-files"></a>
+<a name="index-RCS-history-files"></a>
+<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 <samp>doc/RCSFILES</samp> 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 <a 
href="#Magic-branch-numbers">Magic branch numbers</a>.  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 <a href="#Tags">Tags</a>.
+</p>
+<hr>
+<a name="File-permissions"></a>
+<div class="header">
+<p>
+Next: <a href="#Windows-permissions" accesskey="n" rel="next">Windows 
permissions</a>, Previous: <a href="#Repository-files" accesskey="p" 
rel="prev">Repository files</a>, Up: <a href="#Repository-storage" 
accesskey="u" rel="up">Repository storage</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="File-permissions-1"></a>
+<h4 class="subsection">2.2.2 File permissions</h4>
+<a name="index-Security_002c-file-permissions-in-repository"></a>
+<a name="index-File-permissions_002c-general"></a>
+<a name="index-Permissions_002c-general"></a>
+<a name="index-Group_002c-UNIX-file-permissions_002c-in-repository"></a>
+<a name="index-Read_002donly-files_002c-in-repository"></a>
+<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 <a href="#Concurrency">Concurrency</a>).  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 <a href="#config">config</a>).
+</p>
+<a 
name="index-CVSROOT_002fval_002dtags-file_002c-and-read_002donly-access-to-projects"></a>
+<a 
name="index-val_002dtags-file_002c-and-read_002donly-access-to-projects"></a>
+<p>Also note that users must have write access to the
+<samp>CVSROOT/val-tags</samp> 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>
+<a name="index-CVSUMASK_002c-environment-variable"></a>
+<a name="index-Umask_002c-for-repository-files"></a>
+<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, <a href="#Setting-a-watch">Setting a watch</a>; -r, <a 
href="#Global-options">Global options</a>; or <code>CVSREAD</code>, <a 
href="#Environment-variables">Environment variables</a>).
+</p>
+<p>Note that using the client/server <small>CVS</small>
+(see <a href="#Remote-repositories">Remote repositories</a>), 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 <samp>.bashrc</samp> or <samp>.cshrc</samp>, 
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 <a 
href="#Password-authentication-security">Password authentication security</a>.
+</p>
+<a name="index-Setuid"></a>
+<a name="index-Setgid"></a>
+<a name="index-Security_002c-setuid"></a>
+<a name="index-Installed-images-_0028VMS_0029"></a>
+<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
+(<a href="#Password-authentication-security">Password authentication 
security</a>).
+</p>
+<hr>
+<a name="Windows-permissions"></a>
+<div class="header">
+<p>
+Next: <a href="#Attic" accesskey="n" rel="next">Attic</a>, Previous: <a 
href="#File-permissions" accesskey="p" rel="prev">File permissions</a>, Up: <a 
href="#Repository-storage" accesskey="u" rel="up">Repository storage</a> &nbsp; 
[<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="File-Permission-issues-specific-to-Windows"></a>
+<h4 class="subsection">2.2.3 File Permission issues specific to Windows</h4>
+<a name="index-Windows_002c-and-permissions"></a>
+<a name="index-File-permissions_002c-Windows_002dspecific"></a>
+<a name="index-Permissions_002c-Windows_002dspecific"></a>
+
+<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
+<a href="#BUGS">BUGS</a>.
+</p>
+<hr>
+<a name="Attic"></a>
+<div class="header">
+<p>
+Next: <a href="#CVS-in-repository" accesskey="n" rel="next">CVS in 
repository</a>, Previous: <a href="#Windows-permissions" accesskey="p" 
rel="prev">Windows permissions</a>, Up: <a href="#Repository-storage" 
accesskey="u" rel="up">Repository storage</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="The-attic"></a>
+<h4 class="subsection">2.2.4 The attic</h4>
+<a name="index-Attic"></a>
+
+<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 <samp>/usr/local/cvsroot</samp> and we are
+talking about the file <samp>backend.c</samp> in the
+directory <samp>yoyodyne/tc</samp>, then the file normally
+would be in
+</p>
+<div class="example">
+<pre class="example">/usr/local/cvsroot/yoyodyne/tc/backend.c,v
+</pre></div>
+
+<p>but if it goes in the attic, it would be in
+</p>
+<div class="example">
+<pre class="example">/usr/local/cvsroot/yoyodyne/tc/Attic/backend.c,v
+</pre></div>
+
+<a name="index-Dead-state"></a>
+<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>
+<a name="CVS-in-repository"></a>
+<div class="header">
+<p>
+Next: <a href="#Locks" accesskey="n" rel="next">Locks</a>, Previous: <a 
href="#Attic" accesskey="p" rel="prev">Attic</a>, Up: <a 
href="#Repository-storage" accesskey="u" rel="up">Repository storage</a> &nbsp; 
[<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="The-CVS-directory-in-the-repository"></a>
+<h4 class="subsection">2.2.5 The CVS directory in the repository</h4>
+<a name="index-CVS-directory_002c-in-repository"></a>
+
+<p>The <samp>CVS</samp> directory in each repository directory
+contains information such as file attributes (in a file
+called <samp>CVS/fileattr</samp>.  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 <a href="#Watches-Compatibility">Watches 
Compatibility</a>.
+</p>
+<p>The format of the <samp>fileattr</samp> 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 line feeds 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>Built-in 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>
+<div class="example">
+<pre class="example">Ffile1 _watched=;_watchers=joe&gt;edit,mary&gt;commit
+Ffile2 _watched=;_editors=sue&gt;8 Jan 1975+workstn1+/home/sue/cvs
+D _watched=
+</pre></div>
+
+<p>means that the file <samp>file1</samp> should be checked out
+read-only.  Furthermore, joe is watching for edits and
+mary is watching for commits.  The file <samp>file2</samp>
+should be checked out read-only; sue started editing it
+on 8 Jan 1975 in the directory <samp>/home/sue/cvs</samp> 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>
+<a name="Locks"></a>
+<div class="header">
+<p>
+Next: <a href="#CVSROOT-storage" accesskey="n" rel="next">CVSROOT storage</a>, 
Previous: <a href="#CVS-in-repository" accesskey="p" rel="prev">CVS in 
repository</a>, Up: <a href="#Repository-storage" accesskey="u" 
rel="up">Repository storage</a> &nbsp; [<a href="#SEC_Contents" title="Table of 
contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="CVS-locks-in-the-repository"></a>
+<h4 class="subsection">2.2.6 CVS locks in the repository</h4>
+
+<a name="index-_0023cvs_002erfl_002c-technical-details"></a>
+<a name="index-_0023cvs_002ewfl_002c-technical-details"></a>
+<a name="index-_0023cvs_002elock_002c-technical-details"></a>
+<a name="index-Locks_002c-cvs_002c-technical-details"></a>
+<p>For an introduction to <small>CVS</small> locks focusing on
+user-visible behavior, see <a href="#Concurrency">Concurrency</a>.  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>
+<a name="index-_0023cvs_002etfl"></a>
+<p>Any file in the repository with a name starting
+with <samp>#cvs.rfl.</samp> is a read lock.  Any file in
+the repository with a name starting with
+<samp>#cvs.wfl</samp> is a write lock.  Old versions of <small>CVS</small>
+(before <small>CVS</small> 1.5) also created files with names starting
+with <samp>#cvs.tfl</samp>, but they are not discussed here.
+The directory <samp>#cvs.lock</samp> 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 read lock, first create the <samp>#cvs.lock</samp>
+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 <samp>#cvs.lock</samp> lock, create a file
+whose name is <samp>#cvs.rfl.</samp> followed by information
+of your choice (for example, hostname and process
+identification number).  Then remove the
+<samp>#cvs.lock</samp> directory to release the master lock.
+Then proceed with reading the repository.  When you are
+done, remove the <samp>#cvs.rfl</samp> file to release the
+read lock.
+</p>
+<p>To obtain a write lock, first create the
+<samp>#cvs.lock</samp> directory, as with read locks.  Then
+check that there are no files whose names start with
+<samp>#cvs.rfl.</samp>.  If there are, remove
+<samp>#cvs.lock</samp>, wait for a while, and try again.  If
+there are no readers, then create a file whose name is
+<samp>#cvs.wfl</samp> followed by information of your choice
+(for example, hostname and process identification
+number).  Hang on to the <samp>#cvs.lock</samp> lock.  Proceed
+with writing the repository.  When you are done, first
+remove the <samp>#cvs.wfl</samp> file and then the
+<samp>#cvs.lock</samp> directory. Note that unlike the
+<samp>#cvs.rfl</samp> file, the <samp>#cvs.wfl</samp> file is just
+informational; it has no effect on the locking operation
+beyond what is provided by holding on to the
+<samp>#cvs.lock</samp> lock itself.
+</p>
+<p>Note that each lock (write lock or read lock) only locks
+a single directory in the repository, including
+<samp>Attic</samp> and <samp>CVS</samp> 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 write locks to control
+access to individual <samp>foo,v</samp> files.  <small>RCS</small> has
+a scheme where the <samp>,foo,</samp> file serves as a lock,
+but <small>CVS</small> does not implement it and so taking out a
+<small>CVS</small> write lock is recommended.  See the comments at
+rcs_internal_lockfile in the <small>CVS</small> source code for
+further discussion/rationale.
+</p>
+<hr>
+<a name="CVSROOT-storage"></a>
+<div class="header">
+<p>
+Previous: <a href="#Locks" accesskey="p" rel="prev">Locks</a>, Up: <a 
href="#Repository-storage" accesskey="u" rel="up">Repository storage</a> &nbsp; 
[<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="How-files-are-stored-in-the-CVSROOT-directory"></a>
+<h4 class="subsection">2.2.7 How files are stored in the CVSROOT directory</h4>
+<a name="index-CVSROOT_002c-storage-of-files"></a>
+
+<p>The <samp>$CVSROOT/CVSROOT</samp> 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
+<samp>loginfo,v</samp> and a file <samp>loginfo</samp> which
+contains the latest revision contained in
+<samp>loginfo,v</samp>.  When you check in an administrative
+file, <small>CVS</small> should print
+</p>
+<div class="example">
+<pre class="example">cvs commit: Rebuilding administrative file database
+</pre></div>
+
+<p>and update the checked out copy in
+<samp>$CVSROOT/CVSROOT</samp>.  If it does not, there is
+something wrong (see <a href="#BUGS">BUGS</a>).  To add your own files
+to the files to be updated in this fashion, you can add
+them to the <samp>checkoutlist</samp> administrative file
+(see <a href="#checkoutlist">checkoutlist</a>).
+</p>
+<a name="index-modules_002edb"></a>
+<a name="index-modules_002epag"></a>
+<a name="index-modules_002edir"></a>
+<p>By default, the <samp>modules</samp> 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 <samp>modules.db</samp>,
+<samp>modules.pag</samp>, and/or <samp>modules.dir</samp>.
+</p>
+<p>For information on the meaning of the various
+administrative files, see <a href="#Administrative-files">Administrative 
files</a>.
+</p>
+<hr>
+<a name="Working-directory-storage"></a>
+<div class="header">
+<p>
+Next: <a href="#Intro-administrative-files" accesskey="n" rel="next">Intro 
administrative files</a>, Previous: <a href="#Repository-storage" accesskey="p" 
rel="prev">Repository storage</a>, Up: <a href="#Repository" accesskey="u" 
rel="up">Repository</a> &nbsp; [<a href="#SEC_Contents" title="Table of 
contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="How-data-is-stored-in-the-working-directory"></a>
+<h3 class="section">2.3 How data is stored in the working directory</h3>
+
+
+<a name="index-CVS-directory_002c-in-working-directory"></a>
+<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 <samp>CVS</samp> 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 <samp>CVS</samp> 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><samp>Root</samp></dt>
+<dd><p>This file contains the current <small>CVS</small> root, as
+described in <a href="#Specifying-a-repository">Specifying a repository</a>.
+</p>
+<a name="index-Repository-file_002c-in-CVS-directory"></a>
+<a name="index-CVS_002fRepository-file"></a>
+</dd>
+<dt><samp>Repository</samp></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>
+<div class="example">
+<pre class="example">cvs -d :local:/usr/local/cvsroot checkout yoyodyne/tc
+</pre></div>
+
+<p><samp>Root</samp> will contain
+</p>
+<div class="example">
+<pre class="example">:local:/usr/local/cvsroot
+</pre></div>
+
+<p>and <samp>Repository</samp> will contain either
+</p>
+<div class="example">
+<pre class="example">/usr/local/cvsroot/yoyodyne/tc
+</pre></div>
+
+<p>or
+</p>
+<div class="example">
+<pre class="example">yoyodyne/tc
+</pre></div>
+
+<p>If the particular working directory does not correspond
+to a directory in the repository, then <samp>Repository</samp>
+should contain <samp>CVSROOT/Emptydir</samp>.
+<a name="index-Emptydir_002c-in-CVSROOT-directory"></a>
+<a name="index-CVSROOT_002fEmptydir-directory"></a>
+</p>
+<a name="index-Entries-file_002c-in-CVS-directory"></a>
+<a name="index-CVS_002fEntries-file"></a>
+</dd>
+<dt><samp>Entries</samp></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>
+<div class="example">
+<pre 
class="example">/<var>name</var>/<var>revision</var>/<var>timestamp</var>[+<var>conflict</var>]/<var>options</var>/<var>tagdate</var>
+</pre></div>
+
+<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 <a href="#Conflicts-example">Conflicts 
example</a>).
+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 <samp>Entries</samp> 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 <samp>Entries</samp> 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>
+<div class="example">
+<pre 
class="example">D/<var>name</var>/<var>filler1</var>/<var>filler2</var>/<var>filler3</var>/<var>filler4</var>
+</pre></div>
+
+<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 <samp>Entries</samp> file can be in any order.
+</p>
+<a name="index-Entries_002eLog-file_002c-in-CVS-directory"></a>
+<a name="index-CVS_002fEntries_002eLog-file"></a>
+</dd>
+<dt><samp>Entries.Log</samp></dt>
+<dd><p>This file does not record any information beyond that
+in <samp>Entries</samp>, but it does provide a way to update
+the information without having to rewrite the entire
+<samp>Entries</samp> file, including the ability to preserve
+the information even if the program writing
+<samp>Entries</samp> and <samp>Entries.Log</samp> abruptly aborts.
+Programs which are reading the <samp>Entries</samp> file
+should also check for <samp>Entries.Log</samp>.  If the latter
+exists, they should read <samp>Entries</samp> and then apply
+the changes mentioned in <samp>Entries.Log</samp>.  After
+applying the changes, the recommended practice is to
+rewrite <samp>Entries</samp> and then delete <samp>Entries.Log</samp>.
+The format of a line in <samp>Entries.Log</samp> is a single
+character command followed by a space followed by a
+line in the format specified for a line in
+<samp>Entries</samp>.  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 <samp>Entries.Log</samp> should be silently ignored (for
+future expansion).  If the second character of the line
+in <samp>Entries.Log</samp> 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 <samp>Entries.Log</samp> if they so choose.
+</p>
+<a name="index-Entries_002eBackup-file_002c-in-CVS-directory"></a>
+<a name="index-CVS_002fEntries_002eBackup-file"></a>
+</dd>
+<dt><samp>Entries.Backup</samp></dt>
+<dd><p>This is a temporary file.  Recommended usage is to
+write a new entries file to <samp>Entries.Backup</samp>, and
+then to rename it (atomically, where possible) to <samp>Entries</samp>.
+</p>
+<a name="index-Entries_002eStatic-file_002c-in-CVS-directory"></a>
+<a name="index-CVS_002fEntries_002eStatic-file"></a>
+</dd>
+<dt><samp>Entries.Static</samp></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 <samp>Entries.Static</samp>.
+</p>
+<a name="index-Tag-file_002c-in-CVS-directory"></a>
+<a name="index-CVS_002fTag-file"></a>
+<a name="index-Sticky-tags_002fdates_002c-per_002ddirectory"></a>
+<a name="index-Per_002ddirectory-sticky-tags_002fdates"></a>
+</dd>
+<dt><samp>Tag</samp></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 <a href="#Sticky-tags">Sticky tags</a>.
+</p>
+<a name="index-Notify-file_002c-in-CVS-directory"></a>
+<a name="index-CVS_002fNotify-file"></a>
+</dd>
+<dt><samp>Notify</samp></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>
+<a name="index-Notify_002etmp-file_002c-in-CVS-directory"></a>
+<a name="index-CVS_002fNotify_002etmp-file"></a>
+</dd>
+<dt><samp>Notify.tmp</samp></dt>
+<dd><p>This file is to <samp>Notify</samp> as <samp>Entries.Backup</samp>
+is to <samp>Entries</samp>.  That is, to write <samp>Notify</samp>,
+first write the new contents to <samp>Notify.tmp</samp> and
+then (atomically where possible), rename it to
+<samp>Notify</samp>.
+</p>
+<a name="index-Base-directory_002c-in-CVS-directory"></a>
+<a name="index-CVS_002fBase-directory"></a>
+</dd>
+<dt><samp>Base</samp></dt>
+<dd><p>If watches are in use, then an <code>edit</code> command
+stores the original copy of the file in the <samp>Base</samp>
+directory.  This allows the <code>unedit</code> command to
+operate even if it is unable to communicate with the
+server.
+</p>
+<a name="index-Baserev-file_002c-in-CVS-directory"></a>
+<a name="index-CVS_002fBaserev-file"></a>
+</dd>
+<dt><samp>Baserev</samp></dt>
+<dd><p>The file lists the revision for each of the files in
+the <samp>Base</samp> directory.  The format is:
+</p>
+<div class="example">
+<pre class="example">B<var>name</var>/<var>rev</var>/<var>expansion</var>
+</pre></div>
+
+<p>where <var>expansion</var> should be ignored, to allow for
+future expansion.
+</p>
+<a name="index-Baserev_002etmp-file_002c-in-CVS-directory"></a>
+<a name="index-CVS_002fBaserev_002etmp-file"></a>
+</dd>
+<dt><samp>Baserev.tmp</samp></dt>
+<dd><p>This file is to <samp>Baserev</samp> as <samp>Entries.Backup</samp>
+is to <samp>Entries</samp>.  That is, to write <samp>Baserev</samp>,
+first write the new contents to <samp>Baserev.tmp</samp> and
+then (atomically where possible), rename it to
+<samp>Baserev</samp>.
+</p>
+<a name="index-Template-file_002c-in-CVS-directory"></a>
+<a name="index-CVS_002fTemplate-file"></a>
+</dd>
+<dt><samp>Template</samp></dt>
+<dd><p>This file contains the template specified by the
+<samp>rcsinfo</samp> file (see <a href="#rcsinfo">rcsinfo</a>).  It is only 
used
+by the client; the non-client/server <small>CVS</small> consults
+<samp>rcsinfo</samp> directly.
+</p></dd>
+</dl>
+
+<hr>
+<a name="Intro-administrative-files"></a>
+<div class="header">
+<p>
+Next: <a href="#Multiple-repositories" accesskey="n" rel="next">Multiple 
repositories</a>, Previous: <a href="#Working-directory-storage" accesskey="p" 
rel="prev">Working directory storage</a>, Up: <a href="#Repository" 
accesskey="u" rel="up">Repository</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="The-administrative-files"></a>
+<h3 class="section">2.4 The administrative files</h3>
+<a name="index-Administrative-files-_0028intro_0029"></a>
+<a name="index-Modules-file"></a>
+<a name="index-CVSROOT_002c-module-name"></a>
+<a name="index-Defining-modules-_0028intro_0029"></a>
+
+
+<p>The directory <samp>$CVSROOT/CVSROOT</samp> contains some <em>administrative
+files</em>.  See <a href="#Administrative-files">Administrative files</a>, for 
a complete description.
+You can use <small>CVS</small> without any of these files, but
+some commands work better when at least the
+<samp>modules</samp> file is properly set up.
+</p>
+<p>The most important of these files is the <samp>modules</samp>
+file.  It defines all modules in the repository.  This
+is a sample <samp>modules</samp> file.
+</p>
+<div class="example">
+<pre class="example">CVSROOT         CVSROOT
+modules         CVSROOT modules
+cvs             gnu/cvs
+rcs             gnu/rcs
+diff            gnu/diff
+tc              yoyodyne/tc
+</pre></div>
+
+<p>The <samp>modules</samp> 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 <a href="#modules">modules</a>, for a full explanation of all the
+available features.
+</p>
+<a name="Editing-administrative-files"></a>
+<h4 class="subsection">2.4.1 Editing administrative files</h4>
+<a name="index-Editing-administrative-files"></a>
+<a name="index-Administrative-files_002c-editing-them"></a>
+
+<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.  If and when this happens, you can correct
+the problem by temporarily copying a corrected administrative file
+directly into the <code>$CVSROOT/CVSROOT</code> repository directory,
+then committing the same correction via a checkout of the <samp>CVSROOT</samp>
+module.  It is important that the correction also be made via the
+checked out copy, or the next checkout and commit to the
+&lt;code&gt;CVSROOT&lt;/code&gt; module will overwrite the correction that was
+copied directly into the repository, possibly breaking things in such
+a way as to prevent commits again.
+</p>
+<hr>
+<a name="Multiple-repositories"></a>
+<div class="header">
+<p>
+Next: <a href="#Creating-a-repository" accesskey="n" rel="next">Creating a 
repository</a>, Previous: <a href="#Intro-administrative-files" accesskey="p" 
rel="prev">Intro administrative files</a>, Up: <a href="#Repository" 
accesskey="u" rel="up">Repository</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Multiple-repositories-1"></a>
+<h3 class="section">2.5 Multiple repositories</h3>
+<a name="index-Multiple-repositories"></a>
+<a name="index-Repositories_002c-multiple"></a>
+<a name="index-Many-repositories"></a>
+<a name="index-Parallel-repositories"></a>
+<a name="index-Disjoint-repositories"></a>
+<a name="index-CVSROOT_002c-multiple-repositories"></a>
+
+<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 <a href="#Specifying-a-repository">Specifying a repository</a>).
+</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>
+<div class="example">
+<pre class="example">cvs -d server1:/cvs co dir1
+cd dir1
+cvs -d server2:/root co sdir
+cvs update
+</pre></div>
+
+<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>
+<a name="Creating-a-repository"></a>
+<div class="header">
+<p>
+Next: <a href="#Backing-up" accesskey="n" rel="next">Backing up</a>, Previous: 
<a href="#Multiple-repositories" accesskey="p" rel="prev">Multiple 
repositories</a>, Up: <a href="#Repository" accesskey="u" 
rel="up">Repository</a> &nbsp; [<a href="#SEC_Contents" title="Table of 
contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Creating-a-repository-1"></a>
+<h3 class="section">2.6 Creating a repository</h3>
+
+<a name="index-Repository_002c-setting-up"></a>
+<a name="index-Creating-a-repository"></a>
+<a name="index-Setting-up-a-repository"></a>
+
+<p>This section describes how to set up a <small>CVS</small> repository for any
+sort of access method.  After completing the setup described in this
+section, you should be able to access your <small>CVS</small> repository 
immediately
+via the local access method and several remote access methods.  For
+more information on setting up remote access to the repository you create
+in this section, please read the section on See <a 
href="#Remote-repositories">Remote repositories</a>.
+</p>
+<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 <a href="#Server-requirements">Server 
requirements</a>.
+</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 <a href="#Concurrency">Concurrency</a>).
+</p>
+<a name="index-init-_0028subcommand_0029"></a>
+<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 <a href="#Repository">Repository</a>).  For example,
+</p>
+<div class="example">
+<pre class="example">cvs -d /usr/local/cvsroot init
+</pre></div>
+
+<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 <a href="#history-file">history file</a>.
+</p>
+<hr>
+<a name="Backing-up"></a>
+<div class="header">
+<p>
+Next: <a href="#Moving-a-repository" accesskey="n" rel="next">Moving a 
repository</a>, Previous: <a href="#Creating-a-repository" accesskey="p" 
rel="prev">Creating a repository</a>, Up: <a href="#Repository" accesskey="u" 
rel="up">Repository</a> &nbsp; [<a href="#SEC_Contents" title="Table of 
contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Backing-up-a-repository"></a>
+<h3 class="section">2.7 Backing up a repository</h3>
+<a name="index-Repository_002c-backing-up"></a>
+<a name="index-Backing-up_002c-repository"></a>
+
+<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>
+<a name="index-Locks_002c-cvs_002c-and-backups"></a>
+<a name="index-_0023cvs_002erfl_002c-and-backups"></a>
+<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
+<samp>#cvs.rfl</samp> locks in each repository directory.
+See <a href="#Concurrency">Concurrency</a>, 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 <samp>CVS</samp> 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>
+<a name="Moving-a-repository"></a>
+<div class="header">
+<p>
+Next: <a href="#Remote-repositories" accesskey="n" rel="next">Remote 
repositories</a>, Previous: <a href="#Backing-up" accesskey="p" 
rel="prev">Backing up</a>, Up: <a href="#Repository" accesskey="u" 
rel="up">Repository</a> &nbsp; [<a href="#SEC_Contents" title="Table of 
contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Moving-a-repository-1"></a>
+<h3 class="section">2.8 Moving a repository</h3>
+<a name="index-Repository_002c-moving"></a>
+<a name="index-Moving-a-repository"></a>
+<a name="index-Copying-a-repository"></a>
+
+<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 <samp>CVS/Repository</samp> files.  You can
+see <a href="#Working-directory-storage">Working directory storage</a>, for 
information on
+the <samp>CVS/Repository</samp> and <samp>CVS/Root</samp> files, but
+unless you are sure you want to bother, it probably
+isn&rsquo;t worth it.
+</p>
+<hr>
+<a name="Remote-repositories"></a>
+<div class="header">
+<p>
+Next: <a href="#Read_002donly-access" accesskey="n" rel="next">Read-only 
access</a>, Previous: <a href="#Moving-a-repository" accesskey="p" 
rel="prev">Moving a repository</a>, Up: <a href="#Repository" accesskey="u" 
rel="up">Repository</a> &nbsp; [<a href="#SEC_Contents" title="Table of 
contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Remote-repositories-1"></a>
+<h3 class="section">2.9 Remote repositories</h3>
+<a name="index-Repositories_002c-remote"></a>
+<a name="index-Remote-repositories"></a>
+<a name="index-Client_002fServer-Operation"></a>
+<a name="index-Server_002c-CVS"></a>
+<a name="index-Remote-repositories_002c-port-specification"></a>
+<a name="index-Repositories_002c-remote_002c-port-specification"></a>
+<a name="index-Client_002fServer-Operation_002c-port-specification"></a>
+<a 
name="index-pserver-_0028client_002fserver-connection-method_0029_002c-port-specification"></a>
+<a 
name="index-kserver-_0028client_002fserver-connection-method_0029_002c-port-specification"></a>
+<a 
name="index-gserver-_0028client_002fserver-connection-method_0029_002c-port-specification"></a>
+<a name="index-port_002c-specifying-for-remote-repositories"></a>
+
+<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>
+<div class="example">
+<pre 
class="example">[:<var>method</var>:][[<var>user</var>][:<var>password</var>address@hidden<var>hostname</var>[:[<var>port</var>]]/path/to/repository
+</pre></div>
+
+<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 <a href="#Password-authentication-client">Password authentication 
client</a>).
+</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 <a href="#Connecting-via-rsh">Connecting via rsh</a>.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Server-requirements" 
accesskey="1">Server requirements</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Memory and other resources for servers
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Connecting-via-rsh" 
accesskey="2">Connecting via rsh</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Using the <code>rsh</code> program to connect
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Password-authenticated" 
accesskey="3">Password authenticated</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Direct connections using passwords
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#GSSAPI-authenticated" 
accesskey="4">GSSAPI authenticated</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Direct connections using GSSAPI
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Kerberos-authenticated" 
accesskey="5">Kerberos authenticated</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Direct connections with Kerberos
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Connecting-via-fork" 
accesskey="6">Connecting via fork</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Using a forked <code>cvs server</code> to connect
+</td></tr>
+</table>
+
+<hr>
+<a name="Server-requirements"></a>
+<div class="header">
+<p>
+Next: <a href="#Connecting-via-rsh" accesskey="n" rel="next">Connecting via 
rsh</a>, Up: <a href="#Remote-repositories" accesskey="u" rel="up">Remote 
repositories</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Server-requirements-1"></a>
+<h4 class="subsection">2.9.1 Server requirements</h4>
+
+<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
+<a href="#BUGS">BUGS</a>, 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
+<a href="#Creating-a-repository">Creating a repository</a>.
+</p>
+<hr>
+<a name="Connecting-via-rsh"></a>
+<div class="header">
+<p>
+Next: <a href="#Password-authenticated" accesskey="n" rel="next">Password 
authenticated</a>, Previous: <a href="#Server-requirements" accesskey="p" 
rel="prev">Server requirements</a>, Up: <a href="#Remote-repositories" 
accesskey="u" rel="up">Remote repositories</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Connecting-with-rsh-or-ssh"></a>
+<h4 class="subsection">2.9.2 Connecting with rsh or ssh</h4>
+
+<a name="index-ssh"></a>
+<p><small>CVS</small> may use the &lsquo;<samp>ssh</samp>&rsquo; protocol to 
perform
+these operations, so the remote user host needs to have
+a either an agent like <code>ssh-agent</code> to hold
+credentials or a <samp>.shosts</samp> 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 <samp>--with-ssh</samp> flag to configure.
+</p>
+<a name="index-rsh"></a>
+<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
+<samp>.rhosts</samp> 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 <samp>--with-rsh</samp>
+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
+<samp>.rhosts</samp> in &lsquo;<samp>bach</samp>&rsquo;&rsquo;s home directory:
+</p>
+<div class="example">
+<pre class="example">toe.example.com  mozart
+</pre></div>
+
+<p>Then test that &lsquo;<samp>rsh</samp>&rsquo; is working with
+</p>
+<div class="example">
+<pre class="example">rsh -l bach faun.example.org 'echo $PATH'
+</pre></div>
+
+<p>To test that &lsquo;<samp>ssh</samp>&rsquo; is working use
+</p>
+<div class="example">
+<pre class="example">ssh -l bach faun.example.org 'echo $PATH'
+</pre></div>
+
+<a name="index-CVS_005fSERVER_002c-environment-variable"></a>
+<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
+<samp>.bashrc</samp>, <samp>.cshrc</samp>, etc., not <samp>.login</samp>
+or <samp>.profile</samp>.  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 <samp>/usr/local/bin/cvs-1.6</samp>.
+</p>
+<p>There is no need to edit <samp>inetd.conf</samp> or start a
+<small>CVS</small> server daemon.
+</p>
+<a name="index-_003aserver_003a_002c-setting-up"></a>
+<a name="index-_003aext_003a_002c-setting-up"></a>
+<a name="index-_003aextssh_003a_002c-setting-up"></a>
+<a name="index-Kerberos_002c-using-kerberized-rsh"></a>
+<a name="index-SSH-_0028rsh-replacement_0029"></a>
+<a name="index-rsh-replacements-_0028Kerberized_002c-SSH_002c-_0026c_0029"></a>
+<p>There are three access methods that you use in <code>CVSROOT</code>
+for rsh or ssh.  <code>:server:</code> specifies an internal rsh
+client, which is supported only by some <small>CVS</small> ports.
+<code>:extssh:</code> specifies an external ssh program. By
+default this is <code>ssh</code> (unless otherwise specified
+by the <samp>--with-ssh</samp> flag to configure) but you may set the
+<code>CVS_SSH</code> environment variable to invoke another
+program or wrapper script.
+<code>:ext:</code> specifies an external rsh program.  By
+default this is <code>rsh</code> (unless otherwise specified
+by the <samp>--with-rsh</samp> 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 <samp>.rhosts</samp> 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 <samp>foo</samp> in the repository
+<samp>/usr/local/cvsroot/</samp>, on machine
+<samp>faun.example.org</samp>, you are ready to go:
+</p>
+<div class="example">
+<pre class="example">cvs -d :ext:address@hidden:/usr/local/cvsroot checkout foo
+</pre></div>
+
+<p>(The <samp>bach@</samp> can be omitted if the username is
+the same on both the local and remote hosts.)
+</p>
+
+<hr>
+<a name="Password-authenticated"></a>
+<div class="header">
+<p>
+Next: <a href="#GSSAPI-authenticated" accesskey="n" rel="next">GSSAPI 
authenticated</a>, Previous: <a href="#Connecting-via-rsh" accesskey="p" 
rel="prev">Connecting via rsh</a>, Up: <a href="#Remote-repositories" 
accesskey="u" rel="up">Remote repositories</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Direct-connection-with-password-authentication"></a>
+<h4 class="subsection">2.9.3 Direct connection with password 
authentication</h4>
+
+<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>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a 
href="#Password-authentication-server" accesskey="1">Password authentication 
server</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Setting up 
the server
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#Password-authentication-client" accesskey="2">Password authentication 
client</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Using the 
client
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#Password-authentication-security" accesskey="3">Password authentication 
security</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">What this 
method does and does not do
+</td></tr>
+</table>
+
+<hr>
+<a name="Password-authentication-server"></a>
+<div class="header">
+<p>
+Next: <a href="#Password-authentication-client" accesskey="n" 
rel="next">Password authentication client</a>, Up: <a 
href="#Password-authenticated" accesskey="u" rel="up">Password 
authenticated</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Setting-up-the-server-for-password-authentication"></a>
+<h4 class="subsubsection">2.9.3.1 Setting up the server for password 
authentication</h4>
+
+<p>First of all, you probably want to tighten the
+permissions on the <samp>$CVSROOT</samp> and
+<samp>$CVSROOT/CVSROOT</samp> directories.  See <a 
href="#Password-authentication-security">Password authentication security</a>, 
for more details.
+</p>
+<a name="index-pserver-_0028subcommand_0029"></a>
+<a name="index-Remote-repositories_002c-port-specification-1"></a>
+<a name="index-Repositories_002c-remote_002c-port-specification-1"></a>
+<a name="index-Client_002fServer-Operation_002c-port-specification-1"></a>
+<a 
name="index-pserver-_0028client_002fserver-connection-method_0029_002c-port-specification-1"></a>
+<a 
name="index-kserver-_0028client_002fserver-connection-method_0029_002c-port-specification-1"></a>
+<a 
name="index-gserver-_0028client_002fserver-connection-method_0029_002c-port-specification-1"></a>
+<a name="index-port_002c-specifying-for-remote-repositories-1"></a>
+<a name="index-Password-server_002c-setting-up"></a>
+<a name="index-Authenticating-server_002c-setting-up"></a>
+<a name="index-inetd_002c-configuring-for-pserver"></a>
+<a name="index-xinetd_002c-configuring-for-pserver"></a>
+<p>On the server side, the file <samp>/etc/inetd.conf</samp>
+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 <a href="#Remote-repositories">Remote repositories</a>) or overridden 
with the CVS_CLIENT_PORT
+environment variable (see <a href="#Environment-variables">Environment 
variables</a>).
+</p>
+<p>If your <code>inetd</code> allows raw port numbers in
+<samp>/etc/inetd.conf</samp>, then the following (all on a
+single line in <samp>inetd.conf</samp>) should be sufficient:
+</p>
+<div class="example">
+<pre class="example">2401  stream  tcp  nowait  root  /usr/local/bin/cvs
+cvs -f --allow-root=/usr/cvsroot pserver
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">#! /bin/sh
+exec /usr/local/bin/cvs -f \
+     --allow-root=/repo1 \
+     --allow-root=/repo2 \
+     ...
+     --allow-root=/repo<var>N</var> \
+     pserver
+</pre></div>
+
+<p>If your <code>inetd</code> wants a symbolic service
+name instead of a raw port number, then put this in
+<samp>/etc/services</samp>:
+</p>
+<div class="example">
+<pre class="example">cvspserver      2401/tcp
+</pre></div>
+
+<p>and put <code>cvspserver</code> instead of <code>2401</code> in 
<samp>inetd.conf</samp>.
+</p>
+<p>If your system uses <code>xinetd</code> instead of <code>inetd</code>,
+the procedure is slightly different.
+Create a file called <samp>/etc/xinetd.d/cvspserver</samp> containing the 
following:
+</p>
+<div class="example">
+<pre class="example">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
+}
+</pre></div>
+
+<p>(If <code>cvspserver</code> is defined in <samp>/etc/services</samp>, 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
+<a href="#Connection">Connection</a>.
+</p>
+<a name="index-CVS-passwd-file"></a>
+<a name="index-passwd-_0028admin-file_0029"></a>
+<p>Because the client stores and transmits passwords in
+cleartext (almost&mdash;see <a 
href="#Password-authentication-security">Password authentication security</a>, 
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
+<samp>$CVSROOT/CVSROOT/passwd</samp> (see <a 
href="#Intro-administrative-files">Intro administrative files</a>).  It uses a 
colon-separated
+format, similar to <samp>/etc/passwd</samp> 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 <samp>passwd</samp> file with five entries:
+</p>
+<div class="example">
+<pre class="example">anonymous:
+bach:ULtgRLXo7NRxs
+spwang:1sOp854gDF3DY
+melissa:tGX1fS8sun6rY:pubcvs
+qproj:XR4EZcEs0szik:pubcvs
+</pre></div>
+
+<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
+<samp>/etc/passwd</samp> 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
+<a href="#Read_002donly-access">Read-only access</a>.)
+</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>
+<a name="index-User-aliases"></a>
+<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 <samp>$CVSROOT/CVSROOT/passwd</samp> 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 <samp>$CVSROOT/CVSROOT/passwd</samp> file:
+</p>
+<div class="example">
+<pre class="example">anonymous::pubcvs
+fish:rKa5jzULzmhOo:kfogel
+sussman:1sOp854gDF3DY
+</pre></div>
+
+<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 <samp>$CVSROOT/CVSROOT/passwd</samp>
+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> <samp>passwd</samp> 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> <samp>config</samp> file, see <a 
href="#config">config</a>).  Be
+aware, however, 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 <a 
href="#Password-authentication-security">Password authentication security</a> 
for more on this.
+</p>
+<p>Right now, the only way to put a password in the
+<small>CVS</small> <samp>passwd</samp> 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 <samp>$CVSROOT/CVSROOT</samp>, it
+is normal to edit the <samp>passwd</samp> file in-place,
+rather than via <small>CVS</small>.  This is because of the
+possible security risks of having the <samp>passwd</samp>
+file checked out to people&rsquo;s working copies.  If you do
+want to include the <samp>passwd</samp> file in checkouts of
+<samp>$CVSROOT/CVSROOT</samp>, see <a href="#checkoutlist">checkoutlist</a>.
+</p>
+
+<hr>
+<a name="Password-authentication-client"></a>
+<div class="header">
+<p>
+Next: <a href="#Password-authentication-security" accesskey="n" 
rel="next">Password authentication security</a>, Previous: <a 
href="#Password-authentication-server" accesskey="p" rel="prev">Password 
authentication server</a>, Up: <a href="#Password-authenticated" accesskey="u" 
rel="up">Password authenticated</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Using-the-client-with-password-authentication"></a>
+<h4 class="subsubsection">2.9.3.2 Using the client with password 
authentication</h4>
+<a name="index-Login-_0028subcommand_0029"></a>
+<a name="index-Password-client_002c-using"></a>
+<a name="index-Authenticated-client_002c-using"></a>
+<a name="index-_003apserver_003a_002c-setting-up"></a>
+<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>
+<div class="example">
+<pre class="example">cvs -d :pserver:faun.example.org:/usr/local/cvsroot 
checkout someproj
+</pre></div>
+
+<p>or
+</p>
+<div class="example">
+<pre class="example">CVSROOT=:pserver:address@hidden:2401/usr/local/cvsroot
+cvs checkout someproj
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">cvs -d :pserver:address@hidden:/usr/local/cvsroot login
+CVS password:
+</pre></div>
+
+<p>or
+</p>
+<div class="example">
+<pre class="example">cvs -d :pserver:bach:address@hidden:/usr/local/cvsroot 
login
+</pre></div>
+
+<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
+<samp>$HOME/.cvspass</samp>.  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>
+<a name="index-CVS_005fPASSFILE_002c-environment-variable"></a>
+<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>  
+<div class="example">
+<pre class="example">cvs -d :pserver:address@hidden:/usr/local/cvsroot 
checkout foo
+</pre></div>
+
+<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 <a href="#Connecting-via-rsh">Connecting via rsh</a>).
+</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 <samp>CVS</samp> subdirectory.
+</p>
+<a name="index-Logout-_0028subcommand_0029"></a>
+<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>
+<a name="Password-authentication-security"></a>
+<div class="header">
+<p>
+Previous: <a href="#Password-authentication-client" accesskey="p" 
rel="prev">Password authentication client</a>, Up: <a 
href="#Password-authenticated" accesskey="u" rel="up">Password 
authenticated</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Security-considerations-with-password-authentication"></a>
+<h4 class="subsubsection">2.9.3.3 Security considerations with password 
authentication</h4>
+
+<a name="index-Security_002c-of-pserver"></a>
+<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 <a 
href="#Password-authentication-server">Password authentication server</a>) 
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 <samp>$CVSROOT/CVSROOT</samp> directory
+contains <samp>passwd</samp> and other files which are used
+to check security, you must control the permissions on
+this directory as tightly as the permissions on
+<samp>/etc</samp>.  The same applies to the <samp>$CVSROOT</samp>
+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>
+<a name="GSSAPI-authenticated"></a>
+<div class="header">
+<p>
+Next: <a href="#Kerberos-authenticated" accesskey="n" rel="next">Kerberos 
authenticated</a>, Previous: <a href="#Password-authenticated" accesskey="p" 
rel="prev">Password authenticated</a>, Up: <a href="#Remote-repositories" 
accesskey="u" rel="up">Remote repositories</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Direct-connection-with-GSSAPI"></a>
+<h4 class="subsection">2.9.4 Direct connection with GSSAPI</h4>
+
+<a name="index-GSSAPI"></a>
+<a name="index-Security_002c-GSSAPI"></a>
+<a name="index-_003agserver_003a_002c-setting-up"></a>
+<a name="index-Kerberos_002c-using-_003agserver_003a"></a>
+<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 <samp>--with-gssapi</samp>
+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
+<samp>--enable-encrypt</samp> 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 <a href="#Password-authentication-server">Password 
authentication server</a>.  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 <samp>CVSROOT/passwd</samp> password file, and set
+<code>SystemAuth=no</code> in the config file
+(see <a href="#config">config</a>).
+</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 the &lsquo;<samp>:gserver:</samp>&rsquo; 
method.  For
+example,
+</p>
+<div class="example">
+<pre class="example">cvs -d :gserver:faun.example.org:/usr/local/cvsroot 
checkout foo
+</pre></div>
+
+<hr>
+<a name="Kerberos-authenticated"></a>
+<div class="header">
+<p>
+Next: <a href="#Connecting-via-fork" accesskey="n" rel="next">Connecting via 
fork</a>, Previous: <a href="#GSSAPI-authenticated" accesskey="p" 
rel="prev">GSSAPI authenticated</a>, Up: <a href="#Remote-repositories" 
accesskey="u" rel="up">Remote repositories</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Direct-connection-with-Kerberos"></a>
+<h4 class="subsection">2.9.5 Direct connection with Kerberos</h4>
+
+<a name="index-Kerberos_002c-using-_003akserver_003a"></a>
+<a name="index-Security_002c-Kerberos"></a>
+<a name="index-_003akserver_003a_002c-setting-up"></a>
+<p>The easiest way to use Kerberos is to use the Kerberos
+<code>rsh</code>, as described in <a href="#Connecting-via-rsh">Connecting via 
rsh</a>.
+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
+<samp>--with-krb4</samp> 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
+<samp>--enable-encryption</samp> configure option to turn it
+on.  You must then use the <code>-x</code> global option to
+request encryption.
+</p>
+<a name="index-CVS_005fCLIENT_005fPORT"></a>
+<p>You need to edit <samp>inetd.conf</samp> 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 <a 
href="#Remote-repositories">Remote repositories</a>)
+or the <code>CVS_CLIENT_PORT</code> environment variable
+(see <a href="#Environment-variables">Environment variables</a>) on the client.
+</p>
+<a name="index-kinit"></a>
+<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>
+<div class="example">
+<pre class="example">cvs -d :kserver:faun.example.org:/usr/local/cvsroot 
checkout foo
+</pre></div>
+
+<p>Previous versions of <small>CVS</small> would fall back to a
+connection via rsh; this version will not do so.
+</p>
+<hr>
+<a name="Connecting-via-fork"></a>
+<div class="header">
+<p>
+Previous: <a href="#Kerberos-authenticated" accesskey="p" rel="prev">Kerberos 
authenticated</a>, Up: <a href="#Remote-repositories" accesskey="u" 
rel="up">Remote repositories</a> &nbsp; [<a href="#SEC_Contents" title="Table 
of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Connecting-with-fork"></a>
+<h4 class="subsection">2.9.6 Connecting with fork</h4>
+
+<a name="index-fork_002c-access-method"></a>
+<a name="index-_003afork_003a_002c-setting-up"></a>
+<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>
+<div class="example">
+<pre class="example">cvs -d :fork:/usr/local/cvsroot checkout foo
+</pre></div>
+
+<a name="index-CVS_005fSERVER_002c-and-_003afork_003a"></a>
+<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>
+<a name="Read_002donly-access"></a>
+<div class="header">
+<p>
+Next: <a href="#Server-temporary-directory" accesskey="n" rel="next">Server 
temporary directory</a>, Previous: <a href="#Remote-repositories" accesskey="p" 
rel="prev">Remote repositories</a>, Up: <a href="#Repository" accesskey="u" 
rel="up">Repository</a> &nbsp; [<a href="#SEC_Contents" title="Table of 
contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Read_002donly-repository-access"></a>
+<h3 class="section">2.10 Read-only repository access</h3>
+<a name="index-Read_002donly-repository-access"></a>
+<a name="index-readers-_0028admin-file_0029"></a>
+<a name="index-writers-_0028admin-file_0029"></a>
+
+<p>It is possible to grant read-only repository
+access to people using the password-authenticated
+server (see <a href="#Password-authenticated">Password authenticated</a>).  
(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 <a href="#Password-authentication-server">Password 
authentication server</a>).
+</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 <samp>$CVSROOT/CVSROOT/readers</samp>
+file, which is simply a newline-separated list of
+users.  Here is a sample <samp>readers</samp> file:
+</p>
+<div class="example">
+<pre class="example">melissa
+splotnik
+jrandom
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">$CVSROOT/CVSROOT/writers
+</pre></div>
+
+<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> <samp>passwd</samp> file).  The
+<samp>writers</samp> file has the same format as the
+<samp>readers</samp> file.
+</p>
+<p>Note: if your <small>CVS</small> <samp>passwd</samp>
+file maps cvs users onto system users (see <a 
href="#Password-authentication-server">Password authentication server</a>), 
make sure you deny or grant
+read-only access using the <em>cvs</em> usernames, not
+the system usernames.  That is, the <samp>readers</samp> and
+<samp>writers</samp> 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 <samp>readers</samp> exists, and this user is
+listed in it, then she gets read-only access.  Or if
+<samp>writers</samp> exists, and this user is NOT listed in
+it, then she also gets read-only access (this is true
+even if <samp>readers</samp> 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>
+<a name="Server-temporary-directory"></a>
+<div class="header">
+<p>
+Previous: <a href="#Read_002donly-access" accesskey="p" rel="prev">Read-only 
access</a>, Up: <a href="#Repository" accesskey="u" rel="up">Repository</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Temporary-directories-for-the-server"></a>
+<h3 class="section">2.11 Temporary directories for the server</h3>
+<a name="index-Temporary-directories_002c-and-server"></a>
+<a name="index-Server_002c-temporary-directories"></a>
+
+<p>While running, the <small>CVS</small> server creates temporary
+directories.  They are named
+</p>
+<div class="example">
+<pre class="example">cvs-serv<var>pid</var>
+</pre></div>
+
+<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 <a 
href="#Global-options">Global options</a>), 
+the <code>TMPDIR</code> environment variable (see <a 
href="#Environment-variables">Environment variables</a>), 
+or, failing that, <samp>/tmp</samp>.
+</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 <samp>cvs-serv<var>pid</var></samp> directories.  As long as
+there is no server running with process identification
+number <var>pid</var>, it is safe to do so.
+</p>
+<hr>
+<a name="Starting-a-new-project"></a>
+<div class="header">
+<p>
+Next: <a href="#Revisions" accesskey="n" rel="next">Revisions</a>, Previous: 
<a href="#Repository" accesskey="p" rel="prev">Repository</a>, Up: <a 
href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Starting-a-project-with-CVS"></a>
+<h2 class="chapter">3 Starting a project with CVS</h2>
+<a name="index-Starting-a-project-with-CVS"></a>
+<a name="index-Creating-a-project"></a>
+
+<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 <a href="#Moving-files">Moving files</a>.
+</p>
+<p>What to do next depends on the situation at hand.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Setting-up-the-files" 
accesskey="1">Setting up the files</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Getting the files into the repository
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Defining-the-module" 
accesskey="2">Defining the module</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">How to make a module of the files
+</td></tr>
+</table>
+
+<hr>
+<a name="Setting-up-the-files"></a>
+<div class="header">
+<p>
+Next: <a href="#Defining-the-module" accesskey="n" rel="next">Defining the 
module</a>, Up: <a href="#Starting-a-new-project" accesskey="u" 
rel="up">Starting a new project</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Setting-up-the-files-1"></a>
+<h3 class="section">3.1 Setting up the files</h3>
+
+<p>The first step is to create the files inside the repository.  This can
+be done in a couple of different ways.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#From-files" 
accesskey="1">From files</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">This method is useful with old projects
+                                where files already exists.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#From-other-version-control-systems" accesskey="2">From other version 
control systems</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Old 
projects where you want to
+                                        preserve history from another system.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#From-scratch" 
accesskey="3">From scratch</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Creating a directory tree from scratch.
+</td></tr>
+</table>
+
+<hr>
+<a name="From-files"></a>
+<div class="header">
+<p>
+Next: <a href="#From-other-version-control-systems" accesskey="n" 
rel="next">From other version control systems</a>, Up: <a 
href="#Setting-up-the-files" accesskey="u" rel="up">Setting up the files</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Creating-a-directory-tree-from-a-number-of-files"></a>
+<h4 class="subsection">3.1.1 Creating a directory tree from a number of 
files</h4>
+<a name="index-Importing-files"></a>
+
+<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 <samp><var>wdir</var></samp>, and you want them 
to appear in the
+repository as <samp>$CVSROOT/yoyodyne/<var>rdir</var></samp>, you can do this:
+</p>
+<div class="example">
+<pre class="example">$ cd <var>wdir</var>
+$ cvs import -m &quot;Imported sources&quot; yoyodyne/<var>rdir</var> yoyo 
start
+</pre></div>
+
+<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 <a href="#Tracking-sources">Tracking 
sources</a>, for
+more information about them.
+</p>
+<p>You can now verify that it worked, and remove your
+original source directory.
+</p>
+<div class="example">
+<pre class="example">$ 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>
+</pre></div>
+
+<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 <a href="#File-permissions">File permissions</a>.
+</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 <a href="#Wrappers">Wrappers</a>.
+</p>
+<hr>
+<a name="From-other-version-control-systems"></a>
+<div class="header">
+<p>
+Next: <a href="#From-scratch" accesskey="n" rel="next">From scratch</a>, 
Previous: <a href="#From-files" accesskey="p" rel="prev">From files</a>, Up: <a 
href="#Setting-up-the-files" accesskey="u" rel="up">Setting up the files</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Creating-Files-From-Other-Version-Control-Systems"></a>
+<h4 class="subsection">3.1.2 Creating Files From Other Version Control 
Systems</h4>
+<a name="index-Importing-files_002c-from-other-version-control-systems"></a>
+
+<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><a name="index-RCS_002c-importing-files-from"></a>
+</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 <samp>foo.c</samp> will have its
+<small>RCS</small> file in <samp>RCS/foo.c,v</samp> (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 <samp>RCS</samp> 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 <samp>sccs2rcs</samp> script mentioned below may be a
+useful example to follow.
+</p>
+<a name="index-SCCS_002c-importing-files-from"></a>
+</dd>
+<dt>From SCCS</dt>
+<dd><p>There is a script in the <samp>contrib</samp> directory of
+the <small>CVS</small> source distribution called <samp>sccs2rcs</samp>
+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>
+<a name="index-PVCS_002c-importing-files-from"></a>
+</dd>
+<dt>From PVCS</dt>
+<dd><p>There is a script in the <samp>contrib</samp> directory of
+the <small>CVS</small> source distribution called <samp>pvcs_to_rcs</samp>
+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>
+<a name="From-scratch"></a>
+<div class="header">
+<p>
+Previous: <a href="#From-other-version-control-systems" accesskey="p" 
rel="prev">From other version control systems</a>, Up: <a 
href="#Setting-up-the-files" accesskey="u" rel="up">Setting up the files</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Creating-a-directory-tree-from-scratch"></a>
+<h4 class="subsection">3.1.3 Creating a directory tree from scratch</h4>
+
+<p>For a new project, the easiest thing to do is probably
+to create an empty directory structure, like this:
+</p>
+<div class="example">
+<pre class="example">$ mkdir tc
+$ mkdir tc/man
+$ mkdir tc/testing
+</pre></div>
+
+<p>After that, you use the <code>import</code> command to create
+the corresponding (empty) directory structure inside
+the repository:
+</p>
+<div class="example">
+<pre class="example">$ cd tc
+$ cvs import -m &quot;Created directory structure&quot; 
yoyodyne/<var>dir</var> yoyo start
+</pre></div>
+
+<p>This will add yoyodyne/<var>dir</var> as a directory under
+<code>$CVSROOT</code>.
+</p>
+<p>Use <code>checkout</code> to get the new project.  Then, use 
<code>add</code>
+to add files (and new directories) as needed.
+</p>
+<div class="example">
+<pre class="example">$ cd ..
+$ cvs co yoyodyne/<var>dir</var>
+</pre></div>
+
+<p>Check that the permissions <small>CVS</small> sets on the
+directories inside <code>$CVSROOT</code> are reasonable.
+</p>
+<hr>
+<a name="Defining-the-module"></a>
+<div class="header">
+<p>
+Previous: <a href="#Setting-up-the-files" accesskey="p" rel="prev">Setting up 
the files</a>, Up: <a href="#Starting-a-new-project" accesskey="u" 
rel="up">Starting a new project</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Defining-the-module-1"></a>
+<h3 class="section">3.2 Defining the module</h3>
+<a name="index-Defining-a-module"></a>
+<a name="index-Editing-the-modules-file"></a>
+<a name="index-Module_002c-defining"></a>
+<a name="index-Modules-file_002c-changing"></a>
+
+<p>The next step is to define the module in the
+<samp>modules</samp> 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.
+
+<div class="example">
+<pre class="example">$ cvs checkout CVSROOT/modules
+$ cd CVSROOT
+</pre></div>
+
+</li><li> Edit the file and insert a line that defines the module.  See <a 
href="#Intro-administrative-files">Intro administrative files</a>, for an 
introduction.  See <a href="#modules">modules</a>, for a full
+description of the modules file.  You can use the
+following line to define the module &lsquo;<samp>tc</samp>&rsquo;:
+
+<div class="example">
+<pre class="example">tc   yoyodyne/tc
+</pre></div>
+
+</li><li> Commit your changes to the modules file.
+
+<div class="example">
+<pre class="example">$ cvs commit -m &quot;Added the tc module.&quot; modules
+</pre></div>
+
+</li><li> Release the modules module.
+
+<div class="example">
+<pre class="example">$ cd ..
+$ cvs release -d CVSROOT
+</pre></div>
+</li></ol>
+
+<hr>
+<a name="Revisions"></a>
+<div class="header">
+<p>
+Next: <a href="#Branching-and-merging" accesskey="n" rel="next">Branching and 
merging</a>, Previous: <a href="#Starting-a-new-project" accesskey="p" 
rel="prev">Starting a new project</a>, Up: <a href="#Top" accesskey="u" 
rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Revisions-1"></a>
+<h2 class="chapter">4 Revisions</h2>
+
+<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>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Revision-numbers" 
accesskey="1">Revision numbers</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">The meaning of a revision number
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#Versions-revisions-releases" accesskey="2">Versions revisions 
releases</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Terminology used in this manual
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Assigning-revisions" 
accesskey="3">Assigning revisions</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Assigning revisions
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Tags" 
accesskey="4">Tags</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Tags&ndash;Symbolic revisions
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#Tagging-the-working-directory" accesskey="5">Tagging the working 
directory</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">The cvs 
tag command
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Tagging-by-date_002ftag" 
accesskey="6">Tagging by date/tag</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">The cvs rtag command
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Modifying-tags" 
accesskey="7">Modifying tags</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Adding, renaming, and deleting tags
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Tagging-add_002fremove" 
accesskey="8">Tagging add/remove</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Tags with adding and removing files
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Sticky-tags" 
accesskey="9">Sticky tags</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Certain tags are persistent
+</td></tr>
+</table>
+
+<hr>
+<a name="Revision-numbers"></a>
+<div class="header">
+<p>
+Next: <a href="#Versions-revisions-releases" accesskey="n" rel="next">Versions 
revisions releases</a>, Up: <a href="#Revisions" accesskey="u" 
rel="up">Revisions</a> &nbsp; [<a href="#SEC_Contents" title="Table of 
contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Revision-numbers-1"></a>
+<h3 class="section">4.1 Revision numbers</h3>
+<a name="index-Revision-numbers"></a>
+<a name="index-Revision-tree"></a>
+<a name="index-Linear-development"></a>
+<a name="index-Number_002c-revision_002d"></a>
+<a name="index-Decimal-revision-number"></a>
+<a name="index-Branch-number"></a>
+<a name="index-Number_002c-branch"></a>
+
+<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>
+<div class="example">
+<pre class="example">       +-----+    +-----+    +-----+    +-----+    +-----+
+       ! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 !
+       +-----+    +-----+    +-----+    +-----+    +-----+
+</pre></div>
+
+<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 <a href="#Branching-and-merging">Branching and merging</a>); such 
revision numbers
+are explained in detail in <a href="#Branches-and-revisions">Branches and 
revisions</a>.
+</p>
+<hr>
+<a name="Versions-revisions-releases"></a>
+<div class="header">
+<p>
+Next: <a href="#Assigning-revisions" accesskey="n" rel="next">Assigning 
revisions</a>, Previous: <a href="#Revision-numbers" accesskey="p" 
rel="prev">Revision numbers</a>, Up: <a href="#Revisions" accesskey="u" 
rel="up">Revisions</a> &nbsp; [<a href="#SEC_Contents" title="Table of 
contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Versions_002c-revisions-and-releases"></a>
+<h3 class="section">4.2 Versions, revisions and releases</h3>
+<a name="index-Revisions_002c-versions-and-releases"></a>
+<a name="index-Versions_002c-revisions-and-releases"></a>
+<a name="index-Releases_002c-revisions-and-versions"></a>
+
+<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>
+<a name="Assigning-revisions"></a>
+<div class="header">
+<p>
+Next: <a href="#Tags" accesskey="n" rel="next">Tags</a>, Previous: <a 
href="#Versions-revisions-releases" accesskey="p" rel="prev">Versions revisions 
releases</a>, Up: <a href="#Revisions" accesskey="u" rel="up">Revisions</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Assigning-revisions-1"></a>
+<h3 class="section">4.3 Assigning revisions</h3>
+
+<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>.
+(When using client/server <small>CVS</small>,
+only files that are actually sent to the server are considered.)
+</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 <a href="#Tags">Tags</a>).  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>
+<div class="example">
+<pre class="example">$ cvs commit -r 3.0
+</pre></div>
+
+<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 <a 
href="#Branching-and-merging">Branching and merging</a>).
+</p>
+<hr>
+<a name="Tags"></a>
+<div class="header">
+<p>
+Next: <a href="#Tagging-the-working-directory" accesskey="n" 
rel="next">Tagging the working directory</a>, Previous: <a 
href="#Assigning-revisions" accesskey="p" rel="prev">Assigning revisions</a>, 
Up: <a href="#Revisions" accesskey="u" rel="up">Revisions</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Tags_002d_002dSymbolic-revisions"></a>
+<h3 class="section">4.4 Tags&ndash;Symbolic revisions</h3>
+<a name="index-Tags"></a>
+
+<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:
+<a name="index-RCS-revision-numbers"></a>
+</p>
+<div class="example">
+<pre class="example">ci.c            5.21
+co.c            5.9
+ident.c         5.3
+rcs.c           5.12
+rcsbase.h       5.11
+rcsdiff.c       5.10
+rcsedit.c       5.11
+rcsfcmp.c       5.9
+rcsgen.c        5.10
+rcslex.c        5.11
+rcsmap.c        5.2
+rcsutil.c       5.10
+</pre></div>
+
+<a name="index-tag_002c-command_002c-introduction"></a>
+<a name="index-Tag_002c-symbolic-name"></a>
+<a name="index-Symbolic-name-_0028tag_0029"></a>
+<a name="index-Name_002c-symbolic-_0028tag_0029"></a>
+<a name="index-HEAD_002c-as-reserved-tag-name"></a>
+<a name="index-BASE_002c-as-reserved-tag-name"></a>
+<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
+<samp>taginfo</samp> file (see <a href="#taginfo">taginfo</a>).
+</p>
+<a name="index-Adding-a-tag"></a>
+<a name="index-Tag_002c-example"></a>
+<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 <samp>backend.c</samp>
+resides.
+</p>
+<div class="example">
+<pre class="example">$ 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)
+
+</pre></div>
+
+<p>For a complete summary of the syntax of <code>cvs tag</code>,
+including the various options, see <a href="#Invoking-CVS">Invoking CVS</a>.
+</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>
+<div class="example">
+<pre class="example">$ cvs tag rel-1-0 .
+cvs tag: Tagging .
+T Makefile
+T backend.c
+T driver.c
+T frontend.c
+T parser.c
+</pre></div>
+
+<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 <a 
href="#Recursive-behavior">Recursive behavior</a>.)
+</p>
+<a name="index-Retrieving-an-old-revision-using-tags"></a>
+<a name="index-Tag_002c-retrieving-old-revisions"></a>
+<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>
+<div class="example">
+<pre class="example">$ cvs checkout -r rel-1-0 tc
+</pre></div>
+
+<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 <a href="#checkout-options">checkout options</a>.  When specifying 
&lsquo;<samp>-r</samp>&rsquo; to
+any of these commands, you will need beware of sticky
+tags; see <a href="#Sticky-tags">Sticky tags</a>.
+</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>
+<div class="example">
+<pre class="example">        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
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">        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
+</pre></div>
+
+<hr>
+<a name="Tagging-the-working-directory"></a>
+<div class="header">
+<p>
+Next: <a href="#Tagging-by-date_002ftag" accesskey="n" rel="next">Tagging by 
date/tag</a>, Previous: <a href="#Tags" accesskey="p" rel="prev">Tags</a>, Up: 
<a href="#Revisions" accesskey="u" rel="up">Revisions</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Specifying-what-to-tag-from-the-working-directory"></a>
+<h3 class="section">4.5 Specifying what to tag from the working directory</h3>
+
+<a name="index-tag-_0028subcommand_0029"></a>
+<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 <samp>backend.c</samp> 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>
+<div class="example">
+<pre class="example">$ cvs tag -c rel-0-4
+cvs tag: backend.c is locally modified
+cvs [tag aborted]: correct the above errors first!
+</pre></div>
+
+<hr>
+<a name="Tagging-by-date_002ftag"></a>
+<div class="header">
+<p>
+Next: <a href="#Modifying-tags" accesskey="n" rel="next">Modifying tags</a>, 
Previous: <a href="#Tagging-the-working-directory" accesskey="p" 
rel="prev">Tagging the working directory</a>, Up: <a href="#Revisions" 
accesskey="u" rel="up">Revisions</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Specifying-what-to-tag-by-date-or-revision"></a>
+<h3 class="section">4.6 Specifying what to tag by date or revision</h3>
+<a name="index-rtag-_0028subcommand_0029"></a>
+
+<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 <a href="#Common-options">Common options</a>, 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>
+<div class="example">
+<pre class="example">cvs tag -r 1.4 backend.c
+</pre></div>
+
+<hr>
+<a name="Modifying-tags"></a>
+<div class="header">
+<p>
+Next: <a href="#Tagging-add_002fremove" accesskey="n" rel="next">Tagging 
add/remove</a>, Previous: <a href="#Tagging-by-date_002ftag" accesskey="p" 
rel="prev">Tagging by date/tag</a>, Up: <a href="#Revisions" accesskey="u" 
rel="up">Revisions</a> &nbsp; [<a href="#SEC_Contents" title="Table of 
contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Deleting_002c-moving_002c-and-renaming-tags"></a>
+<h3 class="section">4.7 Deleting, moving, and renaming tags</h3>
+
+
+<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 the <samp>taginfo</samp> file (see <a 
href="#taginfo">taginfo</a>).</strong>
+</p>
+<a name="index-Deleting-tags"></a>
+<a name="index-Deleting-branch-tags"></a>
+<a name="index-Removing-tags"></a>
+<a name="index-Removing-branch-tags"></a>
+<a name="index-Tags_002c-deleting"></a>
+<a name="index-Branch-tags_002c-deleting"></a>
+<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>
+<div class="example">
+<pre class="example">cvs rtag -d rel-0-4 tc
+</pre></div>
+
+<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>
+<a name="index-Moving-tags"></a>
+<a name="index-Moving-branch-tags"></a>
+<a name="index-Tags_002c-moving"></a>
+<a name="index-Branch-tags_002c-moving"></a>
+<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 <samp>backend.c</samp> 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>
+<div class="example">
+<pre class="example">cvs tag -r 1.6 -F stable backend.c
+</pre></div>
+
+<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>
+<a name="index-Renaming-tags"></a>
+<a name="index-Tags_002c-renaming"></a>
+<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>
+<div class="example">
+<pre class="example">cvs rtag -r old-name-0-4 rel-0-4 tc
+cvs rtag -d old-name-0-4 tc
+</pre></div>
+
+<hr>
+<a name="Tagging-add_002fremove"></a>
+<div class="header">
+<p>
+Next: <a href="#Sticky-tags" accesskey="n" rel="next">Sticky tags</a>, 
Previous: <a href="#Modifying-tags" accesskey="p" rel="prev">Modifying 
tags</a>, Up: <a href="#Revisions" accesskey="u" rel="up">Revisions</a> &nbsp; 
[<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Tagging-and-adding-and-removing-files"></a>
+<h3 class="section">4.8 Tagging and adding and removing files</h3>
+
+<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>
+<a name="Sticky-tags"></a>
+<div class="header">
+<p>
+Previous: <a href="#Tagging-add_002fremove" accesskey="p" rel="prev">Tagging 
add/remove</a>, Up: <a href="#Revisions" accesskey="u" rel="up">Revisions</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Sticky-tags-1"></a>
+<h3 class="section">4.9 Sticky tags</h3>
+<a name="index-Sticky-tags"></a>
+<a name="index-Tags_002c-sticky"></a>
+
+
+<p>Sometimes a working copy&rsquo;s revision has extra data
+associated with it, for example it might be on a branch
+(see <a href="#Branching-and-merging">Branching and merging</a>), 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>
+<div class="example">
+<pre class="example">$ 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)
+
+</pre></div>
+
+<a name="index-Resetting-sticky-tags"></a>
+<a name="index-Sticky-tags_002c-resetting"></a>
+<a name="index-Deleting-sticky-tags"></a>
+<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 (other than sticky &lsquo;<samp>-k</samp>&rsquo; options on 
locally
+modified files).  See <a href="#update">update</a> for more on the operation
+of <code>cvs update</code>.
+</p>
+<a name="index-Sticky-date"></a>
+<p>The most common use of sticky tags is to identify which
+branch one is working on, as described in
+<a href="#Accessing-branches">Accessing branches</a>.  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><div class="example">
+<pre class="example">$ 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
+***************
+$
+</pre></div>
+
+<p>However, this isn&rsquo;t the easiest way, if you are asking
+how to undo a previous checkin (in this example, put
+<samp>file1</samp> 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 <a href="#Merging-two-revisions">Merging two revisions</a>.
+</p>
+<hr>
+<a name="Branching-and-merging"></a>
+<div class="header">
+<p>
+Next: <a href="#Recursive-behavior" accesskey="n" rel="next">Recursive 
behavior</a>, Previous: <a href="#Revisions" accesskey="p" 
rel="prev">Revisions</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Branching-and-merging-1"></a>
+<h2 class="chapter">5 Branching and merging</h2>
+<a name="index-Branching"></a>
+<a name="index-Merging"></a>
+<a name="index-Copying-changes"></a>
+<a name="index-Main-trunk-and-branches"></a>
+<a name="index-Revision-tree_002c-making-branches"></a>
+<a name="index-Branches_002c-copying-changes-between"></a>
+<a name="index-Changes_002c-copying-between-branches"></a>
+<a name="index-Modifications_002c-copying-between-branches"></a>
+
+<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>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Branches-motivation" 
accesskey="1">Branches motivation</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">What branches are good for
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Creating-a-branch" 
accesskey="2">Creating a branch</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Creating a branch
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Accessing-branches" 
accesskey="3">Accessing branches</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Checking out and updating branches
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Branches-and-revisions" 
accesskey="4">Branches and revisions</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Branches are reflected in revision numbers
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Magic-branch-numbers" 
accesskey="5">Magic branch numbers</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Magic branch numbers
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Merging-a-branch" 
accesskey="6">Merging a branch</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Merging an entire branch
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Merging-more-than-once" 
accesskey="7">Merging more than once</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Merging from a branch several times
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Merging-two-revisions" 
accesskey="8">Merging two revisions</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Merging differences between two revisions
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Merging-adds-and-removals" 
accesskey="9">Merging adds and removals</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">What if files are added or removed?
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#Merging-and-keywords">Merging and 
keywords</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Avoiding 
conflicts due to keyword substitution
+</td></tr>
+</table>
+
+<hr>
+<a name="Branches-motivation"></a>
+<div class="header">
+<p>
+Next: <a href="#Creating-a-branch" accesskey="n" rel="next">Creating a 
branch</a>, Up: <a href="#Branching-and-merging" accesskey="u" 
rel="up">Branching and merging</a> &nbsp; [<a href="#SEC_Contents" title="Table 
of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="What-branches-are-good-for"></a>
+<h3 class="section">5.1 What branches are good for</h3>
+<a name="index-Branches-motivation"></a>
+<a name="index-What-branches-are-good-for"></a>
+<a name="index-Motivation-for-branches"></a>
+
+<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 <a href="#Tags">Tags</a>) 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
+bug fix 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>
+<a name="Creating-a-branch"></a>
+<div class="header">
+<p>
+Next: <a href="#Accessing-branches" accesskey="n" rel="next">Accessing 
branches</a>, Previous: <a href="#Branches-motivation" accesskey="p" 
rel="prev">Branches motivation</a>, Up: <a href="#Branching-and-merging" 
accesskey="u" rel="up">Branching and merging</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Creating-a-branch-1"></a>
+<h3 class="section">5.2 Creating a branch</h3>
+<a name="index-Creating-a-branch"></a>
+<a name="index-Branch_002c-creating-a"></a>
+<a name="index-tag_002c-creating-a-branch-using"></a>
+<a name="index-rtag_002c-creating-a-branch-using"></a>
+
+<p>You can create a branch with <code>tag -b</code>; for
+example, assuming you&rsquo;re in a working copy:
+</p>
+<div class="example">
+<pre class="example">$ cvs tag -b rel-1-0-patches
+</pre></div>
+
+
+<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 <a href="#Accessing-branches">Accessing branches</a>.
+</p>
+<p>You can also create a branch without reference to any
+working copy, by using <code>rtag</code>:
+</p>
+<div class="example">
+<pre class="example">$ cvs rtag -b -r rel-1-0 rel-1-0-patches tc
+</pre></div>
+
+<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>
+<a name="Accessing-branches"></a>
+<div class="header">
+<p>
+Next: <a href="#Branches-and-revisions" accesskey="n" rel="next">Branches and 
revisions</a>, Previous: <a href="#Creating-a-branch" accesskey="p" 
rel="prev">Creating a branch</a>, Up: <a href="#Branching-and-merging" 
accesskey="u" rel="up">Branching and merging</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Accessing-branches-1"></a>
+<h3 class="section">5.3 Accessing branches</h3>
+<a name="index-Check-out-a-branch"></a>
+<a name="index-Retrieve-a-branch"></a>
+<a name="index-Access-a-branch"></a>
+<a name="index-Identifying-a-branch"></a>
+<a name="index-Branch_002c-check-out"></a>
+<a name="index-Branch_002c-retrieving"></a>
+<a name="index-Branch_002c-accessing"></a>
+<a name="index-Branch_002c-identifying"></a>
+
+<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 <a href="#Creating-a-branch">Creating a 
branch</a>):
+</p>
+<div class="example">
+<pre class="example">$ cvs checkout -r rel-1-0-patches tc
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">$ cvs update -r rel-1-0-patches tc
+</pre></div>
+
+<p>or equivalently:
+</p>
+<div class="example">
+<pre class="example">$ cd tc
+$ cvs update -r rel-1-0-patches
+</pre></div>
+
+<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>
+<a name="index-Branches_002c-sticky"></a>
+<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 <a 
href="#Sticky-tags">Sticky tags</a>)
+&ndash; that&rsquo;s <small>CVS</small>&rsquo;s way of telling you the branch, 
if
+any, of the current working files:
+</p>
+<div class="example">
+<pre class="example">$ 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)
+
+</pre></div>
+
+<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 <a href="#Branches-and-revisions">Branches and revisions</a> for 
details about how
+branch numbers are constructed.
+</p>
+<hr>
+<a name="Branches-and-revisions"></a>
+<div class="header">
+<p>
+Next: <a href="#Magic-branch-numbers" accesskey="n" rel="next">Magic branch 
numbers</a>, Previous: <a href="#Accessing-branches" accesskey="p" 
rel="prev">Accessing branches</a>, Up: <a href="#Branching-and-merging" 
accesskey="u" rel="up">Branching and merging</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Branches-and-revisions-1"></a>
+<h3 class="section">5.4 Branches and revisions</h3>
+<a name="index-Branch-number-1"></a>
+<a name="index-Number_002c-branch-1"></a>
+<a name="index-Revision-numbers-_0028branches_0029"></a>
+
+<p>Ordinarily, a file&rsquo;s revision history is a linear
+series of increments (see <a href="#Revision-numbers">Revision numbers</a>):
+</p>
+<div class="example">
+<pre class="example">       +-----+    +-----+    +-----+    +-----+    +-----+
+       ! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 !
+       +-----+    +-----+    +-----+    +-----+    +-----+
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">                                                      
+-------------+
+                           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 !
+                    +---------+    +---------+    +---------+
+
+</pre></div>
+
+
+
+<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 <a href="#Magic-branch-numbers">Magic branch numbers</a>).  The branch 
1.1.1 has a
+special meaning.  See <a href="#Tracking-sources">Tracking sources</a>.
+</p>
+<hr>
+<a name="Magic-branch-numbers"></a>
+<div class="header">
+<p>
+Next: <a href="#Merging-a-branch" accesskey="n" rel="next">Merging a 
branch</a>, Previous: <a href="#Branches-and-revisions" accesskey="p" 
rel="prev">Branches and revisions</a>, Up: <a href="#Branching-and-merging" 
accesskey="u" rel="up">Branching and merging</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Magic-branch-numbers-1"></a>
+<h3 class="section">5.5 Magic branch numbers</h3>
+
+
+<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 <a href="#Revision-numbers">Revision 
numbers</a>.  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
+<samp>numbers.c</samp> you can do this:
+</p>
+<div class="example">
+<pre class="example">$ cvs admin -NR4patches:1.4.2 numbers.c
+</pre></div>
+
+<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>
+<a name="Merging-a-branch"></a>
+<div class="header">
+<p>
+Next: <a href="#Merging-more-than-once" accesskey="n" rel="next">Merging more 
than once</a>, Previous: <a href="#Magic-branch-numbers" accesskey="p" 
rel="prev">Magic branch numbers</a>, Up: <a href="#Branching-and-merging" 
accesskey="u" rel="up">Branching and merging</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Merging-an-entire-branch"></a>
+<h3 class="section">5.6 Merging an entire branch</h3>
+<a name="index-Merging-a-branch"></a>
+<a name="index-_002dj-_0028merging-branches_0029"></a>
+
+<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>
+<a name="index-Join"></a>
+<p>The &lsquo;<samp>-j</samp>&rsquo; stands for &ldquo;join&rdquo;.
+</p>
+<a name="index-Branch-merge-example"></a>
+<a name="index-Example_002c-branch-merge"></a>
+<a name="index-Merge_002c-branch-example"></a>
+<p>Consider this revision tree:
+</p>
+<div class="example">
+<pre class="example">+-----+    +-----+    +-----+    +-----+
+! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !      &lt;- The main trunk
++-----+    +-----+    +-----+    +-----+
+                !
+                !
+                !   +---------+    +---------+
+Branch R1fix -&gt; +---! 1.2.2.1 !----! 1.2.2.2 !
+                    +---------+    +---------+
+</pre></div>
+
+<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, <samp>m.c</samp>.
+</p>
+<div class="example">
+<pre class="example">$ 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>
+</pre></div>
+
+<p>A conflict can result from a merge operation.  If that
+happens, you should resolve it before committing the
+new revision.  See <a href="#Conflicts-example">Conflicts example</a>.
+</p>
+<p>If your source files contain keywords (see <a 
href="#Keyword-substitution">Keyword substitution</a>),
+you might be getting more conflicts than strictly necessary.  See
+<a href="#Merging-and-keywords">Merging and keywords</a>, 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>
+<div class="example">
+<pre class="example">$ cvs checkout -j R1fix mod
+$ cvs commit -m &quot;Included R1fix&quot;
+</pre></div>
+
+<p>It should be noted that <code>update -j <var>tagname</var></code> will also 
work but may
+not produce the desired result.  See <a 
href="#Merging-adds-and-removals">Merging adds and removals</a>, for more.
+</p>
+<hr>
+<a name="Merging-more-than-once"></a>
+<div class="header">
+<p>
+Next: <a href="#Merging-two-revisions" accesskey="n" rel="next">Merging two 
revisions</a>, Previous: <a href="#Merging-a-branch" accesskey="p" 
rel="prev">Merging a branch</a>, Up: <a href="#Branching-and-merging" 
accesskey="u" rel="up">Branching and merging</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Merging-from-a-branch-several-times"></a>
+<h3 class="section">5.7 Merging from a branch several times</h3>
+
+<p>Continuing our example, the revision tree now looks
+like this:
+</p>
+<div class="example">
+<pre class="example">+-----+    +-----+    +-----+    +-----+    +-----+
+! 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 !
+                    +---------+    +---------+
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">+-----+    +-----+    +-----+    +-----+    +-----+
+! 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 !
+                    +---------+    +---------+    +---------+
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">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>
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">cvs update -j R1fix:yesterday -j R1fix m.c
+</pre></div>
+
+<p>Better yet, tag the R1fix branch after every merge into
+the trunk, and then use that tag for subsequent merges:
+</p>
+<div class="example">
+<pre class="example">cvs update -j merged_from_R1fix_to_trunk -j R1fix m.c
+</pre></div>
+
+<hr>
+<a name="Merging-two-revisions"></a>
+<div class="header">
+<p>
+Next: <a href="#Merging-adds-and-removals" accesskey="n" rel="next">Merging 
adds and removals</a>, Previous: <a href="#Merging-more-than-once" 
accesskey="p" rel="prev">Merging more than once</a>, Up: <a 
href="#Branching-and-merging" accesskey="u" rel="up">Branching and merging</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Merging-differences-between-any-two-revisions"></a>
+<h3 class="section">5.8 Merging differences between any two revisions</h3>
+<a name="index-Merging-two-revisions"></a>
+<a name="index-Revisions_002c-merging-differences-between"></a>
+<a name="index-Differences_002c-merging"></a>
+
+<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>
+<a name="index-Undoing-a-change"></a>
+<a name="index-Removing-a-change"></a>
+<div class="example">
+<pre class="example">$ cvs update -j 1.5 -j 1.3 backend.c
+</pre></div>
+
+<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>
+<a name="index-Restoring-old-version-of-removed-file"></a>
+<a name="index-Resurrecting-old-version-of-dead-file"></a>
+<p>Specifying two &lsquo;<samp>-j</samp>&rsquo; options can also undo file
+removals or additions.  For example, suppose you have
+a file
+named <samp>file1</samp> 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>
+<div class="example">
+<pre class="example">$ 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
+$
+</pre></div>
+
+<hr>
+<a name="Merging-adds-and-removals"></a>
+<div class="header">
+<p>
+Next: <a href="#Merging-and-keywords" accesskey="n" rel="next">Merging and 
keywords</a>, Previous: <a href="#Merging-two-revisions" accesskey="p" 
rel="prev">Merging two revisions</a>, Up: <a href="#Branching-and-merging" 
accesskey="u" rel="up">Branching and merging</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Merging-can-add-or-remove-files"></a>
+<h3 class="section">5.9 Merging can add or remove files</h3>
+
+<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><div class="example">
+<pre class="example">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
+</pre></div>
+
+<p>After these commands are executed and a &lsquo;<samp>cvs 
commit</samp>&rsquo; is done,
+file <samp>a</samp> will be removed and file <samp>d</samp> 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>
+<a name="Merging-and-keywords"></a>
+<div class="header">
+<p>
+Previous: <a href="#Merging-adds-and-removals" accesskey="p" 
rel="prev">Merging adds and removals</a>, Up: <a href="#Branching-and-merging" 
accesskey="u" rel="up">Branching and merging</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Merging-and-keywords-1"></a>
+<h3 class="section">5.10 Merging and keywords</h3>
+<a name="index-Merging_002c-and-keyword-substitution"></a>
+<a name="index-Keyword-substitution_002c-and-merging"></a>
+<a 
name="index-_002dj-_0028merging-branches_0029_002c-and-keyword-substitution"></a>
+<a name="index-_002dkk_002c-to-avoid-conflicts-during-a-merge"></a>
+
+<p>If you merge files containing keywords (see <a 
href="#Keyword-substitution">Keyword substitution</a>), 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 <a href="#Substitution-modes">Substitution 
modes</a>) 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>
+<div class="example">
+<pre class="example">       +---------+
+      _! 1.1.2.1 !   &lt;-  br1
+     / +---------+
+    /
+   /
++-----+    +-----+
+! 1.1 !----! 1.2 !
++-----+    +-----+
+</pre></div>
+
+<p>and your working directory is currently on the trunk
+(revision 1.2).  Then you might get the following
+results from a merge:
+</p>
+<div class="example">
+<pre class="example">$ 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
+. . .
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">$ 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$
+. . .
+</pre></div>
+
+<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>There is, however, one major caveat with using
+&lsquo;<samp>-kk</samp>&rsquo; on merges.  Namely, it overrides whatever
+keyword expansion mode <small>CVS</small> would normally have
+used.  In particular, this is a problem if the mode had
+been &lsquo;<samp>-kb</samp>&rsquo; for a binary file.  Therefore, if your
+repository contains binary files, you will need to deal
+with the conflicts rather than using &lsquo;<samp>-kk</samp>&rsquo;.
+</p>
+
+<p>As a result of using &lsquo;<samp>-kk</samp>&rsquo; during the merge, each 
file examined by the
+update will have &lsquo;<samp>-kk</samp>&rsquo; set as sticky options.  
Running <code>update -A</code>
+will clear the sticky options on unmodified files, but it will not clear
+the sticky options on modified files.  To get back to the default keyword
+substitution for modified files, you must commit the results of the merge
+and then run <code>update -A</code>.
+</p>
+<hr>
+<a name="Recursive-behavior"></a>
+<div class="header">
+<p>
+Next: <a href="#Adding-and-removing" accesskey="n" rel="next">Adding and 
removing</a>, Previous: <a href="#Branching-and-merging" accesskey="p" 
rel="prev">Branching and merging</a>, Up: <a href="#Top" accesskey="u" 
rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Recursive-behavior-1"></a>
+<h2 class="chapter">6 Recursive behavior</h2>
+<a name="index-Recursive-_0028directory-descending_0029"></a>
+<a name="index-Directory_002c-descending"></a>
+<a name="index-Descending-directories"></a>
+<a name="index-Subdirectories"></a>
+
+<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>
+<div class="example">
+<pre class="example">      <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>
+</pre></div>
+
+<p>If <samp>tc</samp> is the current working directory, the
+following is true:
+</p>
+<ul>
+<li> &lsquo;<samp>cvs update testing</samp>&rsquo; is equivalent to
+
+<div class="example">
+<pre class="example">cvs update testing/testpgm.t testing/test2.t
+</pre></div>
+
+</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, <samp>.</samp> 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 <samp>~/.cvsrc</samp> (see <a 
href="#g_t_007e_002f_002ecvsrc">~/.cvsrc</a>).
+</p>
+<div class="example">
+<pre class="example">$ cvs update -l         # <span class="roman">Don&rsquo;t 
update files in subdirectories</span>
+</pre></div>
+
+<hr>
+<a name="Adding-and-removing"></a>
+<div class="header">
+<p>
+Next: <a href="#History-browsing" accesskey="n" rel="next">History 
browsing</a>, Previous: <a href="#Recursive-behavior" accesskey="p" 
rel="prev">Recursive behavior</a>, Up: <a href="#Top" accesskey="u" 
rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Adding_002c-removing_002c-and-renaming-files-and-directories"></a>
+<h2 class="chapter">7 Adding, removing, and renaming files and directories</h2>
+
+<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>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Adding-files" 
accesskey="1">Adding files</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Adding files
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Removing-files" 
accesskey="2">Removing files</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Removing files
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Removing-directories" 
accesskey="3">Removing directories</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Removing directories
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Moving-files" 
accesskey="4">Moving files</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Moving and renaming files
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Moving-directories" 
accesskey="5">Moving directories</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Moving and renaming directories
+</td></tr>
+</table>
+
+<hr>
+<a name="Adding-files"></a>
+<div class="header">
+<p>
+Next: <a href="#Removing-files" accesskey="n" rel="next">Removing files</a>, 
Up: <a href="#Adding-and-removing" accesskey="u" rel="up">Adding and 
removing</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Adding-files-to-a-directory"></a>
+<h3 class="section">7.1 Adding files to a directory</h3>
+<a name="index-Adding-files"></a>
+
+<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 <a href="#Getting-the-source">Getting the source</a>.
+
+</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 <a 
href="#Binary-files">Binary files</a>).
+
+</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 have to explicitly name files and
+directories that you wish to add to the repository.
+However, each directory will need to be added
+separately before you will be able to add new files
+to those directories.
+</p>
+<div class="example">
+<pre class="example">$ mkdir -p foo/bar
+$ cp ~/myfile foo/bar/myfile
+$ cvs add foo foo/bar
+$ cvs add foo/bar/myfile
+</pre></div>
+
+<a name="index-add-_0028subcommand_0029"></a>
+<dl>
+<dt><a name="index-cvs-add"></a>Command: <strong>cvs add</strong> 
<em>[<code>-k</code> kflag] [<code>-m</code> message] files &hellip;</em></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 <a href="#import">import</a>.
+</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 <a href="#Removing-files">Removing files</a>, 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
+<a href="#Substitution-modes">Substitution modes</a>.
+</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 <a href="#history-file">history file</a>).  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 <a href="#admin">admin</a>.  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
+<samp>backend.c</samp> to the repository:
+</p>
+<div class="example">
+<pre class="example">$ cvs add backend.c
+$ cvs commit -m &quot;Early version. Not yet compilable.&quot; backend.c
+</pre></div>
+
+<p>When you add a file it is added only on the branch
+which you are working on (see <a href="#Branching-and-merging">Branching and 
merging</a>).  You can
+later merge the additions to another branch if you want
+(see <a href="#Merging-adds-and-removals">Merging adds and removals</a>).
+</p>
+<hr>
+<a name="Removing-files"></a>
+<div class="header">
+<p>
+Next: <a href="#Removing-directories" accesskey="n" rel="next">Removing 
directories</a>, Previous: <a href="#Adding-files" accesskey="p" 
rel="prev">Adding files</a>, Up: <a href="#Adding-and-removing" accesskey="u" 
rel="up">Adding and removing</a> &nbsp; [<a href="#SEC_Contents" title="Table 
of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Removing-files-1"></a>
+<h3 class="section">7.2 Removing files</h3>
+<a name="index-Removing-files"></a>
+<a name="index-Deleting-files"></a>
+
+<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 <a href="#Viewing-differences">Viewing 
differences</a>,
+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>
+<a name="index-Remove-_0028subcommand_0029"></a>
+<dl>
+<dt><a name="index-cvs-remove"></a>Command: <strong>cvs remove</strong> 
<em>[options] files &hellip;</em></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 <a href="#Invoking-CVS">Invoking CVS</a>.
+</p></dd></dl>
+
+<p>Here is an example of removing several files:
+</p>
+<div class="example">
+<pre class="example">$ cd test
+$ rm *.c
+$ cvs remove
+cvs remove: Removing .
+cvs remove: scheduling a.c for removal
+cvs remove: scheduling b.c for removal
+cvs remove: use 'cvs commit' to remove these files permanently
+$ cvs ci -m &quot;Removed unneeded files&quot;
+cvs commit: Examining .
+cvs commit: Committing .
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">$ 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 .
+</pre></div>
+
+<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>
+
+<div class="example">
+<pre class="example">$ ls
+CVS   ja.h  oj.c
+$ rm oj.c
+$ cvs remove oj.c
+cvs remove: scheduling oj.c for removal
+cvs remove: use 'cvs commit' to remove this file permanently
+$ cvs add oj.c
+U oj.c
+cvs add: oj.c, version 1.1.1.1, resurrected
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">$ rm oj.c
+$ cvs update oj.c
+cvs update: warning: oj.c was lost
+U oj.c
+</pre></div>
+
+<p>When you remove a file it is removed only on the branch
+which you are working on (see <a href="#Branching-and-merging">Branching and 
merging</a>).  You can
+later merge the removals to another branch if you want
+(see <a href="#Merging-adds-and-removals">Merging adds and removals</a>).
+</p>
+<hr>
+<a name="Removing-directories"></a>
+<div class="header">
+<p>
+Next: <a href="#Moving-files" accesskey="n" rel="next">Moving files</a>, 
Previous: <a href="#Removing-files" accesskey="p" rel="prev">Removing 
files</a>, Up: <a href="#Adding-and-removing" accesskey="u" rel="up">Adding and 
removing</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Removing-directories-1"></a>
+<h3 class="section">7.3 Removing directories</h3>
+<a name="index-Removing-directories"></a>
+<a name="index-Directories_002c-removing"></a>
+
+<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 <samp>.keepme</samp>) 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>
+<a name="Moving-files"></a>
+<div class="header">
+<p>
+Next: <a href="#Moving-directories" accesskey="n" rel="next">Moving 
directories</a>, Previous: <a href="#Removing-directories" accesskey="p" 
rel="prev">Removing directories</a>, Up: <a href="#Adding-and-removing" 
accesskey="u" rel="up">Adding and removing</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Moving-and-renaming-files"></a>
+<h3 class="section">7.4 Moving and renaming files</h3>
+<a name="index-Moving-files"></a>
+<a name="index-Renaming-files"></a>
+<a name="index-Files_002c-moving"></a>
+
+<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 <a href="#Moving-directories">Moving 
directories</a>.).
+</p>
+<p>The examples below assume that the file <var>old</var> is renamed to
+<var>new</var>.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Outside" 
accesskey="1">Outside</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">The normal way to Rename
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Inside" 
accesskey="2">Inside</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">A tricky, alternative way
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Rename-by-copying" 
accesskey="3">Rename by copying</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Another tricky, alternative way
+</td></tr>
+</table>
+
+<hr>
+<a name="Outside"></a>
+<div class="header">
+<p>
+Next: <a href="#Inside" accesskey="n" rel="next">Inside</a>, Up: <a 
href="#Moving-files" accesskey="u" rel="up">Moving files</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="The-Normal-way-to-Rename"></a>
+<h4 class="subsection">7.4.1 The Normal way to Rename</h4>
+
+
+<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>
+<div class="example">
+<pre class="example">$ 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>
+</pre></div>
+
+<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 <a href="#Assigning-revisions">Assigning revisions</a>.
+</p>
+<hr>
+<a name="Inside"></a>
+<div class="header">
+<p>
+Next: <a href="#Rename-by-copying" accesskey="n" rel="next">Rename by 
copying</a>, Previous: <a href="#Outside" accesskey="p" rel="prev">Outside</a>, 
Up: <a href="#Moving-files" accesskey="u" rel="up">Moving files</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Moving-the-history-file"></a>
+<h4 class="subsection">7.4.2 Moving the history file</h4>
+
+<p>This method is more dangerous, since it involves moving
+files inside the repository.  Read this entire section
+before trying it out!
+</p>
+<div class="example">
+<pre class="example">$ cd $CVSROOT/<var>dir</var>
+$ mv <var>old</var>,v <var>new</var>,v
+</pre></div>
+
+<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>
+<a name="Rename-by-copying"></a>
+<div class="header">
+<p>
+Previous: <a href="#Inside" accesskey="p" rel="prev">Inside</a>, Up: <a 
href="#Moving-files" accesskey="u" rel="up">Moving files</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Copying-the-history-file"></a>
+<h4 class="subsection">7.4.3 Copying the history file</h4>
+
+<p>This way also involves direct modifications to the
+repository.  It is safe, but not without drawbacks.
+</p>
+<div class="example">
+<pre class="example"># <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;
+</pre></div>
+
+<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>
+<a name="Moving-directories"></a>
+<div class="header">
+<p>
+Previous: <a href="#Moving-files" accesskey="p" rel="prev">Moving files</a>, 
Up: <a href="#Adding-and-removing" accesskey="u" rel="up">Adding and 
removing</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Moving-and-renaming-directories"></a>
+<h3 class="section">7.5 Moving and renaming directories</h3>
+<a name="index-Moving-directories"></a>
+<a name="index-Renaming-directories"></a>
+<a name="index-Directories_002c-moving"></a>
+
+<p>The normal way to rename or move a directory is to
+rename or move each file within it as described in
+<a href="#Outside">Outside</a>.  Then check out with the 
&lsquo;<samp>-P</samp>&rsquo;
+option, as described in <a href="#Removing-directories">Removing 
directories</a>.
+</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 in all their
+copies of the project containing the directory to be removed, and remove
+all their working copies of said project, before you take the steps below.
+
+</li><li> Rename the directory inside the repository.
+
+<div class="example">
+<pre class="example">$ cd $CVSROOT/<var>parent-dir</var>
+$ mv <var>old-dir</var> <var>new-dir</var>
+</pre></div>
+
+</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>
+<a name="History-browsing"></a>
+<div class="header">
+<p>
+Next: <a href="#Binary-files" accesskey="n" rel="next">Binary files</a>, 
Previous: <a href="#Adding-and-removing" accesskey="p" rel="prev">Adding and 
removing</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="History-browsing-1"></a>
+<h2 class="chapter">8 History browsing</h2>
+<a name="index-History-browsing"></a>
+<a name="index-Traceability"></a>
+<a name="index-Isolation"></a>
+
+
+<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>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#log-messages" 
accesskey="1">log messages</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Log messages
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#history-database" 
accesskey="2">history database</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">The history database
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#user_002ddefined-logging" 
accesskey="3">user-defined logging</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">User-defined logging
+</td></tr>
+</table>
+
+<hr>
+<a name="log-messages"></a>
+<div class="header">
+<p>
+Next: <a href="#history-database" accesskey="n" rel="next">history 
database</a>, Up: <a href="#History-browsing" accesskey="u" rel="up">History 
browsing</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Log-messages"></a>
+<h3 class="section">8.1 Log messages</h3>
+
+<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 <a href="#log">log</a>).
+</p>
+<hr>
+<a name="history-database"></a>
+<div class="header">
+<p>
+Next: <a href="#user_002ddefined-logging" accesskey="n" 
rel="next">user-defined logging</a>, Previous: <a href="#log-messages" 
accesskey="p" rel="prev">log messages</a>, Up: <a href="#History-browsing" 
accesskey="u" rel="up">History browsing</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="The-history-database"></a>
+<h3 class="section">8.2 The history database</h3>
+
+<p>You can use the history file (see <a href="#history-file">history file</a>) 
to
+log various <small>CVS</small> actions.  To retrieve the
+information from the history file, use the <code>cvs
+history</code> command (see <a href="#history">history</a>).
+</p>
+<p>Note: you can control what is logged to this file by using the
+&lsquo;<samp>LogHistory</samp>&rsquo; keyword in the 
<samp>CVSROOT/config</samp> file
+(see <a href="#config">config</a>).
+</p>
+
+<hr>
+<a name="user_002ddefined-logging"></a>
+<div class="header">
+<p>
+Previous: <a href="#history-database" accesskey="p" rel="prev">history 
database</a>, Up: <a href="#History-browsing" accesskey="u" rel="up">History 
browsing</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="User_002ddefined-logging"></a>
+<h3 class="section">8.3 User-defined logging</h3>
+
+<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 <samp>loginfo</samp> file (see <a 
href="#loginfo">loginfo</a>).
+To log tags, use the <samp>taginfo</samp> file (see <a 
href="#taginfo">taginfo</a>).
+To log checkouts, exports, and tags,
+respectively, you can also use the
+&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 <a 
href="#Getting-Notified">Getting Notified</a>); this command is useful even if 
you are not
+using <code>cvs watch on</code>.
+</p>
+<hr>
+<a name="Binary-files"></a>
+<div class="header">
+<p>
+Next: <a href="#Multiple-developers" accesskey="n" rel="next">Multiple 
developers</a>, Previous: <a href="#History-browsing" accesskey="p" 
rel="prev">History browsing</a>, Up: <a href="#Top" accesskey="u" 
rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Handling-binary-files"></a>
+<h2 class="chapter">9 Handling binary files</h2>
+<a name="index-Binary-files"></a>
+
+<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>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Binary-why" 
accesskey="1">Binary why</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">More details on issues with binary files
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Binary-howto" 
accesskey="2">Binary howto</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">How to store them
+</td></tr>
+</table>
+
+<hr>
+<a name="Binary-why"></a>
+<div class="header">
+<p>
+Next: <a href="#Binary-howto" accesskey="n" rel="next">Binary howto</a>, Up: 
<a href="#Binary-files" accesskey="u" rel="up">Binary files</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="The-issues-with-binary-files"></a>
+<h3 class="section">9.1 The issues with binary files</h3>
+
+<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 <a href="#Multiple-developers">Multiple developers</a>).  The second is 
when one
+merges explicitly with the &lsquo;<samp>update -j</samp>&rsquo; command
+(see <a href="#Branching-and-merging">Branching and merging</a>).
+</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
+<a href="#Multiple-developers">Multiple developers</a>.  To avoid the merges
+resulting from branches, restrict use of branches.
+</p>
+<hr>
+<a name="Binary-howto"></a>
+<div class="header">
+<p>
+Previous: <a href="#Binary-why" accesskey="p" rel="prev">Binary why</a>, Up: 
<a href="#Binary-files" accesskey="u" rel="up">Binary files</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="How-to-store-binary-files"></a>
+<h3 class="section">9.2 How to store binary files</h3>
+
+<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 <a 
href="#Keyword-substitution">Keyword substitution</a>), 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>
+<div class="example">
+<pre class="example">$ 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
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">$ 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
+</pre></div>
+
+<p>When you check in the file <samp>kotest</samp> 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 <a 
href="#Wrappers">Wrappers</a>.
+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>
+<a name="Multiple-developers"></a>
+<div class="header">
+<p>
+Next: <a href="#Revision-management" accesskey="n" rel="next">Revision 
management</a>, Previous: <a href="#Binary-files" accesskey="p" 
rel="prev">Binary files</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Multiple-developers-1"></a>
+<h2 class="chapter">10 Multiple developers</h2>
+<a name="index-Multiple-developers"></a>
+<a name="index-Team-of-developers"></a>
+<a name="index-File-locking"></a>
+<a name="index-Locking-files"></a>
+<a name="index-Working-copy"></a>
+<a name="index-Reserved-checkouts"></a>
+<a name="index-Unreserved-checkouts"></a>
+<a name="index-RCS_002dstyle-locking"></a>
+
+<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 <a href="#admin-options">admin 
options</a>).  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>
+
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#File-status" 
accesskey="1">File status</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">A file can be in several states
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Updating-a-file" 
accesskey="2">Updating a file</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Bringing a file up-to-date
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Conflicts-example" 
accesskey="3">Conflicts example</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">An informative example
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Informing-others" 
accesskey="4">Informing others</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">To cooperate you must inform
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Concurrency" 
accesskey="5">Concurrency</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Simultaneous repository access
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Watches" 
accesskey="6">Watches</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Mechanisms to track who is editing files
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Choosing-a-model" 
accesskey="7">Choosing a model</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Reserved or unreserved checkouts?
+</td></tr>
+</table>
+
+<hr>
+<a name="File-status"></a>
+<div class="header">
+<p>
+Next: <a href="#Updating-a-file" accesskey="n" rel="next">Updating a file</a>, 
Up: <a href="#Multiple-developers" accesskey="u" rel="up">Multiple 
developers</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="File-status-1"></a>
+<h3 class="section">10.1 File status</h3>
+<a name="index-File-status"></a>
+<a name="index-Status-of-a-file"></a>
+
+<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><a name="index-Up_002dto_002ddate"></a>
+</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><a name="index-Locally-Modified"></a>
+<p>You have edited the file, and not yet committed your changes.
+</p>
+</dd>
+<dt>Locally Added</dt>
+<dd><a name="index-Locally-Added"></a>
+<p>You have added the file with <code>add</code>, and not yet
+committed your changes.
+</p>
+</dd>
+<dt>Locally Removed</dt>
+<dd><a name="index-Locally-Removed"></a>
+<p>You have removed the file with <code>remove</code>, and not yet
+committed your changes.
+</p>
+</dd>
+<dt>Needs Checkout</dt>
+<dd><a name="index-Needs-Checkout"></a>
+<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><a name="index-Needs-Patch"></a>
+<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><a name="index-Needs-Merge"></a>
+<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><a name="index-Unresolved-Conflict"></a>
+<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><a name="index-File-had-conflicts-on-merge"></a>
+<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 <a href="#Conflicts-example">Conflicts 
example</a>.
+</p>
+</dd>
+<dt>Unknown</dt>
+<dd><a name="index-Unknown"></a>
+<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
+<a href="#Invoking-CVS">Invoking CVS</a>.  For information on its <code>Sticky 
tag</code>
+and <code>Sticky date</code> output, see <a href="#Sticky-tags">Sticky 
tags</a>.
+For information on its <code>Sticky options</code> output,
+see the &lsquo;<samp>-k</samp>&rsquo; option in <a 
href="#update-options">update options</a>.
+</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>
+<a name="index-update_002c-to-display-file-status"></a>
+<div class="example">
+<pre class="example">$ cvs -n -q update
+</pre></div>
+
+<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 <a href="#Invoking-CVS">Invoking CVS</a>.
+</p>
+<hr>
+<a name="Updating-a-file"></a>
+<div class="header">
+<p>
+Next: <a href="#Conflicts-example" accesskey="n" rel="next">Conflicts 
example</a>, Previous: <a href="#File-status" accesskey="p" rel="prev">File 
status</a>, Up: <a href="#Multiple-developers" accesskey="u" rel="up">Multiple 
developers</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Bringing-a-file-up-to-date"></a>
+<h3 class="section">10.2 Bringing a file up to date</h3>
+<a name="index-Bringing-a-file-up-to-date"></a>
+<a name="index-Updating-a-file"></a>
+<a name="index-Merging-a-file"></a>
+<a name="index-Update_002c-introduction"></a>
+
+<p>When you want to update or merge a file, use the <code>cvs update -d</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.  The
+<code>-d</code> option, not necessary with <code>checkout</code>, tells 
<small>CVS</small>
+that you wish it to create directories added by other developers.
+</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>
+<a name="index-Overlap"></a>
+<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 <a href="#update">update</a>, for a complete description of the
+<code>update</code> command.
+</p>
+<hr>
+<a name="Conflicts-example"></a>
+<div class="header">
+<p>
+Next: <a href="#Informing-others" accesskey="n" rel="next">Informing 
others</a>, Previous: <a href="#Updating-a-file" accesskey="p" 
rel="prev">Updating a file</a>, Up: <a href="#Multiple-developers" 
accesskey="u" rel="up">Multiple developers</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Conflicts-example-1"></a>
+<h3 class="section">10.3 Conflicts example</h3>
+<a name="index-Merge_002c-an-example"></a>
+<a name="index-Example-of-merge"></a>
+<a name="index-driver_002ec-_0028merge-example_0029"></a>
+
+<p>Suppose revision 1.4 of <samp>driver.c</samp> contains this:
+</p>
+<div class="example">
+<pre class="example">#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);
+}
+</pre></div>
+
+<p>Revision 1.6 of <samp>driver.c</samp> contains this:
+</p>
+<div class="example">
+<pre class="example">#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);
+}
+</pre></div>
+
+<p>Your working copy of <samp>driver.c</samp>, based on revision
+1.4, contains this before you run &lsquo;<samp>cvs update</samp>&rsquo;:
+</p>
+<div class="example">
+<pre class="example">#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);
+}
+</pre></div>
+
+<p>You run &lsquo;<samp>cvs update</samp>&rsquo;:
+</p>
+<div class="example">
+<pre class="example">$ cvs update driver.c
+RCS file: /usr/local/cvsroot/yoyodyne/tc/driver.c,v
+retrieving revision 1.4
+retrieving revision 1.6
+Merging differences between 1.4 and 1.6 into driver.c
+rcsmerge warning: overlaps during merge
+cvs update: conflicts found in driver.c
+C driver.c
+</pre></div>
+
+<a name="index-Conflicts-_0028merge-example_0029"></a>
+<p><small>CVS</small> tells you that there were some conflicts.
+Your original working file is saved unmodified in
+<samp>.#driver.c.1.4</samp>.  The new version of
+<samp>driver.c</samp> contains this:
+</p>
+<div class="example">
+<pre class="example">#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
+}
+</pre></div>
+
+<a name="index-Markers_002c-conflict"></a>
+<a name="index-Conflict-markers"></a>
+<a name="index-_003c_003c_003c_003c_003c_003c_003c"></a>
+<a name="index-_003e_003e_003e_003e_003e_003e_003e"></a>
+<a name="index-_003d_003d_003d_003d_003d_003d_003d"></a>
+
+<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>
+<a name="index-Resolving-a-conflict"></a>
+<a name="index-Conflict-resolution"></a>
+<p>You resolve the conflict by editing the file, removing the markers and
+the erroneous line.  Suppose you end up with this file:
+</p><div class="example">
+<pre class="example">#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);
+}
+</pre></div>
+
+<p>You can now go ahead and commit this as revision 1.7.
+</p>
+<div class="example">
+<pre class="example">$ 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
+</pre></div>
+
+<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>
+<a name="index-emerge"></a>
+<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>
+<a name="Informing-others"></a>
+<div class="header">
+<p>
+Next: <a href="#Concurrency" accesskey="n" rel="next">Concurrency</a>, 
Previous: <a href="#Conflicts-example" accesskey="p" rel="prev">Conflicts 
example</a>, Up: <a href="#Multiple-developers" accesskey="u" rel="up">Multiple 
developers</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Informing-others-about-commits"></a>
+<h3 class="section">10.4 Informing others about commits</h3>
+<a name="index-Informing-others"></a>
+<a name="index-Spreading-information"></a>
+<a name="index-Mail_002c-automatic-mail-on-commit"></a>
+
+<p>It is often useful to inform others when you commit a
+new revision of a file.  The <samp>loginfo</samp> file can be
+used to automate this process.
+See <a href="#loginfo">loginfo</a>.  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>
+<a name="Concurrency"></a>
+<div class="header">
+<p>
+Next: <a href="#Watches" accesskey="n" rel="next">Watches</a>, Previous: <a 
href="#Informing-others" accesskey="p" rel="prev">Informing others</a>, Up: <a 
href="#Multiple-developers" accesskey="u" rel="up">Multiple developers</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Several-developers-simultaneously-attempting-to-run-CVS"></a>
+<h3 class="section">10.5 Several developers simultaneously attempting to run 
CVS</h3>
+
+<a name="index-Locks_002c-cvs_002c-introduction"></a>
+<p>If several developers try to run <small>CVS</small> at the same
+time, one may get the following message:
+</p>
+<div class="example">
+<pre class="example">[11:43:23] waiting for bach's lock in 
/usr/local/cvsroot/foo
+</pre></div>
+
+<a name="index-_0023cvs_002erfl_002c-removing"></a>
+<a name="index-_0023cvs_002ewfl_002c-removing"></a>
+<a name="index-_0023cvs_002elock_002c-removing"></a>
+<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 <samp>#cvs.rfl</samp>,
+<samp>#cvs.wfl</samp>, or <samp>#cvs.lock</samp>.
+</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 <a href="#Multiple-developers">Multiple developers</a>).
+</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>
+<a name="index-Atomic-transactions_002c-lack-of"></a>
+<a name="index-Transactions_002c-atomic_002c-lack-of"></a>
+<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>
+<div class="example">
+<pre class="example">a/one.c
+a/two.c
+b/three.c
+b/four.c
+</pre></div>
+
+<p>if someone runs
+</p>
+<div class="example">
+<pre class="example">cvs ci a/two.c b/three.c
+</pre></div>
+
+<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 <samp>b/three.c</samp> and not the change to
+<samp>a/two.c</samp>.
+</p>
+<hr>
+<a name="Watches"></a>
+<div class="header">
+<p>
+Next: <a href="#Choosing-a-model" accesskey="n" rel="next">Choosing a 
model</a>, Previous: <a href="#Concurrency" accesskey="p" 
rel="prev">Concurrency</a>, Up: <a href="#Multiple-developers" accesskey="u" 
rel="up">Multiple developers</a> &nbsp; [<a href="#SEC_Contents" title="Table 
of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Mechanisms-to-track-who-is-editing-files"></a>
+<h3 class="section">10.6 Mechanisms to track who is editing files</h3>
+<a name="index-Watches"></a>
+
+<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>
+
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Setting-a-watch" 
accesskey="1">Setting a watch</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Telling CVS to watch certain files
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Getting-Notified" 
accesskey="2">Getting Notified</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Telling CVS to notify you
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Editing-files" 
accesskey="3">Editing files</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">How to edit a file which is being watched
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Watch-information" 
accesskey="4">Watch information</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Information about who is watching and editing
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Watches-Compatibility" 
accesskey="5">Watches Compatibility</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Watches interact poorly with CVS 1.6 or earlier
+</td></tr>
+</table>
+
+<hr>
+<a name="Setting-a-watch"></a>
+<div class="header">
+<p>
+Next: <a href="#Getting-Notified" accesskey="n" rel="next">Getting 
Notified</a>, Up: <a href="#Watches" accesskey="u" rel="up">Watches</a> &nbsp; 
[<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Telling-CVS-to-watch-certain-files"></a>
+<h4 class="subsection">10.6.1 Telling CVS to watch certain files</h4>
+
+<p>To enable the watch features, you first specify that
+certain files are to be watched.
+</p>
+<a name="index-watch-on-_0028subcommand_0029"></a>
+<dl>
+<dt><a name="index-cvs-watch-on"></a>Command: <strong>cvs watch on</strong> 
<em>[<code>-lR</code>] [<var>files</var>]&hellip;</em></dt>
+<dd>
+<a name="index-Read_002donly-files_002c-and-watches"></a>
+<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 <samp>~/.cvsrc</samp> (see <a 
href="#g_t_007e_002f_002ecvsrc">~/.cvsrc</a>).
+</p>
+<p>If <var>files</var> is omitted, it defaults to the current directory.
+</p>
+<a name="index-watch-off-_0028subcommand_0029"></a>
+</dd></dl>
+
+<dl>
+<dt><a name="index-cvs-watch-off"></a>Command: <strong>cvs watch off</strong> 
<em>[<code>-lR</code>] [<var>files</var>]&hellip;</em></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>
+<a name="Getting-Notified"></a>
+<div class="header">
+<p>
+Next: <a href="#Editing-files" accesskey="n" rel="next">Editing files</a>, 
Previous: <a href="#Setting-a-watch" accesskey="p" rel="prev">Setting a 
watch</a>, Up: <a href="#Watches" accesskey="u" rel="up">Watches</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Telling-CVS-to-notify-you"></a>
+<h4 class="subsection">10.6.2 Telling CVS to notify you</h4>
+
+<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>
+<a name="index-watch-add-_0028subcommand_0029"></a>
+<dl>
+<dt><a name="index-cvs-watch-add"></a>Command: <strong>cvs watch add</strong> 
<em>[<code>-lR</code>] [<code>-a</code> <var>action</var>]&hellip; 
[<var>files</var>]&hellip;</em></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 <a 
href="#release">release</a>) 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>
+
+
+<a name="index-watch-remove-_0028subcommand_0029"></a>
+<dl>
+<dt><a name="index-cvs-watch-remove"></a>Command: <strong>cvs watch 
remove</strong> <em>[<code>-lR</code>] [<code>-a</code> 
<var>action</var>]&hellip; [<var>files</var>]&hellip;</em></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>
+
+<a name="index-notify-_0028admin-file_0029"></a>
+<p>When the conditions exist for notification, <small>CVS</small>
+calls the <samp>notify</samp> administrative file.  Edit
+<samp>notify</samp> as one edits the other administrative
+files (see <a href="#Intro-administrative-files">Intro administrative 
files</a>).  This
+file follows the usual conventions for administrative
+files (see <a href="#syntax">syntax</a>), 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>
+<div class="example">
+<pre class="example">ALL mail %s -s &quot;CVS notification&quot;
+</pre></div>
+
+<p>This causes users to be notified by electronic mail.
+</p>
+<a name="index-users-_0028admin-file_0029"></a>
+<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 <samp>notify</samp> 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
+<samp>users</samp> in <samp>CVSROOT</samp> 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 <samp>notify</samp>, <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>
+<a name="Editing-files"></a>
+<div class="header">
+<p>
+Next: <a href="#Watch-information" accesskey="n" rel="next">Watch 
information</a>, Previous: <a href="#Getting-Notified" accesskey="p" 
rel="prev">Getting Notified</a>, Up: <a href="#Watches" accesskey="u" 
rel="up">Watches</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="How-to-edit-a-file-which-is-being-watched"></a>
+<h4 class="subsection">10.6.3 How to edit a file which is being watched</h4>
+
+<a name="index-Checkout_002c-as-term-for-getting-ready-to-edit"></a>
+<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 <a href="#Getting-the-source">Getting 
the source</a>), an operation which those systems call a
+<em>get</em> or a <em>fetch</em>.
+</p>
+<a name="index-edit-_0028subcommand_0029"></a>
+<dl>
+<dt><a name="index-cvs-edit"></a>Command: <strong>cvs edit</strong> 
<em>[<code>-lR</code>] [<code>-a</code> <var>action</var>]&hellip; 
[<var>files</var>]&hellip;</em></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>
+<a name="index-unedit-_0028subcommand_0029"></a>
+<a name="index-Abandoning-work"></a>
+<a name="index-Reverting-to-repository-version"></a>
+<dl>
+<dt><a name="index-cvs-unedit"></a>Command: <strong>cvs unedit</strong> 
<em>[<code>-lR</code>] [<var>files</var>]&hellip;</em></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 <a href="#update">update</a>).
+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>
+<a name="Watch-information"></a>
+<div class="header">
+<p>
+Next: <a href="#Watches-Compatibility" accesskey="n" rel="next">Watches 
Compatibility</a>, Previous: <a href="#Editing-files" accesskey="p" 
rel="prev">Editing files</a>, Up: <a href="#Watches" accesskey="u" 
rel="up">Watches</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Information-about-who-is-watching-and-editing"></a>
+<h4 class="subsection">10.6.4 Information about who is watching and 
editing</h4>
+
+<a name="index-watchers-_0028subcommand_0029"></a>
+<dl>
+<dt><a name="index-cvs-watchers"></a>Command: <strong>cvs watchers</strong> 
<em>[<code>-lR</code>] [<var>files</var>]&hellip;</em></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>
+
+
+<a name="index-editors-_0028subcommand_0029"></a>
+<dl>
+<dt><a name="index-cvs-editors"></a>Command: <strong>cvs editors</strong> 
<em>[<code>-lR</code>] [<var>files</var>]&hellip;</em></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>
+<a name="Watches-Compatibility"></a>
+<div class="header">
+<p>
+Previous: <a href="#Watch-information" accesskey="p" rel="prev">Watch 
information</a>, Up: <a href="#Watches" accesskey="u" rel="up">Watches</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Using-watches-with-old-versions-of-CVS"></a>
+<h4 class="subsection">10.6.5 Using watches with old versions of CVS</h4>
+
+<a name="index-CVS-1_002e6_002c-and-watches"></a>
+<p>If you use the watch features on a repository, it
+creates <samp>CVS</samp> 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>
+<div class="example">
+<pre class="example">cvs update: cannot open CVS/Entries for reading:
+No such file or directory
+</pre></div>
+
+<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>
+<a name="Choosing-a-model"></a>
+<div class="header">
+<p>
+Previous: <a href="#Watches" accesskey="p" rel="prev">Watches</a>, Up: <a 
href="#Multiple-developers" accesskey="u" rel="up">Multiple developers</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Choosing-between-reserved-or-unreserved-checkouts"></a>
+<h3 class="section">10.7 Choosing between reserved or unreserved checkouts</h3>
+<a name="index-Choosing_002c-reserved-or-unreserved-checkouts"></a>
+
+<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 <a href="#Watches">Watches</a>
+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>
+<a name="Revision-management"></a>
+<div class="header">
+<p>
+Next: <a href="#Keyword-substitution" accesskey="n" rel="next">Keyword 
substitution</a>, Previous: <a href="#Multiple-developers" accesskey="p" 
rel="prev">Multiple developers</a>, Up: <a href="#Top" accesskey="u" 
rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Revision-management-1"></a>
+<h2 class="chapter">11 Revision management</h2>
+<a name="index-Revision-management"></a>
+
+
+<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>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#When-to-commit" 
accesskey="1">When to commit</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Some discussion on the subject
+</td></tr>
+</table>
+
+<hr>
+<a name="When-to-commit"></a>
+<div class="header">
+<p>
+Up: <a href="#Revision-management" accesskey="u" rel="up">Revision 
management</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="When-to-commit_003f"></a>
+<h3 class="section">11.1 When to commit?</h3>
+<a name="index-When-to-commit"></a>
+<a name="index-Committing_002c-when-to"></a>
+<a name="index-Policy"></a>
+
+<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 <a href="#commitinfo">commitinfo</a>), 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>
+<a name="Keyword-substitution"></a>
+<div class="header">
+<p>
+Next: <a href="#Tracking-sources" accesskey="n" rel="next">Tracking 
sources</a>, Previous: <a href="#Revision-management" accesskey="p" 
rel="prev">Revision management</a>, Up: <a href="#Top" accesskey="u" 
rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Keyword-substitution-1"></a>
+<h2 class="chapter">12 Keyword substitution</h2>
+<a name="index-Keyword-substitution"></a>
+<a name="index-Keyword-expansion"></a>
+<a name="index-Identifying-files"></a>
+
+
+<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>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Keyword-list" 
accesskey="1">Keyword list</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Keywords
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Using-keywords" 
accesskey="2">Using keywords</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Using keywords
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Avoiding-substitution" 
accesskey="3">Avoiding substitution</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Avoiding substitution
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Substitution-modes" 
accesskey="4">Substitution modes</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Substitution modes
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Log-keyword" 
accesskey="5">Log keyword</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Problems with the $<i></i>Log$ keyword.
+</td></tr>
+</table>
+
+<hr>
+<a name="Keyword-list"></a>
+<div class="header">
+<p>
+Next: <a href="#Using-keywords" accesskey="n" rel="next">Using keywords</a>, 
Up: <a href="#Keyword-substitution" accesskey="u" rel="up">Keyword 
substitution</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Keyword-List"></a>
+<h3 class="section">12.1 Keyword List</h3>
+<a name="index-Keyword-List"></a>
+
+
+<p>This is a list of the keywords:
+</p>
+<dl compact="compact">
+<dd><a name="index-Author-keyword"></a>
+</dd>
+<dt><code>$<i></i>Author$</code></dt>
+<dd><p>The login name of the user who checked in the revision.
+</p>
+<a name="index-Date-keyword"></a>
+</dd>
+<dt><code>$<i></i>Date$</code></dt>
+<dd><p>The date and time (UTC) the revision was checked in.
+</p>
+<a name="index-Header-keyword"></a>
+</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>
+<a name="index-Id-keyword"></a>
+</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>
+<a name="index-Name-keyword"></a>
+</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>
+<a name="index-Locker-keyword"></a>
+</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>
+<a name="index-Log-keyword"></a>
+</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>
+<div class="example">
+<pre class="example">  /* 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
+   *
+   */
+</pre></div>
+
+<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 <a href="#Log-keyword">Log keyword</a>.
+</p>
+<a name="index-RCSfile-keyword"></a>
+</dd>
+<dt><code>$<i></i>RCSfile$</code></dt>
+<dd><p>The name of the RCS file without a path.
+</p>
+<a name="index-Revision-keyword"></a>
+</dd>
+<dt><code>$<i></i>Revision$</code></dt>
+<dd><p>The revision number assigned to the revision.
+</p>
+<a name="index-Source-keyword"></a>
+</dd>
+<dt><code>$<i></i>Source$</code></dt>
+<dd><p>The full pathname of the RCS file.
+</p>
+<a name="index-State-keyword"></a>
+</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 <a 
href="#admin-options">admin options</a>.
+</p>
+</dd>
+</dl>
+
+<hr>
+<a name="Using-keywords"></a>
+<div class="header">
+<p>
+Next: <a href="#Avoiding-substitution" accesskey="n" rel="next">Avoiding 
substitution</a>, Previous: <a href="#Keyword-list" accesskey="p" 
rel="prev">Keyword list</a>, Up: <a href="#Keyword-substitution" accesskey="u" 
rel="up">Keyword substitution</a> &nbsp; [<a href="#SEC_Contents" title="Table 
of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Using-keywords-1"></a>
+<h3 class="section">12.2 Using keywords</h3>
+
+<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 (Or,
+more accurately, as part of the update run that
+automatically happens after a commit.)
+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>
+
+<a name="index-Ident-_0028shell-command_0029"></a>
+<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>
+<div class="example">
+<pre class="example">$ 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 $
+</pre></div>
+
+<a name="index-What-_0028shell-command_0029"></a>
+<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>
+<div class="example">
+<pre class="example">static char *id=&quot;@(#) $<i></i>Id: ab.c,v 1.5 
1993/10/19 14:57:32 ceder Exp $&quot;;
+</pre></div>
+
+<hr>
+<a name="Avoiding-substitution"></a>
+<div class="header">
+<p>
+Next: <a href="#Substitution-modes" accesskey="n" rel="next">Substitution 
modes</a>, Previous: <a href="#Using-keywords" accesskey="p" rel="prev">Using 
keywords</a>, Up: <a href="#Keyword-substitution" accesskey="u" 
rel="up">Keyword substitution</a> &nbsp; [<a href="#SEC_Contents" title="Table 
of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Avoiding-substitution-1"></a>
+<h3 class="section">12.3 Avoiding substitution</h3>
+
+<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 <a href="#Substitution-modes">Substitution modes</a>) 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>
+<hr>
+<a name="Substitution-modes"></a>
+<div class="header">
+<p>
+Next: <a href="#Log-keyword" accesskey="n" rel="next">Log keyword</a>, 
Previous: <a href="#Avoiding-substitution" accesskey="p" rel="prev">Avoiding 
substitution</a>, Up: <a href="#Keyword-substitution" accesskey="u" 
rel="up">Keyword substitution</a> &nbsp; [<a href="#SEC_Contents" title="Table 
of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Substitution-modes-1"></a>
+<h3 class="section">12.4 Substitution modes</h3>
+<a name="index-Keyword-substitution_002c-changing-modes"></a>
+<a name="index-_002dk-_0028keyword-substitution_0029"></a>
+<a name="index-Kflag"></a>
+
+<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> and <code>cvs rdiff</code> also
+have &lsquo;<samp>-k</samp>&rsquo; options.
+For some examples,
+see <a href="#Binary-files">Binary files</a>, and <a 
href="#Merging-and-keywords">Merging and keywords</a>.
+</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 <a href="#Merging-and-keywords">Merging and keywords</a>).
+</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 the same as
+&lsquo;<samp>-ko</samp>&rsquo;.  For more information on binary files, see
+<a href="#Binary-files">Binary files</a>.
+</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 <a href="#export">export</a>.  But be aware that 
doesn&rsquo;t
+handle an export containing binary files correctly.
+</p>
+</dd>
+</dl>
+
+<hr>
+<a name="Log-keyword"></a>
+<div class="header">
+<p>
+Previous: <a href="#Substitution-modes" accesskey="p" rel="prev">Substitution 
modes</a>, Up: <a href="#Keyword-substitution" accesskey="u" rel="up">Keyword 
substitution</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Problems-with-the-_0024Log_0024-keyword_002e"></a>
+<h3 class="section">12.5 Problems with the $<i></i>Log$ keyword.</h3>
+
+<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>
+<a name="Tracking-sources"></a>
+<div class="header">
+<p>
+Next: <a href="#Builds" accesskey="n" rel="next">Builds</a>, Previous: <a 
href="#Keyword-substitution" accesskey="p" rel="prev">Keyword substitution</a>, 
Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Tracking-third_002dparty-sources"></a>
+<h2 class="chapter">13 Tracking third-party sources</h2>
+<a name="index-Third_002dparty-sources"></a>
+<a name="index-Tracking-sources"></a>
+
+<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>
+<a name="index-Vendor"></a>
+<a name="index-Vendor-branch"></a>
+<a name="index-Branch_002c-vendor_002d"></a>
+<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>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#First-import" 
accesskey="1">First import</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Importing for the first time
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Update-imports" 
accesskey="2">Update imports</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Updating with the import command
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Reverting-local-changes" 
accesskey="3">Reverting local changes</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Reverting to the latest vendor release
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Binary-files-in-imports" 
accesskey="4">Binary files in imports</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Binary files require special handling
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Keywords-in-imports" 
accesskey="5">Keywords in imports</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Keyword substitution might be undesirable
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Multiple-vendor-branches" 
accesskey="6">Multiple vendor branches</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">What if you get sources from several places?
+</td></tr>
+</table>
+
+<hr>
+<a name="First-import"></a>
+<div class="header">
+<p>
+Next: <a href="#Update-imports" accesskey="n" rel="next">Update imports</a>, 
Up: <a href="#Tracking-sources" accesskey="u" rel="up">Tracking sources</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Importing-for-the-first-time"></a>
+<h3 class="section">13.1 Importing for the first time</h3>
+<a name="index-Importing-modules"></a>
+
+<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 <a 
href="#Multiple-vendor-branches">Multiple vendor branches</a>.).  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 <a href="#Getting-the-source">Getting the source</a>).
+</p>
+<a name="index-wdiff-_0028import-example_0029"></a>
+<p>Suppose you have the sources to a program called
+<code>wdiff</code> in a directory <samp>wdiff-0.04</samp>,
+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>
+<div class="example">
+<pre class="example">$ cd wdiff-0.04
+$ cvs import -m &quot;Import of FSF v. 0.04&quot; fsf/wdiff FSF_DIST WDIFF_0_04
+</pre></div>
+
+<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>
+<a name="Update-imports"></a>
+<div class="header">
+<p>
+Next: <a href="#Reverting-local-changes" accesskey="n" rel="next">Reverting 
local changes</a>, Previous: <a href="#First-import" accesskey="p" 
rel="prev">First import</a>, Up: <a href="#Tracking-sources" accesskey="u" 
rel="up">Tracking sources</a> &nbsp; [<a href="#SEC_Contents" title="Table of 
contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Updating-with-the-import-command"></a>
+<h3 class="section">13.2 Updating with the import command</h3>
+
+<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>
+<div class="example">
+<pre class="example">$ 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
+</pre></div>
+
+<p><strong>WARNING:  If you use a release tag that already exists in one of the
+repository archives, files removed by an import may not be detected.</strong>
+</p>
+<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>
+<div class="example">
+<pre class="example">$ cvs checkout -jFSF_DIST:yesterday -jFSF_DIST wdiff
+</pre></div>
+
+<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 <a 
href="#Conflicts-example">Conflicts example</a>).  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>
+<div class="example">
+<pre class="example">$ cvs checkout -jWDIFF_0_04 -jWDIFF_0_05 wdiff
+</pre></div>
+
+<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>
+<a name="Reverting-local-changes"></a>
+<div class="header">
+<p>
+Next: <a href="#Binary-files-in-imports" accesskey="n" rel="next">Binary files 
in imports</a>, Previous: <a href="#Update-imports" accesskey="p" 
rel="prev">Update imports</a>, Up: <a href="#Tracking-sources" accesskey="u" 
rel="up">Tracking sources</a> &nbsp; [<a href="#SEC_Contents" title="Table of 
contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Reverting-to-the-latest-vendor-release"></a>
+<h3 class="section">13.3 Reverting to the latest vendor release</h3>
+
+<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 <samp>~/work.d/wdiff</samp>, and you want to revert to the
+vendor&rsquo;s version for all the files in that directory,
+you would type:
+</p>
+<div class="example">
+<pre class="example">$ cd ~/work.d/wdiff
+$ cvs admin -bFSF_DIST .
+</pre></div>
+
+<p>You must specify the &lsquo;<samp>-bFSF_DIST</samp>&rsquo; without any space
+after the &lsquo;<samp>-b</samp>&rsquo;.  See <a href="#admin-options">admin 
options</a>.
+</p>
+<hr>
+<a name="Binary-files-in-imports"></a>
+<div class="header">
+<p>
+Next: <a href="#Keywords-in-imports" accesskey="n" rel="next">Keywords in 
imports</a>, Previous: <a href="#Reverting-local-changes" accesskey="p" 
rel="prev">Reverting local changes</a>, Up: <a href="#Tracking-sources" 
accesskey="u" rel="up">Tracking sources</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="How-to-handle-binary-files-with-cvs-import"></a>
+<h3 class="section">13.4 How to handle binary files with cvs import</h3>
+
+<p>Use the &lsquo;<samp>-k</samp>&rsquo; wrapper option to tell import which
+files are binary.  See <a href="#Wrappers">Wrappers</a>.
+</p>
+<hr>
+<a name="Keywords-in-imports"></a>
+<div class="header">
+<p>
+Next: <a href="#Multiple-vendor-branches" accesskey="n" rel="next">Multiple 
vendor branches</a>, Previous: <a href="#Binary-files-in-imports" accesskey="p" 
rel="prev">Binary files in imports</a>, Up: <a href="#Tracking-sources" 
accesskey="u" rel="up">Tracking sources</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="How-to-handle-keyword-substitution-with-cvs-import"></a>
+<h3 class="section">13.5 How to handle keyword substitution with cvs 
import</h3>
+
+<p>The sources which you are importing may contain
+keywords (see <a href="#Keyword-substitution">Keyword substitution</a>).  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>
+<a name="Multiple-vendor-branches"></a>
+<div class="header">
+<p>
+Previous: <a href="#Keywords-in-imports" accesskey="p" rel="prev">Keywords in 
imports</a>, Up: <a href="#Tracking-sources" accesskey="u" rel="up">Tracking 
sources</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Multiple-vendor-branches-1"></a>
+<h3 class="section">13.6 Multiple vendor branches</h3>
+
+<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>
+<div class="example">
+<pre class="example">$ cvs import dir RED RED_1-0
+$ cvs import -b 1.1.3 dir BLUE BLUE_1-5
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">$ cvs import -b 1.1.3 dir RED RED_1-0
+</pre></div>
+
+<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>
+<a name="Builds"></a>
+<div class="header">
+<p>
+Next: <a href="#Special-Files" accesskey="n" rel="next">Special Files</a>, 
Previous: <a href="#Tracking-sources" accesskey="p" rel="prev">Tracking 
sources</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="How-your-build-system-interacts-with-CVS"></a>
+<h2 class="chapter">14 How your build system interacts with CVS</h2>
+<a name="index-Builds"></a>
+<a name="index-make"></a>
+
+<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 <samp>Makefile</samp> (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>
+<a name="index-Bill-of-materials"></a>
+<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 <a href="#Tags">Tags</a>).
+</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>
+<a name="Special-Files"></a>
+<div class="header">
+<p>
+Next: <a href="#CVS-commands" accesskey="n" rel="next">CVS commands</a>, 
Previous: <a href="#Builds" accesskey="p" rel="prev">Builds</a>, Up: <a 
href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Special-Files-1"></a>
+<h2 class="chapter">15 Special Files</h2>
+
+<a name="index-Special-files"></a>
+<a name="index-Device-nodes"></a>
+<a name="index-Ownership_002c-saving-in-CVS"></a>
+<a name="index-Permissions_002c-saving-in-CVS"></a>
+<a name="index-Hard-links"></a>
+<a name="index-Symbolic-links"></a>
+
+<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>
+<a name="CVS-commands"></a>
+<div class="header">
+<p>
+Next: <a href="#Invoking-CVS" accesskey="n" rel="next">Invoking CVS</a>, 
Previous: <a href="#Special-Files" accesskey="p" rel="prev">Special Files</a>, 
Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Guide-to-CVS-commands"></a>
+<h2 class="appendix">Appendix A Guide to CVS commands</h2>
+
+<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 <a href="#Invoking-CVS">Invoking 
CVS</a>).
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Structure" 
accesskey="1">Structure</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Overall structure of CVS commands
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Exit-status" 
accesskey="2">Exit status</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Indicating CVS&rsquo;s success or failure
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#g_t_007e_002f_002ecvsrc" 
accesskey="3">~/.cvsrc</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Default options with the ~/.cvsrc file
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Global-options" 
accesskey="4">Global options</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Options you give to the left of cvs_command
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Common-options" 
accesskey="5">Common options</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Options you give to the right of cvs_command
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#add" 
accesskey="6">add</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Add files and directories to the repository
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#admin" 
accesskey="7">admin</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Administration
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#annotate" 
accesskey="8">annotate</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">What revision modified each line of a file?
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#checkout" 
accesskey="9">checkout</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Checkout sources for editing
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#commit">commit</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Check files into the repository
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#diff">diff</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Show differences between revisions
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#export">export</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Export sources from CVS, similar to checkout
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#history">history</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Show status of files and users
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#import">import</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Import sources into CVS, using vendor branches
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#log">log</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Show log messages for files
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#rdiff">rdiff</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">&rsquo;patch&rsquo; format diffs between releases
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#release">release</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Indicate that a directory is no longer in use
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#remove">remove</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Remove files from active development
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#update">update</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Bring work tree in sync with repository
+</td></tr>
+</table>
+
+<hr>
+<a name="Structure"></a>
+<div class="header">
+<p>
+Next: <a href="#Exit-status" accesskey="n" rel="next">Exit status</a>, Up: <a 
href="#CVS-commands" accesskey="u" rel="up">CVS commands</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Overall-structure-of-CVS-commands"></a>
+<h3 class="appendixsec">A.1 Overall structure of CVS commands</h3>
+<a name="index-Structure"></a>
+<a name="index-CVS-command-structure"></a>
+<a name="index-Command-structure"></a>
+<a name="index-Format-of-CVS-commands"></a>
+
+<p>The overall format of all <small>CVS</small> commands is:
+</p>
+<div class="example">
+<pre class="example">cvs [ cvs_options ] cvs_command [ command_options ] [ 
command_args ]
+</pre></div>
+
+<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>.
+When given as a <code>cvs_option</code>, some options only
+affect some of the commands.  When given as a
+<code>command_option</code> it may have a different meaning, and
+be accepted by more commands.  In other words, do not
+take the above categorization too seriously.  Look at
+the documentation instead.
+</p>
+<hr>
+<a name="Exit-status"></a>
+<div class="header">
+<p>
+Next: <a href="#g_t_007e_002f_002ecvsrc" accesskey="n" 
rel="next">~/.cvsrc</a>, Previous: <a href="#Structure" accesskey="p" 
rel="prev">Structure</a>, Up: <a href="#CVS-commands" accesskey="u" 
rel="up">CVS commands</a> &nbsp; [<a href="#SEC_Contents" title="Table of 
contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="CVS_0027s-exit-status"></a>
+<h3 class="appendixsec">A.2 CVS&rsquo;s exit status</h3>
+<a name="index-Exit-status_002c-of-CVS"></a>
+
+<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>
+<a name="g_t_007e_002f_002ecvsrc"></a>
+<div class="header">
+<p>
+Next: <a href="#Global-options" accesskey="n" rel="next">Global options</a>, 
Previous: <a href="#Exit-status" accesskey="p" rel="prev">Exit status</a>, Up: 
<a href="#CVS-commands" accesskey="u" rel="up">CVS commands</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Default-options-and-the-_007e_002f_002ecvsrc-file"></a>
+<h3 class="appendixsec">A.3 Default options and the ~/.cvsrc file</h3>
+<a name="index-_002ecvsrc-file"></a>
+<a name="index-Option-defaults"></a>
+
+<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
+<samp>.cvsrc</samp> 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 <samp>~/.cvsrc</samp> 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 <samp>~/.cvsrc</samp> 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
+<samp>~/.cvsrc</samp> file:
+</p>
+<div class="example">
+<pre class="example">log -N
+diff -uN
+rdiff -u
+update -Pd
+checkout -P
+release -d
+</pre></div>
+
+<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 <a href="#Global-options">Global options</a>).  For
+example the following line in <samp>.cvsrc</samp>
+</p>
+<div class="example">
+<pre class="example">cvs -z6
+</pre></div>
+
+<p>causes <small>CVS</small> to use compression level 6.
+</p>
+<hr>
+<a name="Global-options"></a>
+<div class="header">
+<p>
+Next: <a href="#Common-options" accesskey="n" rel="next">Common options</a>, 
Previous: <a href="#g_t_007e_002f_002ecvsrc" accesskey="p" 
rel="prev">~/.cvsrc</a>, Up: <a href="#CVS-commands" accesskey="u" rel="up">CVS 
commands</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Global-options-1"></a>
+<h3 class="appendixsec">A.4 Global options</h3>
+<a name="index-Options_002c-global"></a>
+<a name="index-Global-options"></a>
+<a name="index-Left_002dhand-options"></a>
+
+<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
+<a href="#Password-authentication-server">Password authentication server</a>.
+</p>
+<a name="index-Authentication_002c-stream"></a>
+<a name="index-Stream-authentication"></a>
+</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 <a href="#GSSAPI-authenticated">GSSAPI 
authenticated</a>).
+Authentication prevents certain sorts of attacks
+involving hijacking the active <small>TCP</small> connection.
+Enabling authentication does not enable encryption.
+</p>
+<a name="index-RCSBIN_002c-overriding"></a>
+<a name="index-Overriding-RCSBIN"></a>
+</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>
+<a name="index-TMPDIR_002c-overriding"></a>
+<a name="index-Overriding-TMPDIR"></a>
+</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>
+<a name="index-CVSROOT_002c-overriding"></a>
+<a name="index-Overriding-CVSROOT"></a>
+</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 <a 
href="#Repository">Repository</a>.
+</p>
+<a name="index-EDITOR_002c-overriding"></a>
+<a name="index-Overriding-EDITOR"></a>
+</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
+<a href="#Committing-your-changes">Committing your changes</a>.
+</p>
+</dd>
+<dt><code>-f</code></dt>
+<dd><p>Do not read the <samp>~/.cvsrc</samp> 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 <samp>~/.cvsrc</samp> 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>
+<a name="index-Read_002donly-mode"></a>
+</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>
+<a name="index-Read_002donly-files_002c-and-_002dr"></a>
+</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 <a href="#Environment-variables">Environment variables</a>).  The default 
is to
+make working files writable, unless watches are on
+(see <a href="#Watches">Watches</a>).
+</p>
+</dd>
+<dt><code>-s <var>variable</var>=<var>value</var></code></dt>
+<dd><p>Set a user variable (see <a href="#Variables">Variables</a>).
+</p>
+<a name="index-Trace"></a>
+</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>
+<a name="index-CVSREAD_002c-overriding"></a>
+<a name="index-Overriding-CVSREAD"></a>
+</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><a name="index-Encryption"></a>
+<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 <a href="#GSSAPI-authenticated">GSSAPI 
authenticated</a>) or a
+Kerberos connection (see <a href="#Kerberos-authenticated">Kerberos 
authenticated</a>).
+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, <samp>--enable-encryption</samp>,
+when you build <small>CVS</small>.
+</p>
+</dd>
+<dt><code>-z <var>gzip-level</var></code></dt>
+<dd><a name="index-Compression"></a>
+<a name="index-Gzip"></a>
+<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>
+<a name="Common-options"></a>
+<div class="header">
+<p>
+Next: <a href="#add" accesskey="n" rel="next">add</a>, Previous: <a 
href="#Global-options" accesskey="p" rel="prev">Global options</a>, Up: <a 
href="#CVS-commands" accesskey="u" rel="up">CVS commands</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Common-command-options"></a>
+<h3 class="appendixsec">A.5 Common command options</h3>
+<a name="index-Common-options"></a>
+<a name="index-Right_002dhand-options"></a>
+
+<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>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><a name="index-Dates"></a>
+<a name="index-Time"></a>
+<a name="index-Specifying-dates"></a>
+</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 <a href="#Sticky-tags">Sticky 
tags</a>).
+</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>, and <code>update</code> commands.
+(The <code>history</code> command uses this option in a
+slightly different way; see <a href="#history-options">history options</a>).
+</p>
+
+<a name="index-Timezone_002c-in-input"></a>
+<a name="index-Zone_002c-time_002c-in-input"></a>
+<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>
+<div class="example">
+<pre class="example">1972-09-24
+1972-09-24 20:05
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">24 Sep 1972 20:05
+24 Sep
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">$ cvs diff -D &quot;1 hour ago&quot; cvs.texinfo
+</pre></div>
+
+<a name="index-Forcing-a-tag-match"></a>
+</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 <a href="#commit-options">commit options</a>, and
+<a href="#Removing-files">Removing files</a>.</strong>
+</p>
+</dd>
+<dt><code>-k <var>kflag</var></code></dt>
+<dd><p>Alter the default processing of keywords.
+See <a href="#Keyword-substitution">Keyword substitution</a>, for the meaning 
of
+<var>kflag</var>.  Your <var>kflag</var> specification is
+<em>sticky</em> when you use it to create a private copy
+of a source file; that is, when you use this option
+with the <code>checkout</code> or <code>update</code> commands,
+<small>CVS</small> associates your selected <var>kflag</var> with the
+file, and continues to use it with future update
+commands on the same file 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>rdiff</code>, 
<code>import</code> and
+<code>update</code> commands.
+</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>
+<a name="index-Editor_002c-avoiding-invocation-of"></a>
+<a name="index-Avoiding-editor-invocation"></a>
+</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 <a href="#modules">modules</a>); this option bypasses it).
+</p>
+<p><strong>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>export</code>,
+and <code>rtag</code> commands.
+</p>
+</dd>
+<dt><code>-P</code></dt>
+<dd><p>Prune empty directories.  See <a href="#Removing-directories">Removing 
directories</a>.
+</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><a name="index-HEAD_002c-special-tag"></a>
+<a name="index-BASE_002c-special-tag"></a>
+<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 <a href="#Sticky-tags">Sticky tags</a>).
+</p>
+<p>The tag can be either a symbolic or numeric tag, as
+described in <a href="#Tags">Tags</a>, or the name of a branch, as
+described in <a href="#Branching-and-merging">Branching and merging</a>.
+When a command expects a specific revision,
+the name of a branch is interpreted as the most recent
+revision on that branch.
+</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>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>annotate</code>, 
<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 <samp>.cvswrappers</samp> file.
+Available with the following commands: <code>import</code>,
+and <code>update</code>.
+</p>
+</dd>
+</dl>
+
+<hr>
+<a name="add"></a>
+<div class="header">
+<p>
+Next: <a href="#admin" accesskey="n" rel="next">admin</a>, Previous: <a 
href="#Common-options" accesskey="p" rel="prev">Common options</a>, Up: <a 
href="#CVS-commands" accesskey="u" rel="up">CVS commands</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="add_002d_002d_002dAdd-files-and-directories-to-the-repository"></a>
+<h3 class="appendixsec">A.6 add&mdash;Add files and directories to the 
repository</h3>
+<a name="index-add-_0028subcommand_0029-1"></a>
+
+<ul>
+<li> Synopsis: add [-k rcs-kflag] [-m message] files...
+</li><li> Requires: repository, working directory.
+</li><li> Changes: repository, working directory.
+</li></ul>
+
+<p>The <code>add</code> command is used to present new files
+and directories for addition into the <small>CVS</small>
+repository.  When <code>add</code> is used on a directory,
+a new directory is created in the repository
+immediately.  When used on a file, only the working
+directory is updated.  Changes to the repository are
+not made until the <code>commit</code> command is used on
+the newly added file. 
+</p>
+<p>The <code>add</code> command also resurrects files that
+have been previously removed.  This can be done
+before or after the <code>commit</code> command is used
+to finalize the removal of files.  Resurrected files
+are restored into the working directory at the time
+the <code>add</code> command is executed.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#add-options" 
accesskey="1">add options</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">add options
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#add-examples" 
accesskey="2">add examples</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">add examples
+</td></tr>
+</table>
+
+<hr>
+<a name="add-options"></a>
+<div class="header">
+<p>
+Next: <a href="#add-examples" accesskey="n" rel="next">add examples</a>, Up: 
<a href="#add" accesskey="u" rel="up">add</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="add-options-1"></a>
+<h4 class="appendixsubsec">A.6.1 add options</h4>
+
+<p>These standard options are supported by <code>add</code>
+(see <a href="#Common-options">Common options</a>, for a complete description 
of
+them):
+</p>
+<dl compact="compact">
+<dt><code>-k <var>kflag</var></code></dt>
+<dd><p>Process keywords according to <var>kflag</var>.  See
+<a href="#Keyword-substitution">Keyword substitution</a>.
+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.  For more information on
+the <code>status</code> command, See <a href="#Invoking-CVS">Invoking CVS</a>.
+</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>
+<a name="add-examples"></a>
+<div class="header">
+<p>
+Previous: <a href="#add-options" accesskey="p" rel="prev">add options</a>, Up: 
<a href="#add" accesskey="u" rel="up">add</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="add-examples-1"></a>
+<h4 class="appendixsubsec">A.6.2 add examples</h4>
+
+<a name="Adding-a-directory"></a>
+<h4 class="appendixsubsubsec">A.6.2.1 Adding a directory</h4>
+
+<div class="example">
+<pre class="example">$ mkdir doc
+$ cvs add doc
+Directory /path/to/repository/doc added to the repository
+</pre></div>
+
+<a name="Adding-a-file"></a>
+<h4 class="appendixsubsubsec">A.6.2.2 Adding a file</h4>
+
+<div class="example">
+<pre class="example">
+$ &gt;TODO
+$ cvs add TODO
+cvs add: scheduling file `TODO' for addition
+cvs add: use 'cvs commit' to add this file permanently
+</pre></div>
+
+<a name="Undoing-a-remove-command"></a>
+<h4 class="appendixsubsubsec">A.6.2.3 Undoing a <code>remove</code> 
command</h4>
+
+<div class="example">
+<pre class="example">$ rm -f makefile
+$ cvs remove makefile
+cvs remove: scheduling `makefile' for removal
+cvs remove: use 'cvs commit' to remove this file permanently
+$ cvs add makefile
+U makefile
+cvs add: makefile, version 1.2, resurrected
+</pre></div>
+
+<hr>
+<a name="admin"></a>
+<div class="header">
+<p>
+Next: <a href="#annotate" accesskey="n" rel="next">annotate</a>, Previous: <a 
href="#add" accesskey="p" rel="prev">add</a>, Up: <a href="#CVS-commands" 
accesskey="u" rel="up">CVS commands</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="admin_002d_002d_002dAdministration"></a>
+<h3 class="appendixsec">A.7 admin&mdash;Administration</h3>
+<a name="index-Admin-_0028subcommand_0029"></a>
+
+<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>
+<a name="index-cvsadmin"></a>
+<p>On unix, if there is a group named <code>cvsadmin</code>,
+only members of that group can run <code>cvs admin</code>
+(except for the <code>cvs admin -k</code> command, which can
+be run by anybody).  This 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>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#admin-options" 
accesskey="1">admin options</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">admin options
+</td></tr>
+</table>
+
+<hr>
+<a name="admin-options"></a>
+<div class="header">
+<p>
+Up: <a href="#admin" accesskey="u" rel="up">admin</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="admin-options-1"></a>
+<h4 class="appendixsubsec">A.7.1 admin options</h4>
+
+<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 <a href="#Sticky-tags">Sticky tags</a>) 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 <a 
href="#Reverting-local-changes">Reverting local changes</a>).
+There can be no space between &lsquo;<samp>-b</samp>&rsquo; and its argument.
+</p>
+<a name="index-Comment-leader"></a>
+</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 <a href="#Keyword-substitution">Keyword substitution</a>.
+</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 <a href="#Adding-files">Adding files</a>).
+</p>
+</dd>
+<dt><code>-k<var>subst</var></code></dt>
+<dd><p>Set the default keyword
+substitution to <var>subst</var>.  See <a href="#Keyword-substitution">Keyword 
substitution</a>.  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
+<samp>rcslock.pl</samp> script in the <samp>contrib</samp>
+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 <samp>README</samp> 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>
+<a name="index-Changing-a-log-message"></a>
+<a name="index-Replacing-a-log-message"></a>
+<a name="index-Correcting-a-log-message"></a>
+<a name="index-Fixing-a-log-message"></a>
+<a name="index-Log-message_002c-correcting"></a>
+</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 <a href="#Magic-branch-numbers">Magic branch numbers</a>.
+</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>
+<a name="index-Deleting-revisions"></a>
+<a name="index-Outdating-revisions"></a>
+<a name="index-Saving-space"></a>
+</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 <a href="#Magic-branch-numbers">Magic branch numbers</a> 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 <a href="#Merging-two-revisions">Merging two 
revisions</a>).
+</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 <a href="#log">log</a>), and in the
+&lsquo;<samp>$<i></i>Log$</samp>&rsquo; and 
&lsquo;<samp>$<i></i>State$</samp>&rsquo; keywords
+(see <a href="#Keyword-substitution">Keyword substitution</a>).  Note that 
<small>CVS</small>
+uses the <code>dead</code> state for its own purposes (see <a 
href="#Attic">Attic</a>); to
+take a file to or from the <code>dead</code> state use
+commands like <code>cvs remove</code> and <code>cvs add</code>
+(see <a href="#Adding-and-removing">Adding and removing</a>), 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 <a href="#log">log</a>).
+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 <a href="#Getting-Notified">Getting Notified</a>).
+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>
+<a name="annotate"></a>
+<div class="header">
+<p>
+Next: <a href="#checkout" accesskey="n" rel="next">checkout</a>, Previous: <a 
href="#admin" accesskey="p" rel="prev">admin</a>, Up: <a href="#CVS-commands" 
accesskey="u" rel="up">CVS commands</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a 
name="annotate_002d_002d_002dWhat-revision-modified-each-line-of-a-file_003f"></a>
+<h3 class="appendixsec">A.8 annotate&mdash;What revision modified each line of 
a file?</h3>
+<a name="index-annotate-_0028subcommand_0029"></a>
+
+<ul>
+<li> Synopsis: annotate [options] files&hellip;
+</li><li> Requires: repository.
+</li><li> Synonym: blame
+</li><li> Changes: nothing.
+</li></ul>
+
+<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.  
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#annotate-options" 
accesskey="1">annotate options</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">annotate options
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#annotate-example" 
accesskey="2">annotate example</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">annotate example
+</td></tr>
+</table>
+
+<hr>
+<a name="annotate-options"></a>
+<div class="header">
+<p>
+Next: <a href="#annotate-example" accesskey="n" rel="next">annotate 
example</a>, Up: <a href="#annotate" accesskey="u" rel="up">annotate</a> &nbsp; 
[<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="annotate-options-1"></a>
+<h4 class="appendixsubsec">A.8.1 annotate options</h4>
+
+<p>These standard options are supported by <code>annotate</code>
+(see <a href="#Common-options">Common options</a> for a complete description of
+them):
+</p>
+<dl compact="compact">
+<dt><code>-l</code></dt>
+<dd><p>Local directory only, no recursion.
+</p>
+</dd>
+<dt><code>-R</code></dt>
+<dd><p>Process directories recursively.
+</p>
+</dd>
+<dt><code>-f</code></dt>
+<dd><p>Use head revision if tag/date not found.
+</p>
+</dd>
+<dt><code>-F</code></dt>
+<dd><p>Annotate binary files.
+</p>
+</dd>
+<dt><code>-r <var>revision</var></code></dt>
+<dd><p>Annotate file as of specified revision/tag.
+</p>
+</dd>
+<dt><code>-D <var>date</var></code></dt>
+<dd><p>Annotate file as of specified date.
+</p></dd>
+</dl>
+
+<hr>
+<a name="annotate-example"></a>
+<div class="header">
+<p>
+Previous: <a href="#annotate-options" accesskey="p" rel="prev">annotate 
options</a>, Up: <a href="#annotate" accesskey="u" rel="up">annotate</a> &nbsp; 
[<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="annotate-example-1"></a>
+<h4 class="appendixsubsec">A.8.2 annotate example</h4>
+
+<p>For example:
+</p>
+<div class="example">
+<pre class="example">$ cvs annotate ssfile
+Annotations for ssfile
+***************
+1.1          (mary     27-Mar-96): ssfile line 1
+1.2          (joe      28-Mar-96): ssfile line 2
+</pre></div>
+
+<p>The file <samp>ssfile</samp> 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 <a href="#diff">diff</a>).
+</p>
+<p>The options to <code>cvs annotate</code> are listed in
+<a href="#Invoking-CVS">Invoking CVS</a>, and can be used to select the files
+and revisions to annotate.  The options are described
+in more detail there and in <a href="#Common-options">Common options</a>.
+</p>
+
+
+<hr>
+<a name="checkout"></a>
+<div class="header">
+<p>
+Next: <a href="#commit" accesskey="n" rel="next">commit</a>, Previous: <a 
href="#annotate" accesskey="p" rel="prev">annotate</a>, Up: <a 
href="#CVS-commands" accesskey="u" rel="up">CVS commands</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="checkout_002d_002d_002dCheck-out-sources-for-editing"></a>
+<h3 class="appendixsec">A.9 checkout&mdash;Check out sources for editing</h3>
+<a name="index-checkout-_0028subcommand_0029"></a>
+<a name="index-co-_0028subcommand_0029"></a>
+
+<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 <a href="#modules">modules</a>.
+</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 <a href="#Global-options">Global options</a>) is specified, the
+<code>CVSREAD</code> environment variable is specified
+(see <a href="#Environment-variables">Environment variables</a>), or a watch 
is in
+effect for that file (see <a href="#Watches">Watches</a>).
+</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 <a href="#update-output">update output</a>.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#checkout-options" 
accesskey="1">checkout options</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">checkout options
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#checkout-examples" 
accesskey="2">checkout examples</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">checkout examples
+</td></tr>
+</table>
+
+<hr>
+<a name="checkout-options"></a>
+<div class="header">
+<p>
+Next: <a href="#checkout-examples" accesskey="n" rel="next">checkout 
examples</a>, Up: <a href="#checkout" accesskey="u" rel="up">checkout</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="checkout-options-1"></a>
+<h4 class="appendixsubsec">A.9.1 checkout options</h4>
+
+<p>These standard options are supported by <code>checkout</code>
+(see <a href="#Common-options">Common options</a> 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
+<a href="#Sticky-tags">Sticky tags</a> 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
+<a href="#Keyword-substitution">Keyword substitution</a>.
+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 <a href="#Invoking-CVS">Invoking CVS</a> 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 <a href="#modules">modules</a>).
+</p>
+</dd>
+<dt><code>-P</code></dt>
+<dd><p>Prune empty directories.  See <a href="#Moving-directories">Moving 
directories</a>.
+</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 <a href="#Sticky-tags">Sticky tags</a>, 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.
+Does not reset sticky &lsquo;<samp>-k</samp>&rsquo; options on modified files.
+See <a href="#Sticky-tags">Sticky tags</a> 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 <a href="#Branching-and-merging">Branching and merging</a>.
+</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 <a href="#modules">modules</a>, 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>
+<a name="checkout-examples"></a>
+<div class="header">
+<p>
+Previous: <a href="#checkout-options" accesskey="p" rel="prev">checkout 
options</a>, Up: <a href="#checkout" accesskey="u" rel="up">checkout</a> &nbsp; 
[<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="checkout-examples-1"></a>
+<h4 class="appendixsubsec">A.9.2 checkout examples</h4>
+
+<p>Get a copy of the module &lsquo;<samp>tc</samp>&rsquo;:
+</p>
+<div class="example">
+<pre class="example">$ cvs checkout tc
+</pre></div>
+
+<p>Get a copy of the module &lsquo;<samp>tc</samp>&rsquo; as it looked one day
+ago:
+</p>
+<div class="example">
+<pre class="example">$ cvs checkout -D yesterday tc
+</pre></div>
+
+<hr>
+<a name="commit"></a>
+<div class="header">
+<p>
+Next: <a href="#diff" accesskey="n" rel="next">diff</a>, Previous: <a 
href="#checkout" accesskey="p" rel="prev">checkout</a>, Up: <a 
href="#CVS-commands" accesskey="u" rel="up">CVS commands</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="commit_002d_002d_002dCheck-files-into-the-repository"></a>
+<h3 class="appendixsec">A.10 commit&mdash;Check files into the repository</h3>
+<a name="index-commit-_0028subcommand_0029"></a>
+
+<ul>
+<li> Synopsis: commit [-lRf] [-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 <a href="#update">update</a>).
+<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 <a href="#modules">modules</a>, and see <a 
href="#loginfo">loginfo</a>)
+and placed in the <small>RCS</small> file inside the
+repository.  This log message can be retrieved with the
+<code>log</code> command; See <a href="#log">log</a>.  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>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#commit-options" 
accesskey="1">commit options</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">commit options
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#commit-examples" 
accesskey="2">commit examples</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">commit examples
+</td></tr>
+</table>
+
+<hr>
+<a name="commit-options"></a>
+<div class="header">
+<p>
+Next: <a href="#commit-examples" accesskey="n" rel="next">commit examples</a>, 
Up: <a href="#commit" accesskey="u" rel="up">commit</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="commit-options-1"></a>
+<h4 class="appendixsubsec">A.10.1 commit options</h4>
+
+<p>These standard options are supported by <code>commit</code>
+(see <a href="#Common-options">Common options</a> 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 <a href="#Assigning-revisions">Assigning revisions</a>).  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 <a 
href="#Common-options">Common options</a>.
+</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>
+<div class="example">
+<pre class="example">$ cvs commit -f <var>file</var>
+$ cvs commit -r 1.8 <var>file</var>
+</pre></div>
+
+<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>
+<a name="commit-examples"></a>
+<div class="header">
+<p>
+Previous: <a href="#commit-options" accesskey="p" rel="prev">commit 
options</a>, Up: <a href="#commit" accesskey="u" rel="up">commit</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="commit-examples-1"></a>
+<h4 class="appendixsubsec">A.10.2 commit examples</h4>
+
+
+<a name="Committing-to-a-branch"></a>
+<h4 class="appendixsubsubsec">A.10.2.1 Committing to a branch</h4>
+
+<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 <a href="#Branching-and-merging">Branching and merging</a>).  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>
+<div class="example">
+<pre class="example">$ cvs rtag -b -r FCS1_2 FCS1_2_Patch product_module
+$ cvs checkout -r FCS1_2_Patch product_module
+$ cd product_module
+[[ hack away ]]
+$ cvs commit
+</pre></div>
+
+<p>This works automatically since the &lsquo;<samp>-r</samp>&rsquo; option is
+sticky.
+</p>
+<a name="Creating-the-branch-after-editing"></a>
+<h4 class="appendixsubsubsec">A.10.2.2 Creating the branch after editing</h4>
+
+<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>
+<div class="example">
+<pre class="example">[[ hacked sources are present ]]
+$ cvs tag -b EXPR1
+$ cvs update -r EXPR1
+$ cvs commit
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">[[ hacked sources are present ]]
+$ cvs tag -b EXPR1
+$ cvs commit -r EXPR1
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">$ cvs checkout -r EXPR1 whatever_module
+</pre></div>
+
+<hr>
+<a name="diff"></a>
+<div class="header">
+<p>
+Next: <a href="#export" accesskey="n" rel="next">export</a>, Previous: <a 
href="#commit" accesskey="p" rel="prev">commit</a>, Up: <a href="#CVS-commands" 
accesskey="u" rel="up">CVS commands</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="diff_002d_002d_002dShow-differences-between-revisions"></a>
+<h3 class="appendixsec">A.11 diff&mdash;Show differences between revisions</h3>
+<a name="index-diff-_0028subcommand_0029"></a>
+
+<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 See <a href="#Exit-status">Exit 
status</a>.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#diff-options" 
accesskey="1">diff options</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">diff options
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#diff-examples" 
accesskey="2">diff examples</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">diff examples
+</td></tr>
+</table>
+
+<hr>
+<a name="diff-options"></a>
+<div class="header">
+<p>
+Next: <a href="#diff-examples" accesskey="n" rel="next">diff examples</a>, Up: 
<a href="#diff" accesskey="u" rel="up">diff</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="diff-options-1"></a>
+<h4 class="appendixsubsec">A.11.1 diff options</h4>
+
+<p>These standard options are supported by <code>diff</code>
+(see <a href="#Common-options">Common options</a> 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
+<a href="#Keyword-substitution">Keyword substitution</a>.
+</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 <a href="#Line-group-formats">Line 
group formats</a>.
+</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 <a href="#Line-formats">Line formats</a>.
+</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 <a href="#Line-group-formats">Line group 
formats</a>.
+</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 <a href="#Line-formats">Line formats</a>.
+</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 <a href="#Line-group-formats">Line group 
formats</a>.
+</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 <a href="#Line-formats">Line formats</a>.
+</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 <a href="#Line-group-formats">Line group 
formats</a>.
+</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 <a href="#Line-formats">Line formats</a>.
+</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>
+
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Line-group-formats" 
accesskey="1">Line group formats</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Line group formats
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Line-formats" 
accesskey="2">Line formats</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Line formats
+</td></tr>
+</table>
+
+<hr>
+<a name="Line-group-formats"></a>
+<div class="header">
+<p>
+Next: <a href="#Line-formats" accesskey="n" rel="next">Line formats</a>, Up: 
<a href="#diff-options" accesskey="u" rel="up">diff options</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Line-group-formats-1"></a>
+<h4 class="appendixsubsubsec">A.11.1.1 Line group formats</h4>
+
+<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 <samp>myfile</samp>
+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>
+<div class="example">
+<pre class="example">cvs diff \
+   --old-group-format='\begin{em}
+%&lt;\end{em}
+' \
+   --new-group-format='\begin{bf}
+%&gt;\end{bf}
+' \
+   myfile
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">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
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">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
+</pre></div>
+
+<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 <a 
href="#Line-formats">Line formats</a>).
+</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>
+<a name="Line-formats"></a>
+<div class="header">
+<p>
+Previous: <a href="#Line-group-formats" accesskey="p" rel="prev">Line group 
formats</a>, Up: <a href="#diff-options" accesskey="u" rel="up">diff 
options</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Line-formats-1"></a>
+<h4 class="appendixsubsubsec">A.11.1.2 Line formats</h4>
+
+<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>
+<div class="example">
+<pre class="example">cvs diff \
+   --old-line-format='-%l
+' \
+   --new-line-format='|%l
+' \
+   --unchanged-line-format=' %l
+' \
+   myfile
+</pre></div>
+
+<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 <a 
href="#Line-group-formats">Line group formats</a>, 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>
+<div class="example">
+<pre class="example">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
+</pre></div>
+
+<hr>
+<a name="diff-examples"></a>
+<div class="header">
+<p>
+Previous: <a href="#diff-options" accesskey="p" rel="prev">diff options</a>, 
Up: <a href="#diff" accesskey="u" rel="up">diff</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="diff-examples-1"></a>
+<h4 class="appendixsubsec">A.11.2 diff examples</h4>
+
+<p>The following line produces a Unidiff (&lsquo;<samp>-u</samp>&rsquo; flag)
+between revision 1.14 and 1.19 of
+<samp>backend.c</samp>.  Due to the &lsquo;<samp>-kk</samp>&rsquo; flag no
+keywords are substituted, so differences that only depend
+on keyword substitution are ignored.
+</p>
+<div class="example">
+<pre class="example">$ cvs diff -kk -u -r 1.14 -r 1.19 backend.c
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">$ cvs diff -r RELEASE_1_0 -r EXPR1
+</pre></div>
+
+<p>A command like this can be used to produce a context
+diff between two releases:
+</p>
+<div class="example">
+<pre class="example">$ cvs diff -c -r RELEASE_1_0 -r RELEASE_1_1 &gt; diffs
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">$ cvs diff -u | less
+</pre></div>
+
+<hr>
+<a name="export"></a>
+<div class="header">
+<p>
+Next: <a href="#history" accesskey="n" rel="next">history</a>, Previous: <a 
href="#diff" accesskey="p" rel="prev">diff</a>, Up: <a href="#CVS-commands" 
accesskey="u" rel="up">CVS commands</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a 
name="export_002d_002d_002dExport-sources-from-CVS_002c-similar-to-checkout"></a>
+<h3 class="appendixsec">A.12 export&mdash;Export sources from CVS, similar to 
checkout</h3>
+<a name="index-export-_0028subcommand_0029"></a>
+
+<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>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#export-options" 
accesskey="1">export options</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">export options
+</td></tr>
+</table>
+
+<hr>
+<a name="export-options"></a>
+<div class="header">
+<p>
+Up: <a href="#export" accesskey="u" rel="up">export</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="export-options-1"></a>
+<h4 class="appendixsubsec">A.12.1 export options</h4>
+
+<p>These standard options are supported by <code>export</code>
+(see <a href="#Common-options">Common options</a>, 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 <a href="#checkout-options">checkout options</a> 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 <a 
href="#Substitution-modes">Substitution modes</a>).
+</p>
+</dd>
+<dt><code>-N</code></dt>
+<dd><p>Only useful together with &lsquo;<samp>-d <var>dir</var></samp>&rsquo;.
+See <a href="#checkout-options">checkout options</a> for complete details on 
how
+<small>CVS</small> handles this flag.
+</p></dd>
+</dl>
+
+
+<hr>
+<a name="history"></a>
+<div class="header">
+<p>
+Next: <a href="#import" accesskey="n" rel="next">import</a>, Previous: <a 
href="#export" accesskey="p" rel="prev">export</a>, Up: <a href="#CVS-commands" 
accesskey="u" rel="up">CVS commands</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="history_002d_002d_002dShow-status-of-files-and-users"></a>
+<h3 class="appendixsec">A.13 history&mdash;Show status of files and users</h3>
+<a name="index-history-_0028subcommand_0029"></a>
+
+<ul>
+<li> Synopsis:     history [-report] [-flags] [-options args] [files&hellip;]
+</li><li> Requires: the file <samp>$CVSROOT/CVSROOT/history</samp>
+</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
+<samp>$CVSROOT/CVSROOT/history</samp>.
+</p>
+<p><strong><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 <a href="#Common-options">Common 
options</a>).</strong>
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#history-options" 
accesskey="1">history options</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">history options
+</td></tr>
+</table>
+
+<hr>
+<a name="history-options"></a>
+<div class="header">
+<p>
+Up: <a href="#history" accesskey="u" rel="up">history</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="history-options-1"></a>
+<h4 class="appendixsubsec">A.13.1 history options</h4>
+
+<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 five 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>P</code></dt>
+<dd><p>A working file was patched to match 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>
+<a name="import"></a>
+<div class="header">
+<p>
+Next: <a href="#log" accesskey="n" rel="next">log</a>, Previous: <a 
href="#history" accesskey="p" rel="prev">history</a>, Up: <a 
href="#CVS-commands" accesskey="u" rel="up">CVS commands</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a 
name="import_002d_002d_002dImport-sources-into-CVS_002c-using-vendor-branches"></a>
+<h3 class="appendixsec">A.14 import&mdash;Import sources into CVS, using 
vendor branches</h3>
+<a name="index-import-_0028subcommand_0029"></a>
+
+
+<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 <a href="#Tracking-sources">Tracking sources</a> 
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 <a href="#cvsignore">cvsignore</a>), it does not import it and prints
+&lsquo;<samp>I </samp>&rsquo; followed by the filename (see <a 
href="#import-output">import output</a> for a
+complete description of the output).
+</p>
+<p>If the file <samp>$CVSROOT/CVSROOT/cvswrappers</samp> 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 <a href="#Wrappers">Wrappers</a>.
+</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 uniquely identify the files at
+the leaves created each time you execute <code>import</code>.  The
+<var>releasetag</var> should be new, not previously existing in the
+repository file, and uniquely identify the imported release,
+</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 <a href="#Getting-the-source">Getting the source</a>).
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#import-options" 
accesskey="1">import options</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">import options
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#import-output" 
accesskey="2">import output</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">import output
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#import-examples" 
accesskey="3">import examples</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">import examples
+</td></tr>
+</table>
+
+<hr>
+<a name="import-options"></a>
+<div class="header">
+<p>
+Next: <a href="#import-output" accesskey="n" rel="next">import output</a>, Up: 
<a href="#import" accesskey="u" rel="up">import</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="import-options-1"></a>
+<h4 class="appendixsubsec">A.14.1 import options</h4>
+
+<p>This standard option is supported by <code>import</code>
+(see <a href="#Common-options">Common options</a> 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 <a href="#Multiple-vendor-branches">Multiple vendor branches</a>.
+</p>
+</dd>
+<dt><code>-d</code></dt>
+<dd><p>Use each file&rsquo;s modification time as the time of import
+rather than the current time.
+</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 <a href="#Substitution-modes">Substitution modes</a> 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 <samp>.cvsignore</samp> file.
+See <a href="#cvsignore">cvsignore</a>.
+</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 <samp>.cvswrappers</samp>
+file. See <a href="#Wrappers">Wrappers</a>.
+</p></dd>
+</dl>
+
+<hr>
+<a name="import-output"></a>
+<div class="header">
+<p>
+Next: <a href="#import-examples" accesskey="n" rel="next">import examples</a>, 
Previous: <a href="#import-options" accesskey="p" rel="prev">import 
options</a>, Up: <a href="#import" accesskey="u" rel="up">import</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="import-output-1"></a>
+<h4 class="appendixsubsec">A.14.2 import output</h4>
+
+<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 <a href="#cvsignore">cvsignore</a>).
+</p>
+<a name="index-Symbolic-link_002c-importing"></a>
+<a name="index-Link_002c-symbolic_002c-importing"></a>
+</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 doesn&rsquo;t seem to be apparent.
+(Various options in the <samp>modules</samp> file can be used
+to recreate symbolic links on checkout, update, etc.;
+see <a href="#modules">modules</a>.)
+</p></dd>
+</dl>
+
+<hr>
+<a name="import-examples"></a>
+<div class="header">
+<p>
+Previous: <a href="#import-output" accesskey="p" rel="prev">import output</a>, 
Up: <a href="#import" accesskey="u" rel="up">import</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="import-examples-1"></a>
+<h4 class="appendixsubsec">A.14.3 import examples</h4>
+
+<p>See <a href="#Tracking-sources">Tracking sources</a>, and <a 
href="#From-files">From files</a>.
+</p>
+<hr>
+<a name="log"></a>
+<div class="header">
+<p>
+Next: <a href="#rdiff" accesskey="n" rel="next">rdiff</a>, Previous: <a 
href="#import" accesskey="p" rel="prev">import</a>, Up: <a href="#CVS-commands" 
accesskey="u" rel="up">CVS commands</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="log_002d_002d_002dPrint-out-log-information-for-files"></a>
+<h3 class="appendixsec">A.15 log&mdash;Print out log information for files</h3>
+<a name="index-log-_0028subcommand_0029"></a>
+
+<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>
+<a name="index-Timezone_002c-in-output"></a>
+<a name="index-Zone_002c-time_002c-in-output"></a>
+<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><code>log</code> uses &lsquo;<samp>-R</samp>&rsquo; in a way that 
conflicts
+with the normal use inside <small>CVS</small> (see <a 
href="#Common-options">Common options</a>).</strong>
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#log-options" 
accesskey="1">log options</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">log options
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#log-examples" 
accesskey="2">log examples</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">log examples
+</td></tr>
+</table>
+
+<hr>
+<a name="log-options"></a>
+<div class="header">
+<p>
+Next: <a href="#log-examples" accesskey="n" rel="next">log examples</a>, Up: 
<a href="#log" accesskey="u" rel="up">log</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="log-options-1"></a>
+<h4 class="appendixsubsec">A.15.1 log options</h4>
+
+<p>By default, <code>log</code> prints all information that is
+available.  All other options restrict the output.  Note that the revision
+selection options (<code>-b</code>, <code>-d</code>, <code>-r</code>, 
<code>-s</code>, and <code>-w</code>)
+have no
+effect, other than possibly causing a search for files in Attic directories,
+when used in conjunction with the options that restrict the output to only
+<code>log</code> header fields (<code>-h</code>, <code>-R</code>, and 
<code>-t</code>)
+unless the <code>-S</code> option is also specified.
+</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 <a href="#Common-options">Common 
options</a>).
+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>-n</code></dt>
+<dd><p>Print the list of tags for this file. This option can
+be very useful when your <samp>.cvsrc</samp> file has a
+&lsquo;<samp>log -N</samp>&rsquo; entry as a way to get a full list of all
+of the tags.
+</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>.  Individual states may
+be any text string, though <small>CVS</small> commonly only uses two
+states, &lsquo;<samp>Exp</samp>&rsquo; and &lsquo;<samp>dead</samp>&rsquo;.  
See <a href="#admin-options">admin options</a>
+for more information.
+</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>
+<a name="log-examples"></a>
+<div class="header">
+<p>
+Previous: <a href="#log-options" accesskey="p" rel="prev">log options</a>, Up: 
<a href="#log" accesskey="u" rel="up">log</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="log-examples-1"></a>
+<h4 class="appendixsubsec">A.15.2 log examples</h4>
+
+<p>Contributed examples are gratefully accepted.
+</p>
+<hr>
+<a name="rdiff"></a>
+<div class="header">
+<p>
+Next: <a href="#release" accesskey="n" rel="next">release</a>, Previous: <a 
href="#log" accesskey="p" rel="prev">log</a>, Up: <a href="#CVS-commands" 
accesskey="u" rel="up">CVS commands</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a 
name="rdiff_002d_002d_002d_0027patch_0027-format-diffs-between-releases"></a>
+<h3 class="appendixsec">A.16 rdiff&mdash;&rsquo;patch&rsquo; format diffs 
between releases</h3>
+<a name="index-rdiff-_0028subcommand_0029"></a>
+
+<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>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#rdiff-options" 
accesskey="1">rdiff options</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">rdiff options
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#rdiff-examples" 
accesskey="2">rdiff examples</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">rdiff examples
+</td></tr>
+</table>
+
+<hr>
+<a name="rdiff-options"></a>
+<div class="header">
+<p>
+Next: <a href="#rdiff-examples" accesskey="n" rel="next">rdiff examples</a>, 
Up: <a href="#rdiff" accesskey="u" rel="up">rdiff</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="rdiff-options-1"></a>
+<h4 class="appendixsubsec">A.16.1 rdiff options</h4>
+
+<p>These standard options are supported by <code>rdiff</code>
+(see <a href="#Common-options">Common options</a> 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>-k <var>kflag</var></code></dt>
+<dd><p>Process keywords according to <var>kflag</var>.  See
+<a href="#Keyword-substitution">Keyword substitution</a>.
+</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>
+<a name="rdiff-examples"></a>
+<div class="header">
+<p>
+Previous: <a href="#rdiff-options" accesskey="p" rel="prev">rdiff options</a>, 
Up: <a href="#rdiff" accesskey="u" rel="up">rdiff</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="rdiff-examples-1"></a>
+<h4 class="appendixsubsec">A.16.2 rdiff examples</h4>
+
+<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>
+<div class="example">
+<pre class="example">$ cvs rdiff -c -r FOO1_2 -r FOO1_4 tc | \
+&gt; Mail -s 'The patches you asked for' address@hidden
+</pre></div>
+
+<p>Suppose you have made release 1.3, and forked a branch
+called &lsquo;<samp>R_1_3fix</samp>&rsquo; for bug fixes.  
&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>
+<div class="example">
+<pre class="example">$ cvs patch -s -r R_1_3_1 -r R_1_3fix module-name
+cvs rdiff: Diffing module-name
+File ChangeLog,v changed from revision 1.52.2.5 to 1.52.2.6
+File foo.c,v changed from revision 1.52.2.3 to 1.52.2.4
+File bar.h,v changed from revision 1.29.2.1 to 1.2
+</pre></div>
+
+<hr>
+<a name="release"></a>
+<div class="header">
+<p>
+Next: <a href="#remove" accesskey="n" rel="next">remove</a>, Previous: <a 
href="#rdiff" accesskey="p" rel="prev">rdiff</a>, Up: <a href="#CVS-commands" 
accesskey="u" rel="up">CVS commands</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="release_002d_002d_002dIndicate-that-a-Module-is-no-longer-in-use"></a>
+<h3 class="appendixsec">A.17 release&mdash;Indicate that a Module is no longer 
in use</h3>
+<a name="index-release-_0028subcommand_0029"></a>
+
+<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 <a href="#history-file">history file</a>) 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>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#release-options" 
accesskey="1">release options</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">release options
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#release-output" 
accesskey="2">release output</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">release output
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#release-examples" 
accesskey="3">release examples</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">release examples
+</td></tr>
+</table>
+
+<hr>
+<a name="release-options"></a>
+<div class="header">
+<p>
+Next: <a href="#release-output" accesskey="n" rel="next">release output</a>, 
Up: <a href="#release" accesskey="u" rel="up">release</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="release-options-1"></a>
+<h4 class="appendixsubsec">A.17.1 release options</h4>
+
+<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
+created inside checked-out sources, and not added to
+the repository (using the <code>add</code> command;
+see <a href="#Adding-files">Adding files</a>) will be silently 
deleted&mdash;even
+if it is non-empty!</strong>
+</p></dd>
+</dl>
+
+<hr>
+<a name="release-output"></a>
+<div class="header">
+<p>
+Next: <a href="#release-examples" accesskey="n" rel="next">release 
examples</a>, Previous: <a href="#release-options" accesskey="p" 
rel="prev">release options</a>, Up: <a href="#release" accesskey="u" 
rel="up">release</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="release-output-1"></a>
+<h4 class="appendixsubsec">A.17.2 release output</h4>
+
+<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 <a href="#commit">commit</a>.
+</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 <a href="#cvsignore">cvsignore</a>).  If you remove your working
+sources, this file will be lost.
+</p></dd>
+</dl>
+
+<hr>
+<a name="release-examples"></a>
+<div class="header">
+<p>
+Previous: <a href="#release-output" accesskey="p" rel="prev">release 
output</a>, Up: <a href="#release" accesskey="u" rel="up">release</a> &nbsp; 
[<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="release-examples-1"></a>
+<h4 class="appendixsubsec">A.17.3 release examples</h4>
+
+<p>Release the <samp>tc</samp> directory, and delete your local working copy
+of the files.
+</p>
+<div class="example">
+<pre class="example">$ 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
+$
+</pre></div>
+
+<hr>
+<a name="remove"></a>
+<div class="header">
+<p>
+Next: <a href="#update" accesskey="n" rel="next">update</a>, Previous: <a 
href="#release" accesskey="p" rel="prev">release</a>, Up: <a 
href="#CVS-commands" accesskey="u" rel="up">CVS commands</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="remove_002d_002d_002dRemove-files-from-active-use"></a>
+<h3 class="appendixsec">A.18 remove&mdash;Remove files from active use</h3>
+<a name="index-remove-_0028subcommand_0029"></a>
+
+<ul>
+<li> Synopsis: remove [-flR] [files...]
+</li><li> Requires: repository, working directory.
+</li><li> Changes: working directory.
+</li></ul>
+
+<p>The <code>remove</code> command is used to remove unwanted
+files from active use.  The user normally deletes the
+files from the working directory prior to invocation
+of the <code>remove</code> command.  Only the working
+directory is updated.  Changes to the repository are
+not made until the <code>commit</code> command is run.
+</p>
+<p>The <code>remove</code> command does not delete files from
+from the repository.  <small>CVS</small> keeps all historical
+data in the repository so that it is possible to
+reconstruct previous states of the projects under
+revision control.
+</p>
+<p>To undo <small>CVS</small> <code>remove</code> or to resurrect files
+that were previously removed, See <a href="#add">add</a>.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#remove-options" 
accesskey="1">remove options</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">remove options
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#remove-examples" 
accesskey="2">remove examples</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">remove examples
+</td></tr>
+</table>
+
+<hr>
+<a name="remove-options"></a>
+<div class="header">
+<p>
+Next: <a href="#remove-examples" accesskey="n" rel="next">remove examples</a>, 
Up: <a href="#remove" accesskey="u" rel="up">remove</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="remove-options-1"></a>
+<h4 class="appendixsubsec">A.18.1 remove options</h4>
+
+<p>These standard options are supported by <code>remove</code>
+(see <a href="#Common-options">Common options</a> for a complete description of
+them):
+</p>
+<dl compact="compact">
+<dt><code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-R</code></dt>
+<dd><p>Process directories recursively.  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+</dl>
+
+<p>In addition, these options are also supported:
+</p>
+<dl compact="compact">
+<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 <a 
href="#Common-options">Common options</a>.
+</p>
+<p>Delete files before removing them.
+</p>
+<p>Entire directory hierarchies are easily removed
+using &lsquo;<samp>-f</samp>&rsquo;, but take note that it is not as
+easy to resurrect directory hierarchies as it is
+to remove them.
+</p>
+</dd>
+</dl>
+
+<hr>
+<a name="remove-examples"></a>
+<div class="header">
+<p>
+Previous: <a href="#remove-options" accesskey="p" rel="prev">remove 
options</a>, Up: <a href="#remove" accesskey="u" rel="up">remove</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="remove-examples-1"></a>
+<h4 class="appendixsubsec">A.18.2 remove examples</h4>
+
+<a name="Removing-a-file"></a>
+<h4 class="appendixsubsubsec">A.18.2.1 Removing a file</h4>
+
+<div class="example">
+<pre class="example">$ cvs remove remove.me
+cvs remove: file `remove.me' still in working directory
+cvs remove: 1 file exists; remove it first
+$ rm -f remove.me
+$ cvs remove remove.me
+cvs remove: scheduling `remove.me' for removal
+cvs remove: use 'cvs commit' to remove this file permanently
+
+$ ls remove.it
+remove.it
+$ cvs remove -f remove.it
+cvs remove: scheduling `remove.it' for removal
+cvs remove: use 'cvs commit' to remove this file permanently
+</pre></div>
+
+<a name="Removing-entire-directories"></a>
+<h4 class="appendixsubsubsec">A.18.2.2 Removing entire directories</h4>
+<div class="example">
+<pre class="example">$ tree -d a
+a
+|-- CVS
+`-- b
+    `-- CVS
+
+3 directories
+$ cvs remove -f a
+cvs remove: Removing a
+cvs remove: Removing a/b
+cvs remove: scheduling `a/b/c' for removal
+cvs remove: use 'cvs commit' to remove this file permanently
+</pre></div>
+
+<hr>
+<a name="update"></a>
+<div class="header">
+<p>
+Previous: <a href="#remove" accesskey="p" rel="prev">remove</a>, Up: <a 
href="#CVS-commands" accesskey="u" rel="up">CVS commands</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="update_002d_002d_002dBring-work-tree-in-sync-with-repository"></a>
+<h3 class="appendixsec">A.19 update&mdash;Bring work tree in sync with 
repository</h3>
+<a name="index-update-_0028subcommand_0029"></a>
+
+<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.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#update-options" 
accesskey="1">update options</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">update options
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#update-output" 
accesskey="2">update output</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">update output
+</td></tr>
+</table>
+
+<hr>
+<a name="update-options"></a>
+<div class="header">
+<p>
+Next: <a href="#update-output" accesskey="n" rel="next">update output</a>, Up: 
<a href="#update" accesskey="u" rel="up">update</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="update-options-1"></a>
+<h4 class="appendixsubsec">A.19.1 update options</h4>
+
+<p>These standard options are available with <code>update</code>
+(see <a href="#Common-options">Common options</a> 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 <a href="#Sticky-tags">Sticky tags</a> 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
+<a href="#Keyword-substitution">Keyword substitution</a>.
+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 <a href="#Invoking-CVS">Invoking CVS</a> 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 <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-P</code></dt>
+<dd><p>Prune empty directories.  See <a href="#Moving-directories">Moving 
directories</a>.
+</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 <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</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 <a href="#Sticky-tags">Sticky tags</a>, 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.
+Does not reset sticky &lsquo;<samp>-k</samp>&rsquo; options on modified files.
+See <a href="#Sticky-tags">Sticky tags</a> 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
+<samp>.#<var>file</var>.<var>revision</var></samp>, 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 <a href="#cvsignore">cvsignore</a> 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 <samp>.cvswrappers</samp>
+file.  See <a href="#Wrappers">Wrappers</a>.
+</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 <a href="#Merging-adds-and-removals">Merging adds and removals</a> for 
more information.
+</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 <a href="#Branching-and-merging">Branching and merging</a>.
+</p>
+</dd>
+</dl>
+
+<hr>
+<a name="update-output"></a>
+<div class="header">
+<p>
+Previous: <a href="#update-options" accesskey="p" rel="prev">update 
options</a>, Up: <a href="#update" accesskey="u" rel="up">update</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="update-output-1"></a>
+<h4 class="appendixsubsec">A.19.2 update output</h4>
+
+<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 working directory, 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><a name="index-_002e_0023-files"></a>
+<a name="index-_005f_005f-files-_0028VMS_0029"></a>
+<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
+<samp>.#<var>file</var>.<var>revision</var></samp> where <var>revision</var>
+is the revision that your modified file started
+from.  Resolve the conflict as described in
+<a href="#Conflicts-example">Conflicts example</a>.
+(Note that some systems automatically purge
+files that begin with <samp>.#</samp> 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
+<samp>__</samp> rather than <samp>.#</samp>.
+</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 <a href="#cvsignore">cvsignore</a>).
+</p></dd>
+</dl>
+
+<hr>
+<a name="Invoking-CVS"></a>
+<div class="header">
+<p>
+Next: <a href="#Administrative-files" accesskey="n" rel="next">Administrative 
files</a>, Previous: <a href="#CVS-commands" accesskey="p" rel="prev">CVS 
commands</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Quick-reference-to-CVS-commands"></a>
+<h2 class="appendix">Appendix B Quick reference to CVS commands</h2>
+<a name="index-Command-reference"></a>
+<a name="index-Reference_002c-commands"></a>
+<a name="index-Invoking-CVS"></a>
+
+<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 <a href="#Index">Index</a>.
+</p>
+<p>A <small>CVS</small> command looks like:
+</p>
+<div class="example">
+<pre class="example">cvs [ <var>global_options</var> ] <var>command</var> [ 
<var>command_options</var> ] [ <var>command_args</var> ]
+</pre></div>
+
+<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 <a 
href="#Password-authentication-server">Password authentication server</a>.
+</p>
+</dd>
+<dt><code>-a</code></dt>
+<dd><p>Authenticate all communication (client only) (not in <small>CVS</small>
+1.9 and older).  See <a href="#Global-options">Global options</a>.
+</p>
+</dd>
+<dt><code>-b</code></dt>
+<dd><p>Specify RCS location (<small>CVS</small> 1.9 and older).  See
+<a href="#Global-options">Global options</a>.
+</p>
+</dd>
+<dt><code>-d <var>root</var></code></dt>
+<dd><p>Specify the <small>CVSROOT</small>.  See <a 
href="#Repository">Repository</a>.
+</p>
+</dd>
+<dt><code>-e <var>editor</var></code></dt>
+<dd><p>Edit messages with <var>editor</var>.  See <a 
href="#Committing-your-changes">Committing your changes</a>.
+</p>
+</dd>
+<dt><code>-f</code></dt>
+<dd><p>Do not read the <samp>~/.cvsrc</samp> file.  See <a 
href="#Global-options">Global options</a>.
+</p>
+</dd>
+<dt><code>-H</code></dt>
+<dt><code>--help</code></dt>
+<dd><p>Print a help message.  See <a href="#Global-options">Global options</a>.
+</p>
+</dd>
+<dt><code>-n</code></dt>
+<dd><p>Do not change any files.  See <a href="#Global-options">Global 
options</a>.
+</p>
+</dd>
+<dt><code>-Q</code></dt>
+<dd><p>Be really quiet.  See <a href="#Global-options">Global options</a>.
+</p>
+</dd>
+<dt><code>-q</code></dt>
+<dd><p>Be somewhat quiet.  See <a href="#Global-options">Global options</a>.
+</p>
+</dd>
+<dt><code>-r</code></dt>
+<dd><p>Make new working files read-only.  See <a href="#Global-options">Global 
options</a>.
+</p>
+</dd>
+<dt><code>-s <var>variable</var>=<var>value</var></code></dt>
+<dd><p>Set a user variable.  See <a href="#Variables">Variables</a>.
+</p>
+</dd>
+<dt><code>-T <var>tempdir</var></code></dt>
+<dd><p>Put temporary files in <var>tempdir</var>.  See <a 
href="#Global-options">Global options</a>.
+</p>
+</dd>
+<dt><code>-t</code></dt>
+<dd><p>Trace <small>CVS</small> execution.  See <a 
href="#Global-options">Global options</a>.
+</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 <a 
href="#Global-options">Global options</a>.
+</p>
+</dd>
+<dt><code>-x</code></dt>
+<dd><p>Encrypt all communication (client only).
+See <a href="#Global-options">Global options</a>.
+</p>
+</dd>
+<dt><code>-z <var>gzip-level</var></code></dt>
+<dd><a name="index-Compression-1"></a>
+<a name="index-Gzip-1"></a>
+<p>Set the compression level (client only).
+See <a href="#Global-options">Global options</a>.
+</p></dd>
+</dl>
+
+<p>Keyword expansion modes (see <a href="#Substitution-modes">Substitution 
modes</a>):
+</p>
+<div class="example">
+<pre class="example">-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>
+</pre></div>
+
+<p>Keywords (see <a href="#Keyword-list">Keyword list</a>):
+</p>
+<div class="example">
+<pre class="example">$<i></i>Author: joe $
+$<i></i>Date: 1993/12/09 03:21:13 $
+$<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
+
+</pre></div>
+
+<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 <a href="#Adding-files">Adding files</a>.
+</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
+<a href="#admin">admin</a>.
+</p>
+<dl compact="compact">
+<dt><code>-b[<var>rev</var>]</code></dt>
+<dd><p>Set default branch.  See <a href="#Reverting-local-changes">Reverting 
local changes</a>.
+</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 <a href="#Keyword-substitution">Keyword 
substitution</a>.
+</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
+<a href="#admin-options">admin options</a>.
+</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.  See <a href="#admin-options">admin options</a> for more 
information on possible
+states.
+</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
+<a href="#annotate">annotate</a>.
+</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 <a href="#Common-options">Common options</a>.
+</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
+<a href="#Common-options">Common options</a>.
+</p>
+</dd>
+<dt><code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-R</code></dt>
+<dd><p>Operate recursively (default).  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-r <var>tag</var></code></dt>
+<dd><p>Annotate revision <var>tag</var>.  See <a href="#Common-options">Common 
options</a>.
+</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 <a href="#checkout">checkout</a>.
+</p>
+<dl compact="compact">
+<dt><code>-A</code></dt>
+<dd><p>Reset any sticky tags/date/options.  See <a href="#Sticky-tags">Sticky 
tags</a> and <a href="#Keyword-substitution">Keyword substitution</a>.
+</p>
+</dd>
+<dt><code>-c</code></dt>
+<dd><p>Output the module database.  See <a href="#checkout-options">checkout 
options</a>.
+</p>
+</dd>
+<dt><code>-D <var>date</var></code></dt>
+<dd><p>Check out revisions as of <var>date</var> (is sticky).  See
+<a href="#Common-options">Common options</a>.
+</p>
+</dd>
+<dt><code>-d <var>dir</var></code></dt>
+<dd><p>Check out into <var>dir</var>.  See <a 
href="#checkout-options">checkout options</a>.
+</p>
+</dd>
+<dt><code>-f</code></dt>
+<dd><p>Use head revision if tag/date not found.  See
+<a href="#Common-options">Common options</a>.
+</p>
+</dd>
+<dt><code>-j <var>rev</var></code></dt>
+<dd><p>Merge in changes.  See <a href="#checkout-options">checkout options</a>.
+</p>
+</dd>
+<dt><code>-k <var>kflag</var></code></dt>
+<dd><p>Use <var>kflag</var> keyword expansion.  See
+<a href="#Substitution-modes">Substitution modes</a>.
+</p>
+</dd>
+<dt><code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-N</code></dt>
+<dd><p>Don&rsquo;t &ldquo;shorten&rdquo; module paths if -d specified.  See
+<a href="#checkout-options">checkout options</a>.
+</p>
+</dd>
+<dt><code>-n</code></dt>
+<dd><p>Do not run module program (if any).  See <a 
href="#checkout-options">checkout options</a>.
+</p>
+</dd>
+<dt><code>-P</code></dt>
+<dd><p>Prune empty directories.  See <a href="#Moving-directories">Moving 
directories</a>.
+</p>
+</dd>
+<dt><code>-p</code></dt>
+<dd><p>Check out files to standard output (avoids
+stickiness).  See <a href="#checkout-options">checkout options</a>.
+</p>
+</dd>
+<dt><code>-R</code></dt>
+<dd><p>Operate recursively (default).  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-r <var>tag</var></code></dt>
+<dd><p>Checkout revision <var>tag</var> (is sticky).  See <a 
href="#Common-options">Common options</a>.
+</p>
+</dd>
+<dt><code>-s</code></dt>
+<dd><p>Like -c, but include module status.  See <a 
href="#checkout-options">checkout options</a>.
+</p></dd>
+</dl>
+
+</dd>
+<dt><code>commit [<var>options</var>] [<var>files</var>&hellip;]</code></dt>
+<dd><p>Check changes into the repository.  See <a href="#commit">commit</a>.
+</p>
+<dl compact="compact">
+<dt><code>-F <var>file</var></code></dt>
+<dd><p>Read log message from <var>file</var>.  See <a 
href="#commit-options">commit options</a>.
+</p>
+</dd>
+<dt><code>-f</code></dt>
+<dd><p>Force the file to be committed; disables recursion.
+See <a href="#commit-options">commit options</a>.
+</p>
+</dd>
+<dt><code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-m <var>msg</var></code></dt>
+<dd><p>Use <var>msg</var> as log message.  See <a 
href="#commit-options">commit options</a>.
+</p>
+</dd>
+<dt><code>-n</code></dt>
+<dd><p>Do not run module program (if any).  See <a 
href="#commit-options">commit options</a>.
+</p>
+</dd>
+<dt><code>-R</code></dt>
+<dd><p>Operate recursively (default).  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-r <var>rev</var></code></dt>
+<dd><p>Commit to <var>rev</var>.  See <a href="#commit-options">commit 
options</a>.
+</p></dd>
+</dl>
+
+</dd>
+<dt><code>diff [<var>options</var>] [<var>files</var>&hellip;]</code></dt>
+<dd><p>Show differences between revisions.  See <a href="#diff">diff</a>.
+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
+<a href="#diff-options">diff options</a>.
+</p>
+</dd>
+<dt><code>-D <var>date2</var></code></dt>
+<dd><p>Diff <var>rev1</var>/<var>date1</var> against <var>date2</var>.  See
+<a href="#diff-options">diff options</a>.
+</p>
+</dd>
+<dt><code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-N</code></dt>
+<dd><p>Include diffs for added and removed files.  See
+<a href="#diff-options">diff options</a>.
+</p>
+</dd>
+<dt><code>-R</code></dt>
+<dd><p>Operate recursively (default).  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-r <var>rev1</var></code></dt>
+<dd><p>Diff revision for <var>rev1</var> against working file.  See
+<a href="#diff-options">diff options</a>.
+</p>
+</dd>
+<dt><code>-r <var>rev2</var></code></dt>
+<dd><p>Diff <var>rev1</var>/<var>date1</var> against <var>rev2</var>.  See <a 
href="#diff-options">diff options</a>.
+</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 <a href="#Editing-files">Editing 
files</a>.
+</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
+<a href="#Editing-files">Editing files</a>.
+</p>
+</dd>
+<dt><code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-R</code></dt>
+<dd><p>Operate recursively (default).  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</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 <a 
href="#Watch-information">Watch information</a>.
+</p>
+<dl compact="compact">
+<dt><code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-R</code></dt>
+<dd><p>Operate recursively (default).  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</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 <a href="#export">export</a>.
+</p>
+<dl compact="compact">
+<dt><code>-D <var>date</var></code></dt>
+<dd><p>Check out revisions as of <var>date</var>.  See
+<a href="#Common-options">Common options</a>.
+</p>
+</dd>
+<dt><code>-d <var>dir</var></code></dt>
+<dd><p>Check out into <var>dir</var>.  See <a href="#export-options">export 
options</a>.
+</p>
+</dd>
+<dt><code>-f</code></dt>
+<dd><p>Use head revision if tag/date not found.  See
+<a href="#Common-options">Common options</a>.
+</p>
+</dd>
+<dt><code>-k <var>kflag</var></code></dt>
+<dd><p>Use <var>kflag</var> keyword expansion.  See
+<a href="#Substitution-modes">Substitution modes</a>.
+</p>
+</dd>
+<dt><code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-N</code></dt>
+<dd><p>Don&rsquo;t &ldquo;shorten&rdquo; module paths if -d specified.  See
+<a href="#export-options">export options</a>.
+</p>
+</dd>
+<dt><code>-n</code></dt>
+<dd><p>Do not run module program (if any).  See <a 
href="#export-options">export options</a>.
+</p>
+</dd>
+<dt><code>-R</code></dt>
+<dd><p>Operate recursively (default).  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-r <var>tag</var></code></dt>
+<dd><p>Checkout revision <var>tag</var>.  See <a href="#Common-options">Common 
options</a>.
+</p></dd>
+</dl>
+
+</dd>
+<dt><code>history [<var>options</var>] [<var>files</var>&hellip;]</code></dt>
+<dd><p>Show repository access history.  See <a href="#history">history</a>.
+</p>
+<dl compact="compact">
+<dt><code>-a</code></dt>
+<dd><p>All users (default is self).  See <a href="#history-options">history 
options</a>.
+</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 <a href="#history-options">history options</a>.
+</p>
+</dd>
+<dt><code>-c</code></dt>
+<dd><p>Report on committed (modified) files.  See <a 
href="#history-options">history options</a>.
+</p>
+</dd>
+<dt><code>-D <var>date</var></code></dt>
+<dd><p>Since <var>date</var>.  See <a href="#history-options">history 
options</a>.
+</p>
+</dd>
+<dt><code>-e</code></dt>
+<dd><p>Report on all record types.  See <a href="#history-options">history 
options</a>.
+</p>
+</dd>
+<dt><code>-l</code></dt>
+<dd><p>Last modified (committed or modified report).  See <a 
href="#history-options">history options</a>.
+</p>
+</dd>
+<dt><code>-m <var>module</var></code></dt>
+<dd><p>Report on <var>module</var> (repeatable).  See <a 
href="#history-options">history options</a>.
+</p>
+</dd>
+<dt><code>-n <var>module</var></code></dt>
+<dd><p>In <var>module</var>.  See <a href="#history-options">history 
options</a>.
+</p>
+</dd>
+<dt><code>-o</code></dt>
+<dd><p>Report on checked out modules.  See <a href="#history-options">history 
options</a>.
+</p>
+</dd>
+<dt><code>-p <var>repository</var></code></dt>
+<dd><p>In <var>repository</var>.  See <a href="#history-options">history 
options</a>.
+</p>
+</dd>
+<dt><code>-r <var>rev</var></code></dt>
+<dd><p>Since revision <var>rev</var>.  See <a href="#history-options">history 
options</a>.
+</p>
+</dd>
+<dt><code>-T</code></dt>
+<dd><p>Produce report on all TAGs.  See <a href="#history-options">history 
options</a>.
+</p>
+</dd>
+<dt><code>-t <var>tag</var></code></dt>
+<dd><p>Since tag record placed in history file (by anyone).
+See <a href="#history-options">history options</a>.
+</p>
+</dd>
+<dt><code>-u <var>user</var></code></dt>
+<dd><p>For user <var>user</var> (repeatable).  See <a 
href="#history-options">history options</a>.
+</p>
+</dd>
+<dt><code>-w</code></dt>
+<dd><p>Working directory must match.  See <a href="#history-options">history 
options</a>.
+</p>
+</dd>
+<dt><code>-x <var>types</var></code></dt>
+<dd><p>Report on <var>types</var>, one or more of
+<code>TOEFWUPCGMAR</code>.  See <a href="#history-options">history options</a>.
+</p>
+</dd>
+<dt><code>-z <var>zone</var></code></dt>
+<dd><p>Output for time zone <var>zone</var>.  See <a 
href="#history-options">history options</a>.
+</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
+<a href="#import">import</a>.
+</p>
+<dl compact="compact">
+<dt><code>-b <var>bra</var></code></dt>
+<dd><p>Import to vendor branch <var>bra</var>.  See
+<a href="#Multiple-vendor-branches">Multiple vendor branches</a>.
+</p>
+</dd>
+<dt><code>-d</code></dt>
+<dd><p>Use the file&rsquo;s modification time as the time of
+import.  See <a href="#import-options">import options</a>.
+</p>
+</dd>
+<dt><code>-k <var>kflag</var></code></dt>
+<dd><p>Set default keyword substitution mode.  See
+<a href="#import-options">import options</a>.
+</p>
+</dd>
+<dt><code>-m <var>msg</var></code></dt>
+<dd><p>Use <var>msg</var> for log message.  See
+<a href="#import-options">import options</a>.
+</p>
+</dd>
+<dt><code>-I <var>ign</var></code></dt>
+<dd><p>More files to ignore (! to reset).  See
+<a href="#import-options">import options</a>.
+</p>
+</dd>
+<dt><code>-W <var>spec</var></code></dt>
+<dd><p>More wrappers.  See <a href="#import-options">import options</a>.
+</p></dd>
+</dl>
+
+</dd>
+<dt><code>init</code></dt>
+<dd><p>Create a <small>CVS</small> repository if it doesn&rsquo;t exist.  See
+<a href="#Creating-a-repository">Creating a repository</a>.
+</p>
+</dd>
+<dt><code>kserver</code></dt>
+<dd><p>Kerberos authenticated server.
+See <a href="#Kerberos-authenticated">Kerberos authenticated</a>.
+</p>
+</dd>
+<dt><code>log [<var>options</var>] [<var>files</var>&hellip;]</code></dt>
+<dd><p>Print out history information for files.  See <a href="#log">log</a>.
+</p>
+<dl compact="compact">
+<dt><code>-b</code></dt>
+<dd><p>Only list revisions on the default branch.  See <a 
href="#log-options">log options</a>.
+</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 <a href="#log-options">log options</a>.
+</p>
+</dd>
+<dt><code>-h</code></dt>
+<dd><p>Only print header.  See <a href="#log-options">log options</a>.
+</p>
+</dd>
+<dt><code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-N</code></dt>
+<dd><p>Do not list tags.  See <a href="#log-options">log options</a>.
+</p>
+</dd>
+<dt><code>-R</code></dt>
+<dd><p>Only print name of RCS file.  See <a href="#log-options">log 
options</a>.
+</p>
+</dd>
+<dt><code>-r<var>revs</var></code></dt>
+<dd><p>Only list revisions <var>revs</var>.  See <a href="#log-options">log 
options</a>.
+</p>
+</dd>
+<dt><code>-s <var>states</var></code></dt>
+<dd><p>Only list revisions with specified states.  See <a 
href="#log-options">log options</a>.
+</p>
+</dd>
+<dt><code>-t</code></dt>
+<dd><p>Only print header and descriptive text.  See <a href="#log-options">log 
options</a>.
+</p>
+</dd>
+<dt><code>-w<var>logins</var></code></dt>
+<dd><p>Only list revisions checked in by specified logins.  See <a 
href="#log-options">log options</a>.
+</p></dd>
+</dl>
+
+</dd>
+<dt><code>login</code></dt>
+<dd><p>Prompt for password for authenticating server.  See
+<a href="#Password-authentication-client">Password authentication client</a>.
+</p>
+</dd>
+<dt><code>logout</code></dt>
+<dd><p>Remove stored password for authenticating server.  See
+<a href="#Password-authentication-client">Password authentication client</a>.
+</p>
+</dd>
+<dt><code>pserver</code></dt>
+<dd><p>Password authenticated server.
+See <a href="#Password-authentication-server">Password authentication 
server</a>.
+</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
+<a href="#annotate">annotate</a>.
+</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 <a href="#Common-options">Common options</a>.
+</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
+<a href="#Common-options">Common options</a>.
+</p>
+</dd>
+<dt><code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-R</code></dt>
+<dd><p>Operate recursively (default).  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-r <var>tag</var></code></dt>
+<dd><p>Annotate revision <var>tag</var>.  See <a href="#Common-options">Common 
options</a>.
+</p></dd>
+</dl>
+
+</dd>
+<dt><code>rdiff [<var>options</var>] <var>modules</var>&hellip;</code></dt>
+<dd><p>Show differences between releases.  See <a href="#rdiff">rdiff</a>.
+</p>
+<dl compact="compact">
+<dt><code>-c</code></dt>
+<dd><p>Context diff output format (default).  See <a 
href="#rdiff-options">rdiff options</a>.
+</p>
+</dd>
+<dt><code>-D <var>date</var></code></dt>
+<dd><p>Select revisions based on <var>date</var>.  See <a 
href="#Common-options">Common options</a>.
+</p>
+</dd>
+<dt><code>-f</code></dt>
+<dd><p>Use head revision if tag/date not found.  See
+<a href="#Common-options">Common options</a>.
+</p>
+</dd>
+<dt><code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-R</code></dt>
+<dd><p>Operate recursively (default).  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-r <var>rev</var></code></dt>
+<dd><p>Select revisions based on <var>rev</var>.  See <a 
href="#Common-options">Common options</a>.
+</p>
+</dd>
+<dt><code>-s</code></dt>
+<dd><p>Short patch - one liner per file.  See <a href="#rdiff-options">rdiff 
options</a>.
+</p>
+</dd>
+<dt><code>-t</code></dt>
+<dd><p>Top two diffs - last change made to the file.  See
+<a href="#diff-options">diff options</a>.
+</p>
+</dd>
+<dt><code>-u</code></dt>
+<dd><p>Unidiff output format.  See <a href="#rdiff-options">rdiff options</a>.
+</p>
+</dd>
+<dt><code>-V <var>vers</var></code></dt>
+<dd><p>Use RCS Version <var>vers</var> for keyword expansion (obsolete).  See
+<a href="#rdiff-options">rdiff options</a>.
+</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
+<a href="#release">release</a>.
+</p>
+<dl compact="compact">
+<dt><code>-d</code></dt>
+<dd><p>Delete the given directory.  See <a href="#release-options">release 
options</a>.
+</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 <a 
href="#Removing-files">Removing files</a>.
+</p>
+<dl compact="compact">
+<dt><code>-f</code></dt>
+<dd><p>Delete the file before removing it.  See <a 
href="#Removing-files">Removing files</a>.
+</p>
+</dd>
+<dt><code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-R</code></dt>
+<dd><p>Operate recursively (default).  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</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 <a href="#log">log</a>.
+</p>
+<dl compact="compact">
+<dt><code>-b</code></dt>
+<dd><p>Only list revisions on the default branch.  See <a 
href="#log-options">log options</a>.
+</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 <a href="#log-options">log options</a>.
+</p>
+</dd>
+<dt><code>-h</code></dt>
+<dd><p>Only print header.  See <a href="#log-options">log options</a>.
+</p>
+</dd>
+<dt><code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-N</code></dt>
+<dd><p>Do not list tags.  See <a href="#log-options">log options</a>.
+</p>
+</dd>
+<dt><code>-R</code></dt>
+<dd><p>Only print name of RCS file.  See <a href="#log-options">log 
options</a>.
+</p>
+</dd>
+<dt><code>-r<var>revs</var></code></dt>
+<dd><p>Only list revisions <var>revs</var>.  See <a href="#log-options">log 
options</a>.
+</p>
+</dd>
+<dt><code>-s <var>states</var></code></dt>
+<dd><p>Only list revisions with specified states.  See <a 
href="#log-options">log options</a>.
+</p>
+</dd>
+<dt><code>-t</code></dt>
+<dd><p>Only print header and descriptive text.  See <a href="#log-options">log 
options</a>.
+</p>
+</dd>
+<dt><code>-w<var>logins</var></code></dt>
+<dd><p>Only list revisions checked in by specified logins.  See <a 
href="#log-options">log options</a>.
+</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 <a href="#Revisions">Revisions</a> and <a 
href="#Branching-and-merging">Branching and merging</a>.
+</p>
+<dl compact="compact">
+<dt><code>-a</code></dt>
+<dd><p>Clear tag from removed files that would not otherwise
+be tagged.  See <a href="#Tagging-add_002fremove">Tagging add/remove</a>.
+</p>
+</dd>
+<dt><code>-b</code></dt>
+<dd><p>Create a branch named <var>tag</var>.  See <a 
href="#Branching-and-merging">Branching and merging</a>.
+</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 <a 
href="#Tagging-by-date_002ftag">Tagging by date/tag</a>.
+</p>
+</dd>
+<dt><code>-d</code></dt>
+<dd><p>Delete <var>tag</var>.  See <a href="#Modifying-tags">Modifying 
tags</a>.
+</p>
+</dd>
+<dt><code>-F</code></dt>
+<dd><p>Move <var>tag</var> if it already exists.  See <a 
href="#Modifying-tags">Modifying tags</a>.
+</p>
+</dd>
+<dt><code>-f</code></dt>
+<dd><p>Force a head revision match if tag/date not found.
+See <a href="#Tagging-by-date_002ftag">Tagging by date/tag</a>.
+</p>
+</dd>
+<dt><code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-n</code></dt>
+<dd><p>No execution of tag program.  See <a href="#Common-options">Common 
options</a>.
+</p>
+</dd>
+<dt><code>-R</code></dt>
+<dd><p>Operate recursively (default).  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-r <var>rev</var></code></dt>
+<dd><p>Tag existing tag <var>rev</var>.  See <a 
href="#Tagging-by-date_002ftag">Tagging by date/tag</a>.
+</p></dd>
+</dl>
+
+</dd>
+<dt><code>server</code></dt>
+<dd><p>Rsh server.  See <a href="#Connecting-via-rsh">Connecting via rsh</a>.
+</p>
+</dd>
+<dt><code>status [<var>options</var>] <var>files</var>&hellip;</code></dt>
+<dd><p>Display status information in a working directory.  See
+<a href="#File-status">File status</a>.
+</p>
+<dl compact="compact">
+<dt><code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-R</code></dt>
+<dd><p>Operate recursively (default).  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-v</code></dt>
+<dd><p>Include tag information for file.  See <a href="#Tags">Tags</a>.
+</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 <a href="#Revisions">Revisions</a> and <a 
href="#Branching-and-merging">Branching and merging</a>.
+</p>
+<dl compact="compact">
+<dt><code>-b</code></dt>
+<dd><p>Create a branch named <var>tag</var>.  See <a 
href="#Branching-and-merging">Branching and merging</a>.
+</p>
+</dd>
+<dt><code>-c</code></dt>
+<dd><p>Check that working files are unmodified.  See
+<a href="#Tagging-the-working-directory">Tagging the working directory</a>.
+</p>
+</dd>
+<dt><code>-D <var>date</var></code></dt>
+<dd><p>Tag revisions as of <var>date</var>.  See <a 
href="#Tagging-by-date_002ftag">Tagging by date/tag</a>.
+</p>
+</dd>
+<dt><code>-d</code></dt>
+<dd><p>Delete <var>tag</var>.  See <a href="#Modifying-tags">Modifying 
tags</a>.
+</p>
+</dd>
+<dt><code>-F</code></dt>
+<dd><p>Move <var>tag</var> if it already exists.  See <a 
href="#Modifying-tags">Modifying tags</a>.
+</p>
+</dd>
+<dt><code>-f</code></dt>
+<dd><p>Force a head revision match if tag/date not found.
+See <a href="#Tagging-by-date_002ftag">Tagging by date/tag</a>.
+</p>
+</dd>
+<dt><code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-R</code></dt>
+<dd><p>Operate recursively (default).  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-r <var>rev</var></code></dt>
+<dd><p>Tag existing tag <var>rev</var>.  See <a 
href="#Tagging-by-date_002ftag">Tagging by date/tag</a>.
+</p></dd>
+</dl>
+
+</dd>
+<dt><code>unedit [<var>options</var>] [<var>files</var>&hellip;]</code></dt>
+<dd><p>Undo an edit command.  See <a href="#Editing-files">Editing files</a>.
+</p>
+<dl compact="compact">
+<dt><code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-R</code></dt>
+<dd><p>Operate recursively (default).  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</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
+<a href="#update">update</a>.
+</p>
+<dl compact="compact">
+<dt><code>-A</code></dt>
+<dd><p>Reset any sticky tags/date/options.  See <a href="#Sticky-tags">Sticky 
tags</a> and <a href="#Keyword-substitution">Keyword substitution</a>.
+</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
+<samp>.#<var>file</var>.<var>revision</var></samp>, however).
+</p>
+</dd>
+<dt><code>-D <var>date</var></code></dt>
+<dd><p>Check out revisions as of <var>date</var> (is sticky).  See
+<a href="#Common-options">Common options</a>.
+</p>
+</dd>
+<dt><code>-d</code></dt>
+<dd><p>Create directories.  See <a href="#update-options">update options</a>.
+</p>
+</dd>
+<dt><code>-f</code></dt>
+<dd><p>Use head revision if tag/date not found.  See
+<a href="#Common-options">Common options</a>.
+</p>
+</dd>
+<dt><code>-I <var>ign</var></code></dt>
+<dd><p>More files to ignore (! to reset).  See
+<a href="#import-options">import options</a>.
+</p>
+</dd>
+<dt><code>-j <var>rev</var></code></dt>
+<dd><p>Merge in changes.  See <a href="#update-options">update options</a>.
+</p>
+</dd>
+<dt><code>-k <var>kflag</var></code></dt>
+<dd><p>Use <var>kflag</var> keyword expansion.  See
+<a href="#Substitution-modes">Substitution modes</a>.
+</p>
+</dd>
+<dt><code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-P</code></dt>
+<dd><p>Prune empty directories.  See <a href="#Moving-directories">Moving 
directories</a>.
+</p>
+</dd>
+<dt><code>-p</code></dt>
+<dd><p>Check out files to standard output (avoids
+stickiness).  See <a href="#update-options">update options</a>.
+</p>
+</dd>
+<dt><code>-R</code></dt>
+<dd><p>Operate recursively (default).  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-r <var>tag</var></code></dt>
+<dd><p>Checkout revision <var>tag</var> (is sticky).  See <a 
href="#Common-options">Common options</a>.
+</p>
+</dd>
+<dt><code>-W <var>spec</var></code></dt>
+<dd><p>More wrappers.  See <a href="#import-options">import options</a>.
+</p></dd>
+</dl>
+
+</dd>
+<dt><code>version</code></dt>
+<dd><a name="index-version-_0028subcommand_0029"></a>
+
+<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
+<a href="#Setting-a-watch">Setting a watch</a>.
+</p>
+<p>add/remove: add or remove notification on actions.  See
+<a href="#Getting-Notified">Getting Notified</a>.
+</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
+<a href="#Editing-files">Editing files</a>.
+</p>
+</dd>
+<dt><code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-R</code></dt>
+<dd><p>Operate recursively (default).  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</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 <a href="#Watch-information">Watch 
information</a>.
+</p>
+<dl compact="compact">
+<dt><code>-l</code></dt>
+<dd><p>Local; run only in current working directory.  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p>
+</dd>
+<dt><code>-R</code></dt>
+<dd><p>Operate recursively (default).  See <a 
href="#Recursive-behavior">Recursive behavior</a>.
+</p></dd>
+</dl>
+
+</dd>
+</dl>
+
+<hr>
+<a name="Administrative-files"></a>
+<div class="header">
+<p>
+Next: <a href="#Environment-variables" accesskey="n" rel="next">Environment 
variables</a>, Previous: <a href="#Invoking-CVS" accesskey="p" 
rel="prev">Invoking CVS</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Reference-manual-for-Administrative-files"></a>
+<h2 class="appendix">Appendix C Reference manual for Administrative files</h2>
+<a name="index-Administrative-files-_0028reference_0029"></a>
+<a name="index-Files_002c-reference-manual"></a>
+<a name="index-Reference-manual-_0028files_0029"></a>
+<a name="index-CVSROOT-_0028file_0029"></a>
+
+<p>Inside the repository, in the directory
+<samp>$CVSROOT/CVSROOT</samp>, 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 <a 
href="#Intro-administrative-files">Intro administrative files</a>.
+</p>
+<p>The most important of these files is the <samp>modules</samp>
+file, which defines the modules inside the repository.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#modules" 
accesskey="1">modules</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Defining modules
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Wrappers" 
accesskey="2">Wrappers</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Specify binary-ness based on file name
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Trigger-Scripts" 
accesskey="3">Trigger Scripts</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Some notes on the commit support files and
+                               taginfo, referenced below.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#commit-files" 
accesskey="4">commit files</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">The commit support files (commitinfo,
+                                verifymsg, editinfo, loginfo)
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#taginfo" 
accesskey="5">taginfo</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Verifying/Logging tags
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#rcsinfo" 
accesskey="6">rcsinfo</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Templates for the log messages
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#cvsignore" 
accesskey="7">cvsignore</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Ignoring files via cvsignore
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#checkoutlist" 
accesskey="8">checkoutlist</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Adding your own administrative files
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#history-file" 
accesskey="9">history file</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">History information
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#Variables">Variables</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Various variables are expanded
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a 
href="#config">config</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Miscellaneous CVS configuration
+</td></tr>
+</table>
+
+<hr>
+<a name="modules"></a>
+<div class="header">
+<p>
+Next: <a href="#Wrappers" accesskey="n" rel="next">Wrappers</a>, Up: <a 
href="#Administrative-files" accesskey="u" rel="up">Administrative files</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="The-modules-file"></a>
+<h3 class="appendixsec">C.1 The modules file</h3>
+<a name="index-Modules-_0028admin-file_0029"></a>
+<a name="index-Defining-modules-_0028reference-manual_0029"></a>
+
+<p>The <samp>modules</samp> 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 <samp>modules</samp> 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 <samp>first-dir</samp>, which
+contains two files, <samp>file1</samp> and <samp>file2</samp>, and a
+directory <samp>sdir</samp>.  <samp>first-dir/sdir</samp> contains
+a file <samp>sfile</samp>.
+</p>
+
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Alias-modules" 
accesskey="1">Alias modules</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">The simplest kind of module
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Regular-modules" 
accesskey="2">Regular modules</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Ampersand-modules" 
accesskey="3">Ampersand modules</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Excluding-directories" 
accesskey="4">Excluding directories</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Excluding directories from a module
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Module-options" 
accesskey="5">Module options</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Regular and ampersand modules can take options
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Module-program-options" 
accesskey="6">Module program options</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">How the modules &ldquo;program options&rdquo; programs
+                              are run. 
+</td></tr>
+</table>
+
+<hr>
+<a name="Alias-modules"></a>
+<div class="header">
+<p>
+Next: <a href="#Regular-modules" accesskey="n" rel="next">Regular modules</a>, 
Up: <a href="#modules" accesskey="u" rel="up">modules</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Alias-modules-1"></a>
+<h4 class="appendixsubsec">C.1.1 Alias modules</h4>
+<a name="index-Alias-modules"></a>
+<a name="index-_002da_002c-in-modules-file"></a>
+
+<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>
+<div class="example">
+<pre class="example">amodule -a first-dir
+</pre></div>
+
+<p>then the following two commands are equivalent:
+</p>
+<div class="example">
+<pre class="example">$ cvs co amodule
+$ cvs co first-dir
+</pre></div>
+
+<p>and they each would provide output such as:
+</p>
+<div class="example">
+<pre class="example">cvs checkout: Updating first-dir
+U first-dir/file1
+U first-dir/file2
+cvs checkout: Updating first-dir/sdir
+U first-dir/sdir/sfile
+</pre></div>
+
+<hr>
+<a name="Regular-modules"></a>
+<div class="header">
+<p>
+Next: <a href="#Ampersand-modules" accesskey="n" rel="next">Ampersand 
modules</a>, Previous: <a href="#Alias-modules" accesskey="p" rel="prev">Alias 
modules</a>, Up: <a href="#modules" accesskey="u" rel="up">modules</a> &nbsp; 
[<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Regular-modules-1"></a>
+<h4 class="appendixsubsec">C.1.2 Regular modules</h4>
+<a name="index-Regular-modules"></a>
+
+<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>
+<div class="example">
+<pre class="example">regmodule first-dir
+</pre></div>
+
+<p>then regmodule will contain the files from first-dir:
+</p>
+<div class="example">
+<pre class="example">$ cvs co regmodule
+cvs checkout: Updating regmodule
+U regmodule/file1
+U regmodule/file2
+cvs checkout: Updating regmodule/sdir
+U regmodule/sdir/sfile
+$
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">regfiles first-dir/sdir sfile
+</pre></div>
+
+<p>With this definition, getting the regfiles module
+will create a single working directory
+<samp>regfiles</samp> containing the file listed, which
+comes from a directory deeper
+in the <small>CVS</small> source repository:
+</p>
+<div class="example">
+<pre class="example">$ cvs co regfiles
+U regfiles/sfile
+$
+</pre></div>
+
+<hr>
+<a name="Ampersand-modules"></a>
+<div class="header">
+<p>
+Next: <a href="#Excluding-directories" accesskey="n" rel="next">Excluding 
directories</a>, Previous: <a href="#Regular-modules" accesskey="p" 
rel="prev">Regular modules</a>, Up: <a href="#modules" accesskey="u" 
rel="up">modules</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Ampersand-modules-1"></a>
+<h4 class="appendixsubsec">C.1.3 Ampersand modules</h4>
+<a name="index-Ampersand-modules"></a>
+<a name="index-_0026_002c-in-modules-file"></a>
+
+<p>A module definition can refer to other modules by
+including &lsquo;<samp>&amp;<var>module</var></samp>&rsquo; in its definition.
+</p><div class="example">
+<pre class="example"><var>mname</var> [ options ] 
<var>&amp;module</var>&hellip;
+</pre></div>
+
+<p>Then getting the module creates a subdirectory for each such
+module, in the directory containing the module.  For
+example, if modules contains
+</p>
+<div class="example">
+<pre class="example">ampermod &amp;first-dir
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">$ cvs co ampermod
+</pre></div>
+
+<p>will create the following files:
+</p>
+<div class="example">
+<pre class="example">ampermod/first-dir/file1
+ampermod/first-dir/file2
+ampermod/first-dir/sdir/sfile
+</pre></div>
+
+<p>There is one quirk/bug: the messages that <small>CVS</small>
+prints omit the <samp>ampermod</samp>, and thus do not
+correctly display the location to which it is checking
+out the files:
+</p>
+<div class="example">
+<pre class="example">$ 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
+$
+</pre></div>
+
+<p>Do not rely on this buggy behavior; it may get fixed in
+a future release of <small>CVS</small>.
+</p>
+
+<hr>
+<a name="Excluding-directories"></a>
+<div class="header">
+<p>
+Next: <a href="#Module-options" accesskey="n" rel="next">Module options</a>, 
Previous: <a href="#Ampersand-modules" accesskey="p" rel="prev">Ampersand 
modules</a>, Up: <a href="#modules" accesskey="u" rel="up">modules</a> &nbsp; 
[<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Excluding-directories-1"></a>
+<h4 class="appendixsubsec">C.1.4 Excluding directories</h4>
+<a name="index-Excluding-directories_002c-in-modules-file"></a>
+<a name="index-_0021_002c-in-modules-file"></a>
+
+<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>
+<div class="example">
+<pre class="example">exmodule -a !first-dir/sdir first-dir
+</pre></div>
+
+<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>
+<a name="Module-options"></a>
+<div class="header">
+<p>
+Next: <a href="#Module-program-options" accesskey="n" rel="next">Module 
program options</a>, Previous: <a href="#Excluding-directories" accesskey="p" 
rel="prev">Excluding directories</a>, Up: <a href="#modules" accesskey="u" 
rel="up">modules</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Module-options-1"></a>
+<h4 class="appendixsubsec">C.1.5 Module options</h4>
+<a name="index-Options_002c-in-modules-file"></a>
+
+<p>Either regular modules or ampersand modules can contain
+options, which supply additional information concerning
+the module.
+</p>
+<dl compact="compact">
+<dd><a name="index-_002dd_002c-in-modules-file"></a>
+</dd>
+<dt><code>-d <var>name</var></code></dt>
+<dd><p>Name the working directory something other than the
+module name.
+</p>
+<a name="index-Export-program"></a>
+<a name="index-_002de_002c-in-modules-file"></a>
+</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>
+<a name="index-Checkout-program"></a>
+<a name="index-_002do_002c-in-modules-file"></a>
+</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 <a href="#Module-program-options">Module 
program options</a> for
+information on how <var>prog</var> is called.
+</p>
+<a name="index-Status-of-a-module"></a>
+<a name="index-Module-status"></a>
+<a name="index-_002ds_002c-in-modules-file"></a>
+</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>
+<a name="index-Tag-program"></a>
+<a name="index-_002dt_002c-in-modules-file"></a>
+</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 the <samp>taginfo</samp> file is a better solution (see <a 
href="#taginfo">taginfo</a>).
+</p></dd>
+</dl>
+
+<p>You should also see see <a href="#Module-program-options">Module program 
options</a> about how the
+&ldquo;program options&rdquo; programs are run.
+</p>
+
+<hr>
+<a name="Module-program-options"></a>
+<div class="header">
+<p>
+Previous: <a href="#Module-options" accesskey="p" rel="prev">Module 
options</a>, Up: <a href="#modules" accesskey="u" rel="up">modules</a> &nbsp; 
[<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a 
name="How-the-modules-file-_0060_0060program-options_0027_0027-programs-are-run"></a>
+<h4 class="appendixsubsec">C.1.6 How the modules file &ldquo;program 
options&rdquo; programs are run</h4>
+<a name="index-Modules-file-program-options"></a>
+<a name="index-_002dt_002c-in-modules-file-1"></a>
+<a name="index-_002do_002c-in-modules-file-1"></a>
+<a name="index-_002de_002c-in-modules-file-1"></a>
+
+<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>
+<a name="Wrappers"></a>
+<div class="header">
+<p>
+Next: <a href="#Trigger-Scripts" accesskey="n" rel="next">Trigger Scripts</a>, 
Previous: <a href="#modules" accesskey="p" rel="prev">modules</a>, Up: <a 
href="#Administrative-files" accesskey="u" rel="up">Administrative files</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="The-cvswrappers-file"></a>
+<h3 class="appendixsec">C.2 The cvswrappers file</h3>
+<a name="index-cvswrappers-_0028admin-file_0029"></a>
+<a name="index-CVSWRAPPERS_002c-environment-variable"></a>
+<a name="index-Wrappers"></a>
+
+
+<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 <a href="#Binary-files">Binary files</a>, for more on
+binary files.
+</p>
+<p>The basic format of the file <samp>cvswrappers</samp> is:
+</p>
+<div class="example">
+<pre class="example">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.
+</pre></div>
+
+
+<p>For example, the following command imports a
+directory, treating files whose name ends in
+&lsquo;<samp>.exe</samp>&rsquo; as binary:
+</p>
+<div class="example">
+<pre class="example">cvs import -I ! -W &quot;*.exe -k 'b'&quot; first-dir 
vendortag reltag
+</pre></div>
+
+
+<hr>
+<a name="Trigger-Scripts"></a>
+<div class="header">
+<p>
+Next: <a href="#commit-files" accesskey="n" rel="next">commit files</a>, 
Previous: <a href="#Wrappers" accesskey="p" rel="prev">Wrappers</a>, Up: <a 
href="#Administrative-files" accesskey="u" rel="up">Administrative files</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="The-Trigger-Scripts"></a>
+<h3 class="appendixsec">C.3 The Trigger Scripts</h3>
+<a name="index-Info-files"></a>
+<a name="index-Trigger-scripts"></a>
+
+<p>Several of the administrative files support triggers, or the launching 
external
+scripts or programs at specific times before or after particular events.  The
+individual files are discussed in the later sections, <a 
href="#commit-files">commit files</a> and
+<a href="#taginfo">taginfo</a>, but some of the common elements are discussed 
here.
+</p>
+<p>All the trigger scripts are launched in a copy of the user sandbox being
+committed, on the server, in client-server mode.  In local mode, the scripts
+are actually launched directly from the user sandbox directory being committed.
+For most intents and purposes, the same scripts can be run in both locations
+without alteration.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#syntax" 
accesskey="1">syntax</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">The common syntax
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Trigger-Script-Security" 
accesskey="2">Trigger Script Security</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Trigger script security
+</td></tr>
+</table>
+
+<hr>
+<a name="syntax"></a>
+<div class="header">
+<p>
+Next: <a href="#Trigger-Script-Security" accesskey="n" rel="next">Trigger 
Script Security</a>, Up: <a href="#Trigger-Scripts" accesskey="u" 
rel="up">Trigger Scripts</a> &nbsp; [<a href="#SEC_Contents" title="Table of 
contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="The-common-syntax"></a>
+<h4 class="appendixsubsec">C.3.1 The common syntax</h4>
+<a name="index-Info-files-_0028syntax_0029"></a>
+<a name="index-Syntax-of-info-files"></a>
+<a name="index-Common-syntax-of-info-files"></a>
+
+
+<p>The administrative files such as <samp>commitinfo</samp>,
+<samp>loginfo</samp>, <samp>rcsinfo</samp>, <samp>verifymsg</samp>, etc.,
+all have a common format.  The purpose of the files are
+described later on.  The common syntax is described
+here.
+</p>
+<a name="index-Regular-expression-syntax"></a>
+<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>
+<a name="Trigger-Script-Security"></a>
+<div class="header">
+<p>
+Previous: <a href="#syntax" accesskey="p" rel="prev">syntax</a>, Up: <a 
href="#Trigger-Scripts" accesskey="u" rel="up">Trigger Scripts</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Security-and-the-Trigger-Scripts"></a>
+<h4 class="appendixsubsec">C.3.2 Security and the Trigger Scripts</h4>
+<a name="index-Info-files_002c-security"></a>
+<a name="index-Trigger-scripts_002c-security"></a>
+
+<p>Security is a huge subject, and implementing a secure system is a 
non-trivial
+task.  This section will barely touch on all the issues involved, but it is
+well to note that, as with any script you will be allowing an untrusted
+user to run on your server, there are measures you can take to help prevent
+your trigger scripts from being abused.
+</p>
+<p>For instance, since the CVS trigger scripts all run in a copy of the 
user&rsquo;s
+sandbox on the server, a naively coded Perl trigger script which attempts to
+use a Perl module that is not installed on the system can be hijacked by any
+user with commit access who is checking in a file with the correct name.  Other
+scripting languages may be vulnerable to similar hacks.
+</p>
+<p>One way to make a script more secure, at least with Perl, is to use scripts
+which invoke the <code>-T</code>, or &quot;taint-check&quot; switch on their 
<code>#!</code> line.
+In the most basic terms, this causes Perl to avoid running code that may have
+come from an external source.  Please run the <code>perldoc perlsec</code> 
command
+for more on Perl security.  Again, other languages may implement other security
+verification hooks which look more or less like Perl&rsquo;s 
&quot;taint-check&quot; mechanism.
+</p>
+<hr>
+<a name="commit-files"></a>
+<div class="header">
+<p>
+Next: <a href="#rcsinfo" accesskey="n" rel="next">rcsinfo</a>, Previous: <a 
href="#Trigger-Scripts" accesskey="p" rel="prev">Trigger Scripts</a>, Up: <a 
href="#Administrative-files" accesskey="u" rel="up">Administrative files</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="The-commit-support-files"></a>
+<h3 class="appendixsec">C.4 The commit support files</h3>
+<a name="index-Committing_002c-administrative-support-files"></a>
+
+<p>There are three kinds of trigger scripts (see <a 
href="#Trigger-Scripts">Trigger Scripts</a>) that can be
+run at various times during a 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><samp>commitinfo</samp></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><samp>verifymsg</samp></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
+<samp>rcsinfo</samp> file, which can hold a log message
+template (see <a href="#rcsinfo">rcsinfo</a>).
+</p>
+</dd>
+<dt><samp>editinfo</samp></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
+<samp>rcsinfo</samp> file, which can hold a log message
+template (see <a href="#rcsinfo">rcsinfo</a>).  (obsolete)
+</p>
+</dd>
+<dt><samp>loginfo</samp></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>
+
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#commitinfo" 
accesskey="1">commitinfo</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Pre-commit checking
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#verifymsg" 
accesskey="2">verifymsg</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">How are log messages evaluated?
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#editinfo" 
accesskey="3">editinfo</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Specifying how log messages are created
+                                (obsolete)
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#loginfo" 
accesskey="4">loginfo</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Where should log messages be sent?
+</td></tr>
+</table>
+
+<hr>
+<a name="commitinfo"></a>
+<div class="header">
+<p>
+Next: <a href="#verifymsg" accesskey="n" rel="next">verifymsg</a>, Up: <a 
href="#commit-files" accesskey="u" rel="up">commit files</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Commitinfo"></a>
+<h4 class="appendixsubsec">C.4.1 Commitinfo</h4>
+<a name="index-commitinfo"></a>
+<a name="index-Commits_002c-precommit-verification-of"></a>
+<a name="index-Precommit-checking"></a>
+
+<p>The <samp>commitinfo</samp> 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
+<samp>commitinfo</samp> 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>
+<a name="index-Exit-status_002c-of-commitinfo"></a>
+<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>
+<a name="index-DEFAULT-in-commitinfo"></a>
+<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>
+<a name="index-ALL-in-commitinfo"></a>
+<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>
+<a name="index-commitinfo_002c-working-directory"></a>
+<a name="index-commitinfo_002c-command-environment"></a>
+<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 <a href="#Remote-repositories">Remote repositories</a>)</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 <a href="#Attic">Attic</a>) 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>
+<a name="verifymsg"></a>
+<div class="header">
+<p>
+Next: <a href="#editinfo" accesskey="n" rel="next">editinfo</a>, Previous: <a 
href="#commitinfo" accesskey="p" rel="prev">commitinfo</a>, Up: <a 
href="#commit-files" accesskey="u" rel="up">commit files</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Verifying-log-messages"></a>
+<h4 class="appendixsubsec">C.4.2 Verifying log messages</h4>
+<a name="index-verifymsg-_0028admin-file_0029"></a>
+<a name="index-Log-message_002c-verifying"></a>
+
+<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 <samp>verifymsg</samp> 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 <samp>verifymsg</samp> file is often most useful together
+with the <samp>rcsinfo</samp> file, which can be used to
+specify a log message template.
+</p>
+<p>Each line in the <samp>verifymsg</samp> 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>
+<a name="index-DEFAULT-in-verifymsg"></a>
+<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>
+<a name="index-Exit-status_002c-of-verifymsg"></a>
+<p>If the verification script exits with a non-zero exit status,
+the commit is aborted.
+</p>
+<a name="index-verifymsg_002c-changing-the-log-message"></a>
+<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 <a href="#config">config</a>, for more on CVSROOT/config options.
+</p>
+<p>It is NOT a good idea for a <samp>verifymsg</samp> 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
+<samp>verifymsg</samp> 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 <a href="#Remote-repositories">Remote repositories</a>, for more
+information on client/server setups.  In addition, at the time
+the <samp>verifymsg</samp> 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 <samp>verifymsg</samp>.
+</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
+<samp>verifymsg</samp> file, together with the corresponding
+<samp>rcsinfo</samp> 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
+<samp>/usr/cvssupport/tc.template</samp>.
+</p>
+<div class="example">
+<pre class="example">BugId:
+</pre></div>
+
+<p>The script <samp>/usr/cvssupport/bugid.verify</samp> is used to
+evaluate the log message.
+</p>
+<div class="example">
+<pre class="example">#!/bin/sh
+#
+#       bugid.verify filename
+#
+#  Verify that the log message contains a valid bugid
+#  on the first line.
+#
+if sed 1q &lt; $1 | grep '^BugId:[ ]*[0-9][0-9]*$' &gt; /dev/null; then
+    exit 0
+elif sed 1q &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
+</pre></div>
+
+<p>The <samp>verifymsg</samp> file contains this line:
+</p>
+<div class="example">
+<pre class="example">^tc     /usr/cvssupport/bugid.verify
+</pre></div>
+
+<p>The <samp>rcsinfo</samp> file contains this line:
+</p>
+<div class="example">
+<pre class="example">^tc     /usr/cvssupport/tc.template
+</pre></div>
+
+<p>The <samp>config</samp> file contains this line:
+</p>
+<div class="example">
+<pre class="example">RereadLogAfterVerify=always
+</pre></div>
+
+
+
+<hr>
+<a name="editinfo"></a>
+<div class="header">
+<p>
+Next: <a href="#loginfo" accesskey="n" rel="next">loginfo</a>, Previous: <a 
href="#verifymsg" accesskey="p" rel="prev">verifymsg</a>, Up: <a 
href="#commit-files" accesskey="u" rel="up">commit files</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Editinfo"></a>
+<h4 class="appendixsubsec">C.4.3 Editinfo</h4>
+<a name="index-editinfo-_0028admin-file_0029"></a>
+<a name="index-Editor_002c-specifying-per-module"></a>
+<a name="index-Per_002dmodule-editor"></a>
+<a name="index-Log-messages_002c-editing"></a>
+
+<p><strong>The <samp>editinfo</samp> feature has been
+rendered obsolete.  To set a default editor for log
+messages use the <code>CVSEDITOR</code>, <code>EDITOR</code> environment 
variables
+(see <a href="#Environment-variables">Environment variables</a>) or the 
&lsquo;<samp>-e</samp>&rsquo; global
+option (see <a href="#Global-options">Global options</a>).  See <a 
href="#verifymsg">verifymsg</a>,
+for information on the use of the <samp>verifymsg</samp>
+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 <samp>editinfo</samp> 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 <samp>editinfo</samp>
+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 <a href="#Committing-your-changes">Committing 
your changes</a>.
+</p>
+<p>The <samp>editinfo</samp> file is often most useful together
+with the <samp>rcsinfo</samp> file, which can be used to
+specify a log message template.
+</p>
+<p>Each line in the <samp>editinfo</samp> 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>
+<a name="index-DEFAULT-in-editinfo"></a>
+<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, <samp>editinfo</samp> will not be consulted.
+There is no good workaround for this; use
+<samp>verifymsg</samp> instead.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#editinfo-example" 
accesskey="1">editinfo example</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Editinfo example
+</td></tr>
+</table>
+
+<hr>
+<a name="editinfo-example"></a>
+<div class="header">
+<p>
+Up: <a href="#editinfo" accesskey="u" rel="up">editinfo</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Editinfo-example"></a>
+<h4 class="appendixsubsubsec">C.4.3.1 Editinfo example</h4>
+
+<p>The following is a little silly example of a
+<samp>editinfo</samp> file, together with the corresponding
+<samp>rcsinfo</samp> 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
+<samp>/usr/cvssupport/tc.template</samp>.
+</p>
+<div class="example">
+<pre class="example">BugId:
+</pre></div>
+
+<p>The script <samp>/usr/cvssupport/bugid.edit</samp> is used to
+edit the log message.
+</p>
+<div class="example">
+<pre class="example">#!/bin/sh
+#
+#       bugid.edit filename
+#
+#  Call $EDITOR on FILENAME, and verify that the
+#  resulting file contains a valid bugid on the first
+#  line.
+if [ &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
+</pre></div>
+
+<p>The <samp>editinfo</samp> file contains this line:
+</p>
+<div class="example">
+<pre class="example">^tc     /usr/cvssupport/bugid.edit
+</pre></div>
+
+<p>The <samp>rcsinfo</samp> file contains this line:
+</p>
+<div class="example">
+<pre class="example">^tc     /usr/cvssupport/tc.template
+</pre></div>
+
+<hr>
+<a name="loginfo"></a>
+<div class="header">
+<p>
+Previous: <a href="#editinfo" accesskey="p" rel="prev">editinfo</a>, Up: <a 
href="#commit-files" accesskey="u" rel="up">commit files</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Loginfo"></a>
+<h4 class="appendixsubsec">C.4.4 Loginfo</h4>
+<a name="index-loginfo-_0028admin-file_0029"></a>
+<a name="index-Storing-log-messages"></a>
+<a name="index-Mailing-log-messages"></a>
+<a name="index-Distributing-log-messages"></a>
+<a name="index-Log-messages"></a>
+
+<p>The <samp>loginfo</samp> 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.
+Note that the filter program <strong>must</strong> read <strong>all</strong>
+of the log information or <small>CVS</small> may fail with a broken pipe 
signal.
+</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 <a href="#commit-files">commit files</a>, for a description of the 
syntax of
+the <samp>loginfo</samp> 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>`</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, reguardless 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>
+<div class="example">
+<pre class="example">&quot;yoyodyne/tc ChangeLog,1.1,1.2 Makefile,1.3,1.4 
foo.c,1.12,1.13&quot;
+</pre></div>
+
+<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,
+<samp>loginfo</samp> will be run on the <em>remote</em>
+(i.e., server) side, not the client side (see <a 
href="#Remote-repositories">Remote repositories</a>).
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#loginfo-example" 
accesskey="1">loginfo example</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Loginfo example
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Keeping-a-checked-out-copy" 
accesskey="2">Keeping a checked out copy</a>:</td><td>&nbsp;&nbsp;</td><td 
align="left" valign="top">Updating a tree on every checkin
+</td></tr>
+</table>
+
+<hr>
+<a name="loginfo-example"></a>
+<div class="header">
+<p>
+Next: <a href="#Keeping-a-checked-out-copy" accesskey="n" rel="next">Keeping a 
checked out copy</a>, Up: <a href="#loginfo" accesskey="u" rel="up">loginfo</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Loginfo-example"></a>
+<h4 class="appendixsubsubsec">C.4.4.1 Loginfo example</h4>
+
+<p>The following <samp>loginfo</samp> file, together with the
+tiny shell-script below, appends all log messages
+to the file <samp>$CVSROOT/CVSROOT/commitlog</samp>,
+and any commits to the administrative files (inside
+the <samp>CVSROOT</samp> directory) are also logged in
+<samp>/usr/adm/cvsroot-log</samp>.
+Commits to the <samp>prog1</samp> directory are mailed to <tt>ceder</tt>.
+</p>
+<div class="example">
+<pre class="example">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
+</pre></div>
+
+<p>The shell-script <samp>/usr/local/bin/cvs-log</samp> looks
+like this:
+</p>
+<div class="example">
+<pre class="example">#!/bin/sh
+(echo &quot;------------------------------------------------------&quot;;
+ echo -n $2&quot;  &quot;;
+ date;
+ echo;
+ cat) &gt;&gt; $1
+</pre></div>
+
+<hr>
+<a name="Keeping-a-checked-out-copy"></a>
+<div class="header">
+<p>
+Previous: <a href="#loginfo-example" accesskey="p" rel="prev">loginfo 
example</a>, Up: <a href="#loginfo" accesskey="u" rel="up">loginfo</a> &nbsp; 
[<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Keeping-a-checked-out-copy-1"></a>
+<h4 class="appendixsubsubsec">C.4.4.2 Keeping a checked out copy</h4>
+
+<a name="index-Keeping-a-checked-out-copy"></a>
+<a name="index-Checked-out-copy_002c-keeping"></a>
+<a name="index-Web-pages_002c-maintaining-with-CVS"></a>
+
+<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>
+<div class="example">
+<pre class="example">^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
+</pre></div>
+
+<p>This will cause checkins to repository directories
+starting with <code>cyclic-pages</code> to update the checked
+out tree in <samp>/u/www/local-docs</samp>.
+</p>
+<hr>
+<a name="rcsinfo"></a>
+<div class="header">
+<p>
+Next: <a href="#taginfo" accesskey="n" rel="next">taginfo</a>, Previous: <a 
href="#commit-files" accesskey="p" rel="prev">commit files</a>, Up: <a 
href="#Administrative-files" accesskey="u" rel="up">Administrative files</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Rcsinfo"></a>
+<h3 class="appendixsec">C.5 Rcsinfo</h3>
+<a name="index-rcsinfo-_0028admin-file_0029"></a>
+<a name="index-Form-for-log-message"></a>
+<a name="index-Log-message-template"></a>
+<a name="index-Template-for-log-message"></a>
+
+<p>The <samp>rcsinfo</samp> file can be used to specify a form to
+edit when filling out the commit log.  The
+<samp>rcsinfo</samp> file has a syntax similar to the
+<samp>verifymsg</samp>, <samp>commitinfo</samp> and <samp>loginfo</samp>
+files.  See <a href="#syntax">syntax</a>.  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 <a href="#verifymsg">verifymsg</a>, for an example <samp>rcsinfo</samp>
+file.
+</p>
+<p>When <small>CVS</small> is accessing a remote repository,
+the contents of <samp>rcsinfo</samp> at the time a directory
+is first checked out will specify a template which does
+not then change.  If you edit <samp>rcsinfo</samp> or its
+templates, you may need to check out a new working
+directory.
+</p>
+<hr>
+<a name="taginfo"></a>
+<div class="header">
+<p>
+Next: <a href="#cvsignore" accesskey="n" rel="next">cvsignore</a>, Previous: 
<a href="#rcsinfo" accesskey="p" rel="prev">rcsinfo</a>, Up: <a 
href="#Administrative-files" accesskey="u" rel="up">Administrative files</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Taginfo"></a>
+<h3 class="appendixsec">C.6 Taginfo</h3>
+<a name="index-taginfo-_0028admin-file_0029"></a>
+<a name="index-Tags_002c-logging"></a>
+<a name="index-Tags_002c-verifying"></a>
+<p>The <samp>taginfo</samp> file defines programs to execute
+when someone executes a <code>tag</code> or <code>rtag</code>
+command.  The <samp>taginfo</samp> file has the standard form
+for trigger scripts (see <a href="#Trigger-Scripts">Trigger Scripts</a>),
+where each line is a regular expression
+followed by a command to execute (see <a href="#syntax">syntax</a>).  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 the <samp>taginfo</samp> file
+to log <code>tag</code> and <code>rtag</code>
+commands.  In the <samp>taginfo</samp> file put:
+</p>
+<div class="example">
+<pre class="example">ALL /usr/local/cvsroot/CVSROOT/loggit
+</pre></div>
+
+<p>Where <samp>/usr/local/cvsroot/CVSROOT/loggit</samp> contains the
+following script:
+</p>
+<div class="example">
+<pre class="example">#!/bin/sh
+echo &quot;$@&quot; &gt;&gt;/home/kingdon/cvsroot/CVSROOT/taglog
+</pre></div>
+
+<hr>
+<a name="cvsignore"></a>
+<div class="header">
+<p>
+Next: <a href="#checkoutlist" accesskey="n" rel="next">checkoutlist</a>, 
Previous: <a href="#taginfo" accesskey="p" rel="prev">taginfo</a>, Up: <a 
href="#Administrative-files" accesskey="u" rel="up">Administrative files</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Ignoring-files-via-cvsignore"></a>
+<h3 class="appendixsec">C.7 Ignoring files via cvsignore</h3>
+<a name="index-cvsignore-_0028admin-file_0029_002c-global"></a>
+<a name="index-Global-cvsignore"></a>
+<a name="index-Ignoring-files"></a>
+
+<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 <a href="#update-output">update output</a>).
+</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:
+
+<a name="index-Ignored-files"></a>
+<a name="index-Automatically-ignored-files"></a>
+<div class="example">
+<pre class="example">    RCS     SCCS    CVS     CVS.adm
+    RCSLOG  cvslog.*
+    tags    TAGS
+    .make.state     .nse_depinfo
+    *~      #*      .#*     ,*      _$*     *$
+    *.old   *.bak   *.BAK   *.orig  *.rej   .del-*
+    *.a     *.olb   *.o     *.obj   *.so    *.exe
+    *.Z     *.elc   *.ln
+    core
+</pre></div>
+
+</li><li> The per-repository list in
+<samp>$CVSROOT/CVSROOT/cvsignore</samp> is appended to
+the list, if that file exists.
+
+</li><li> The per-user list in <samp>.cvsignore</samp> 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 <samp>.cvsignore</samp> will be appended to the list.
+The patterns found in <samp>.cvsignore</samp> 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 <samp>.cvsignore</samp> 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 <samp>.cvsignore</samp> files in order to do the
+import.  Because this is awkward, in the future
+&lsquo;<samp>-I !</samp>&rsquo; might be modified to override
+<samp>.cvsignore</samp> 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 <samp>foo?bar</samp> to match a file
+named <samp>foo bar</samp> (it also matches <samp>fooxbar</samp>
+and the like).  Also note that there is currently no
+way to specify comments.
+</p>
+<hr>
+<a name="checkoutlist"></a>
+<div class="header">
+<p>
+Next: <a href="#history-file" accesskey="n" rel="next">history file</a>, 
Previous: <a href="#cvsignore" accesskey="p" rel="prev">cvsignore</a>, Up: <a 
href="#Administrative-files" accesskey="u" rel="up">Administrative files</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="The-checkoutlist-file"></a>
+<h3 class="appendixsec">C.8 The checkoutlist file</h3>
+<a name="index-checkoutlist"></a>
+
+<p>It may be helpful to use <small>CVS</small> to maintain your own
+files in the <samp>CVSROOT</samp> directory.  For example,
+suppose that you have a script <samp>logcommit.pl</samp>
+which you run by including the following line in the
+<samp>commitinfo</samp> administrative file:
+</p>
+<div class="example">
+<pre class="example">ALL   $CVSROOT/CVSROOT/logcommit.pl
+</pre></div>
+
+<p>To maintain <samp>logcommit.pl</samp> with <small>CVS</small> you would
+add the following line to the <samp>checkoutlist</samp>
+administrative file:
+</p>
+<div class="example">
+<pre class="example">logcommit.pl
+</pre></div>
+
+<p>The format of <samp>checkoutlist</samp> is one line for each
+file that you want to maintain using <small>CVS</small>, giving
+the name of the file, followed optionally by more whitespace
+and any error message that should print if the file cannot be
+checked out into CVSROOT after a commit:
+</p>
+<div class="example">
+<pre class="example">logcommit.pl      Could not update CVSROOT/logcommit.pl.
+</pre></div>
+
+<p>After setting up <samp>checkoutlist</samp> 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>
+<div class="example">
+<pre class="example">cvs commit: Rebuilding administrative file database
+</pre></div>
+
+<p>and the checked out copy in the <samp>CVSROOT</samp>
+directory should be updated.
+</p>
+<p>Note that listing <samp>passwd</samp> (see <a 
href="#Password-authentication-server">Password authentication server</a>) in 
<samp>checkoutlist</samp> 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
+<samp>checkoutlist</samp>, see <a href="#Keeping-a-checked-out-copy">Keeping a 
checked out copy</a>.
+</p>
+<hr>
+<a name="history-file"></a>
+<div class="header">
+<p>
+Next: <a href="#Variables" accesskey="n" rel="next">Variables</a>, Previous: 
<a href="#checkoutlist" accesskey="p" rel="prev">checkoutlist</a>, Up: <a 
href="#Administrative-files" accesskey="u" rel="up">Administrative files</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="The-history-file"></a>
+<h3 class="appendixsec">C.9 The history file</h3>
+<a name="index-History-file"></a>
+<a name="index-Log-information_002c-saving"></a>
+
+<p>The file <samp>$CVSROOT/CVSROOT/history</samp> is used
+to log information for the <code>history</code> command
+(see <a href="#history">history</a>).  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 <a href="#Creating-a-repository">Creating a repository</a>).
+</p>
+<p>The file format of the <samp>history</samp> 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>
+<a name="Variables"></a>
+<div class="header">
+<p>
+Next: <a href="#config" accesskey="n" rel="next">config</a>, Previous: <a 
href="#history-file" accesskey="p" rel="prev">history file</a>, Up: <a 
href="#Administrative-files" accesskey="u" rel="up">Administrative files</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Expansions-in-administrative-files"></a>
+<h3 class="appendixsec">C.10 Expansions in administrative files</h3>
+<a name="index-Internal-variables"></a>
+<a name="index-Variables"></a>
+
+<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 <a href="#Password-authenticated">Password 
authenticated</a>)
+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><a name="index-CVSROOT_002c-internal-variable"></a>
+<p>This is the absolute path to the current <small>CVS</small> root directory.
+See <a href="#Repository">Repository</a>, 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><a name="index-RCSBIN_002c-internal-variable"></a>
+<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><a name="index-CVSEDITOR_002c-internal-variable"></a>
+</dd>
+<dt><code>EDITOR</code></dt>
+<dd><a name="index-EDITOR_002c-internal-variable"></a>
+</dd>
+<dt><code>VISUAL</code></dt>
+<dd><a name="index-VISUAL_002c-internal-variable"></a>
+<p>These all expand to the same value, which is the editor
+that <small>CVS</small> is using.  See <a href="#Global-options">Global 
options</a>, for how
+to specify this.
+</p>
+</dd>
+<dt><code>USER</code></dt>
+<dd><a name="index-USER_002c-internal-variable"></a>
+<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 <a href="#Password-authentication-server">Password 
authentication server</a>).
+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.
+<a name="index-User-variables"></a>
+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
+<samp>.cvsrc</samp> (see <a href="#g_t_007e_002f_002ecvsrc">~/.cvsrc</a>).
+</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>
+<div class="example">
+<pre class="example">cvs -s TESTDIR=/work/local/tests
+</pre></div>
+
+<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><a 
name="index-environment-variables_002c-passed-to-administrative-files"></a>
+
+</dd>
+<dt><code>CVS_USER</code></dt>
+<dd><a name="index-CVS_005fUSER_002c-environment-variable"></a>
+<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 <samp>$CVSROOT/CVSROOT/passwd</samp>
+is used to map <small>CVS</small> usernames to system usernames.)
+</p>
+</dd>
+<dt><code>LOGNAME</code></dt>
+<dd><a name="index-LOGNAME_002c-environment-variable"></a>
+<p>The username of the system user.
+</p>
+</dd>
+<dt><code>USER</code></dt>
+<dd><a name="index-USER_002c-environment-variable"></a>
+<p>Same as <code>LOGNAME</code>.
+Do not confuse this with the internal variable of the same name.
+</p></dd>
+</dl>
+
+<hr>
+<a name="config"></a>
+<div class="header">
+<p>
+Previous: <a href="#Variables" accesskey="p" rel="prev">Variables</a>, Up: <a 
href="#Administrative-files" accesskey="u" rel="up">Administrative files</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="The-CVSROOT_002fconfig-configuration-file"></a>
+<h3 class="appendixsec">C.11 The CVSROOT/config configuration file</h3>
+
+<a name="index-config_002c-in-CVSROOT"></a>
+<a name="index-CVSROOT_002fconfig"></a>
+
+<p>The administrative file <samp>config</samp> 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><a name="index-RCSBIN_002c-in-CVSROOT_002fconfig"></a>
+</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>
+<a name="index-SystemAuth_002c-in-CVSROOT_002fconfig"></a>
+</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
+<samp>CVSROOT/passwd</samp>.  If it is &lsquo;<samp>no</samp>&rsquo;, then all
+pserver users must exist in <samp>CVSROOT/passwd</samp>.
+The default is &lsquo;<samp>yes</samp>&rsquo;.  For more on pserver, see
+<a href="#Password-authenticated">Password authenticated</a>.
+</p>
+
+<a name="index-TopLevelAdmin_002c-in-CVSROOT_002fconfig"></a>
+</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 <samp>CVS</samp> 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
+<samp>CVS/Template</samp> file (see <a 
href="#Working-directory-storage">Working directory storage</a>).
+</p>
+<a name="index-LockDir_002c-in-CVSROOT_002fconfig"></a>
+</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
+<a href="#Concurrency">Concurrency</a>.
+</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>
+<a name="index-LogHistory_002c-in-CVSROOT_002fconfig"></a>
+</dd>
+<dt><code>LogHistory=<var>value</var></code></dt>
+<dd><p>Control what is logged to the <samp>CVSROOT/history</samp> file (see <a 
href="#history">history</a>).
+Default of &lsquo;<samp>TOEFWUPCGMAR</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
+<samp>*,v</samp> files, use &lsquo;<samp>LogHistory=TMAR</samp>&rsquo;.)
+</p>
+<a name="index-RereadLogAfterVerify_002c-in-CVSROOT_002fconfig"></a>
+<a name="index-verifymsg_002c-changing-the-log-message-1"></a>
+</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 <samp>verifymsg</samp>.
+<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 file system
+&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>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 <a href="#verifymsg">verifymsg</a>, for more information on how 
verifymsg
+may be used.
+</p>
+<a name="index-IgnoreUnknownConfigKeys_002c-in-CVSROOT_002fconfig"></a>
+</dd>
+<dt><code>IgnoreUnknownConfigKeys=<var>value</var></code></dt>
+<dd><p>If <var>value</var> is &lsquo;<samp>yes</samp>&rsquo;, then 
<small>CVS</small> should
+ignore any keywords in <samp>CVSROOT/config</samp> which it
+does not recognize. This option is intended primarily
+for transitions between versions of <small>CVS</small> which
+support more configuration options in an environment
+where a read-only mirror of the current <small>CVS</small> server
+may be maintained by someone else who is not yet ready
+to upgrade to the same version. It is recommended that
+this option be used only for a short time so that
+problems with the <samp>CVSROOT/config</samp> file will be
+found quickly. The default is &lsquo;<samp>no</samp>&rsquo;.
+</p></dd>
+</dl>
+
+<hr>
+<a name="Environment-variables"></a>
+<div class="header">
+<p>
+Next: <a href="#Compatibility" accesskey="n" rel="next">Compatibility</a>, 
Previous: <a href="#Administrative-files" accesskey="p" 
rel="prev">Administrative files</a>, Up: <a href="#Top" accesskey="u" 
rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="All-environment-variables-which-affect-CVS"></a>
+<h2 class="appendix">Appendix D All environment variables which affect CVS</h2>
+<a name="index-Environment-variables"></a>
+<a name="index-Reference-manual-for-variables"></a>
+
+<p>This is a complete list of all environment variables
+that affect <small>CVS</small>.
+</p>
+<dl compact="compact">
+<dd><a name="index-CVSIGNORE_002c-environment-variable"></a>
+</dd>
+<dt><code>$CVSIGNORE</code></dt>
+<dd><p>A whitespace-separated list of file name patterns that
+<small>CVS</small> should ignore. See <a href="#cvsignore">cvsignore</a>.
+</p>
+<a name="index-CVSWRAPPERS_002c-environment-variable-1"></a>
+</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 <a 
href="#Wrappers">Wrappers</a>.
+</p>
+<a name="index-CVSREAD_002c-environment-variable"></a>
+<a name="index-Read_002donly-files_002c-and-CVSREAD"></a>
+</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>
+</dd>
+<dt><code>$CVSUMASK</code></dt>
+<dd><p>Controls permissions of files in the repository.  See
+<a href="#File-permissions">File permissions</a>.
+</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 <samp>CVS/Root</samp>), so normally you only need to
+worry about this when initially checking out a working
+directory.
+</p>
+</dd>
+<dt><code>$CVSEDITOR</code></dt>
+<dd><a name="index-CVSEDITOR_002c-environment-variable-1"></a>
+</dd>
+<dt><code>$EDITOR</code></dt>
+<dd><a name="index-EDITOR_002c-environment-variable-1"></a>
+</dd>
+<dt><code>$VISUAL</code></dt>
+<dd><a name="index-VISUAL_002c-environment-variable-1"></a>
+<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 <a href="#Committing-your-changes">Committing your changes</a> for more or
+<a href="#Global-options">Global options</a> for alternative ways of 
specifying a
+log editor.
+</p>
+<a name="index-PATH_002c-environment-variable"></a>
+</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>
+<a name="index-HOME_002c-environment-variable"></a>
+</dd>
+<dt><code>$HOME</code></dt>
+<dd><a name="index-HOMEPATH_002c-environment-variable"></a>
+</dd>
+<dt><code>$HOMEPATH</code></dt>
+<dd><a name="index-HOMEDRIVE_002c-environment-variable"></a>
+</dd>
+<dt><code>$HOMEDRIVE</code></dt>
+<dd><p>Used to locate the directory where the <samp>.cvsrc</samp>
+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 <samp>\joe</samp>.  On Windows 95, you&rsquo;ll
+probably need to set <code>HOMEDRIVE</code> and <code>HOMEPATH</code> yourself.
+</p>
+<a name="index-CVS_005fRSH_002c-environment-variable"></a>
+</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 <a href="#Connecting-via-rsh">Connecting via rsh</a>.
+</p>
+<a name="index-CVS_005fSSH_002c-environment-variable"></a>
+</dd>
+<dt><code>$CVS_SSH</code></dt>
+<dd><p>Specifies the external program which <small>CVS</small> connects with,
+when <code>:extssh:</code> access method is specified.
+see <a href="#Connecting-via-rsh">Connecting via rsh</a>.
+</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 <a href="#Connecting-via-rsh">Connecting via rsh</a>
+</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 <samp>$HOME/.cvspass</samp>.
+see <a href="#Password-authentication-client">Password authentication 
client</a>
+</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 <a href="#Remote-repositories">Remote repositories</a>
+</p>
+<a name="index-CVS_005fRCMD_005fPORT_002c-environment-variable"></a>
+</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>
+<a name="index-CVS_005fCLIENT_005fLOG_002c-environment-variable"></a>
+</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 <samp><code>$CVS_CLIENT_LOG</code>.in</samp> and everything
+sent from the server is logged into
+<samp><code>$CVS_CLIENT_LOG</code>.out</samp>.
+</p>
+<a name="index-CVS_005fSERVER_005fSLEEP_002c-environment-variable"></a>
+</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>
+<a 
name="index-CVS_005fIGNORE_005fREMOTE_005fROOT_002c-environment-variable"></a>
+</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 <samp>CVS/Root</samp>
+file when the &lsquo;<samp>-d</samp>&rsquo; global option is specified.
+Later versions of <small>CVS</small> do not rewrite
+<samp>CVS/Root</samp>, so <code>CVS_IGNORE_REMOTE_ROOT</code> has no
+effect.
+</p>
+<a name="index-COMSPEC_002c-environment-variable"></a>
+</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>
+<a name="index-TMPDIR_002c-environment-variable"></a>
+</dd>
+<dt><code>$TMPDIR</code></dt>
+<dd><a name="index-TMP_002c-environment-variable"></a>
+</dd>
+<dt><code>$TMP</code></dt>
+<dd><a name="index-TEMP_002c-environment-variable"></a>
+</dd>
+<dt><code>$TEMP</code></dt>
+<dd><a name="index-Temporary-files_002c-location-of"></a>
+<p>Directory in which temporary files are located.
+The <small>CVS</small> server uses
+<code>TMPDIR</code>.  See <a href="#Global-options">Global options</a>, for a
+description of how to specify this.
+Some parts of <small>CVS</small> will always use <samp>/tmp</samp> (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
+<samp>/tmp</samp> (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></dd>
+</dl>
+
+<hr>
+<a name="Compatibility"></a>
+<div class="header">
+<p>
+Next: <a href="#Troubleshooting" accesskey="n" rel="next">Troubleshooting</a>, 
Previous: <a href="#Environment-variables" accesskey="p" rel="prev">Environment 
variables</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Compatibility-between-CVS-Versions"></a>
+<h2 class="appendix">Appendix E Compatibility between CVS Versions</h2>
+
+<a name="index-CVS_002c-versions-of"></a>
+<a name="index-Versions_002c-of-CVS"></a>
+<a name="index-Compatibility_002c-between-CVS-versions"></a>
+<p>The repository format is compatible going back to
+<small>CVS</small> 1.3.  But see <a href="#Watches-Compatibility">Watches 
Compatibility</a>, 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 bug fixes, however.
+</p>
+
+<hr>
+<a name="Troubleshooting"></a>
+<div class="header">
+<p>
+Next: <a href="#Credits" accesskey="n" rel="next">Credits</a>, Previous: <a 
href="#Compatibility" accesskey="p" rel="prev">Compatibility</a>, Up: <a 
href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Troubleshooting-1"></a>
+<h2 class="appendix">Appendix F Troubleshooting</h2>
+
+<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>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Error-messages" 
accesskey="1">Error messages</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Partial list of CVS errors
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Connection" 
accesskey="2">Connection</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Trouble making a connection to a CVS server
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Other-problems" 
accesskey="3">Other problems</a>:</td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">Problems not readily listed by error message
+</td></tr>
+</table>
+
+
+<hr>
+<a name="Error-messages"></a>
+<div class="header">
+<p>
+Next: <a href="#Connection" accesskey="n" rel="next">Connection</a>, Up: <a 
href="#Troubleshooting" accesskey="u" rel="up">Troubleshooting</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Partial-list-of-error-messages"></a>
+<h3 class="appendixsec">F.1 Partial list of error messages</h3>
+
+<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 <a href="#BUGS">BUGS</a>.
+</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 <samp>inetd.conf</samp>.  See <a href="#Password-authenticated">Password 
authenticated</a>.
+</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><div class="example">
+<pre class="example">Operation not permitted
+</pre></div>
+<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 <a href="#BUGS">BUGS</a>.  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, <samp>/usr/local/cvsroot</samp> and you try
+to check out files when you are in a subdirectory, such
+as <samp>/usr/local/cvsroot/test</samp>.  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 <samp>/var/tmp</samp>; see <code>TMPDIR</code> in
+<a href="#Environment-variables">Environment variables</a>, 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 <a href="#BUGS">BUGS</a>).  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 <a href="#Connection">Connection</a>.
+</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 <a href="#BUGS">BUGS</a>.
+</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 <a href="#Repository">Repository</a>.
+</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 <a href="#BUGS">BUGS</a>).
+</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
+<a href="#Environment-variables">Environment variables</a>.
+</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 <a href="#BUGS">BUGS</a>.
+</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> or <code>ssh</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 <a 
href="#Remote-repositories">Remote repositories</a>.
+</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 <a href="#BUGS">BUGS</a>).
+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>
+<a name="index-mkmodules"></a>
+</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>
+<div class="example">
+<pre class="example">cvs commit: Rebuilding administrative file database
+</pre></div>
+
+<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 <a href="#modules">modules</a>.
+</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
+<a name="index-CVSROOT_002fval_002dtags-file_002c-forcing-tags-into"></a>
+<a name="index-val_002dtags-file_002c-forcing-tags-into"></a>
+the <samp>val-tags</samp> file; see discussion of val-tags in
+<a href="#File-permissions">File permissions</a>.  You only need to worry about
+this once for a given tag; when a tag is listed in
+<samp>val-tags</samp>, it stays there.  Note that using
+&lsquo;<samp>-f</samp>&rsquo; to not require tag matches does not override
+this check; see <a href="#Common-options">Common options</a>.
+</p>
+</dd>
+<dt><code>cvs [<var>command</var> aborted]: out of memory</code></dt>
+<dd><p>There is insufficient (virtual) memory available to continue.
+In client/server mode, the problem is almost certainly on the server
+rather than the client;
+see <a href="#Server-requirements">Server requirements</a> for memory 
estimates.
+Many systems have limits on the amount of virtual memory that a
+single process can use, so a process can run out of virtual memory
+long before the system itself has run out.
+The method of increasing the per-process limits varies depending
+on the operating system.
+</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 <a href="#BUGS">BUGS</a>).
+</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 can be caused by a loginfo program that fails to
+read all of the log information from its standard input.
+If you find it happening in any other circumstances,
+please let us know as described in <a href="#BUGS">BUGS</a>.
+</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 <samp>configure</samp> and 
recompiling <small>CVS</small>.
+On some systems this means editing the appropriate <samp>config.h</samp> file
+before building <small>CVS</small>.)
+</p>
+</dd>
+<dt><code>Terminated with fatal signal 11</code></dt>
+<dd><p>This message usually indicates that <small>CVS</small> (the server, if 
you&rsquo;re
+using client/server mode) has run out of (virtual) memory.
+Although <small>CVS</small> tries to catch the error and issue a more 
meaningful
+message, there are many circumstances where that is not possible.
+If you appear to have lots of memory available to the system,
+the problem is most likely that you&rsquo;re running into a system-wide
+limit on the amount of memory a single process can use or a
+similar process-specific limit.
+The mechanisms for displaying and setting such limits vary from
+system to system, so you&rsquo;ll have to consult an expert for your
+particular system if you don&rsquo;t know how to do that.
+</p>
+</dd>
+<dt><code>Too many arguments!</code></dt>
+<dd><p>This message is typically printed by the <samp>log.pl</samp>
+script which is in the <samp>contrib</samp> directory in the
+<small>CVS</small> source distribution.  In some versions of
+<small>CVS</small>, <samp>log.pl</samp> has been part of the default
+<small>CVS</small> installation.  The <samp>log.pl</samp> script gets
+called from the <samp>loginfo</samp> administrative file.
+Check that the arguments passed in <samp>loginfo</samp> match
+what your version of <samp>log.pl</samp> expects.  In
+particular, the <samp>log.pl</samp> from <small>CVS</small> 1.3 and
+older expects the log file as an argument whereas the
+<samp>log.pl</samp> from <small>CVS</small> 1.5 and newer expects the
+log file to be specified with a &lsquo;<samp>-f</samp>&rsquo; option.  Of
+course, if you don&rsquo;t need <samp>log.pl</samp> you can just
+comment it out of <samp>loginfo</samp>.
+</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 <samp>inetd.conf</samp> points
+to a nonexistent cvs executable.  To debug it further,
+find the log file which inetd writes
+(<samp>/var/log/messages</samp> or whatever inetd uses on
+your system).  For details, see <a href="#Connection">Connection</a>, and
+<a href="#Password-authentication-server">Password authentication server</a>.
+</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
+<a href="#Conflicts-example">Conflicts example</a>.
+</p>
+</dd>
+<dt><code>Usage:       diff3 [-exEX3 [-i | -m] [-L label1 -L label3]] file1 
file2 file3</code></dt>
+<dd><div class="example">
+<pre class="example">Only one of [exEX3] allowed
+</pre></div>
+<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
+<a href="#Concurrency">Concurrency</a>, for more details.
+</p>
+</dd>
+<dt><code>cvs commit: warning: editor session failed</code></dt>
+<dd><a name="index-Exit-status_002c-of-editor"></a>
+<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>
+<div class="example">
+<pre class="example">#!/bin/sh
+vi $*
+exit 0
+</pre></div>
+
+</dd>
+<dt><code>cvs update: warning: <var>file</var> was lost</code></dt>
+<dd><p>This means that the working copy of <var>file</var> has been deleted
+but it has not been removed from <small>CVS</small>.
+This is nothing to be concerned about,
+the update will just recreate the local file from the repository.
+(This is a convenient way to discard local changes to a file:
+just delete it and then run <code>cvs update</code>.)
+</p>
+</dd>
+<dt><code>cvs update: warning: <var>file</var> is not (any longer) 
pertinent</code></dt>
+<dd><p>This means that the working copy of <var>file</var> has been deleted,
+it has not been removed from <small>CVS</small> in the current working 
directory,
+but it has been removed from <small>CVS</small> in some other working 
directory.
+This is nothing to be concerned about,
+the update would have removed the local file anyway.
+</p>
+</dd>
+</dl>
+
+<hr>
+<a name="Connection"></a>
+<div class="header">
+<p>
+Next: <a href="#Other-problems" accesskey="n" rel="next">Other problems</a>, 
Previous: <a href="#Error-messages" accesskey="p" rel="prev">Error 
messages</a>, Up: <a href="#Troubleshooting" accesskey="u" 
rel="up">Troubleshooting</a> &nbsp; [<a href="#SEC_Contents" title="Table of 
contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Trouble-making-a-connection-to-a-CVS-server"></a>
+<h3 class="appendixsec">F.2 Trouble making a connection to a CVS server</h3>
+
+<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><a name="index-_003aext_003a_002c-troubleshooting"></a>
+</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>
+<a name="index-_003aserver_003a_002c-troubleshooting"></a>
+</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>
+<a name="index-_003apserver_003a_002c-troubleshooting"></a>
+</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 <samp>inetd.conf</samp>
+or by firewall software rejecting the connection).
+&quot;unrecognized auth response&quot; errors are caused by a bad command
+line in <samp>inetd.conf</samp>, 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>
+<div class="example">
+<pre class="example">cvs [pserver aborted]: bad auth protocol start: foo
+</pre></div>
+
+<p>If instead you get:
+</p>
+<div class="example">
+<pre class="example">Usage: cvs [cvs-options] command 
[command-options-and-arguments]
+...
+</pre></div>
+
+<p>then you&rsquo;re missing the &lsquo;<samp>pserver</samp>&rsquo; command at 
the end of the
+line in <samp>inetd.conf</samp>; 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>
+<div class="example">
+<pre class="example">Unknown command: `pserved'
+
+CVS commands are:
+        add          Add a new file/directory to the repository
+...
+</pre></div>
+
+<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 <samp>inetd.conf</samp>.
+</p>
+<p>If it fails to work at all, then make sure inetd is working
+right.  Change the invocation in <samp>inetd.conf</samp> to run the
+echo program instead of cvs.  For example:
+</p>
+<div class="example">
+<pre class="example">2401  stream  tcp  nowait  root /bin/echo echo hello
+</pre></div>
+
+<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>
+<div class="example">
+<pre class="example">cvs server: cannot open /root/.cvsignore: Permission 
denied
+cvs [server aborted]: can't chdir(/root): Permission denied
+</pre></div>
+
+<p>then you probably haven&rsquo;t specified &lsquo;<samp>-f</samp>&rsquo; in 
<samp>inetd.conf</samp>.
+(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>
+<a name="Other-problems"></a>
+<div class="header">
+<p>
+Previous: <a href="#Connection" accesskey="p" rel="prev">Connection</a>, Up: 
<a href="#Troubleshooting" accesskey="u" rel="up">Troubleshooting</a> &nbsp; 
[<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Other-common-problems"></a>
+<h3 class="appendixsec">F.3 Other common problems</h3>
+
+<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 <samp>C:/</samp>, for example (see
+<code>HOMEDRIVE</code> and <code>HOMEPATH</code> in
+<a href="#Environment-variables">Environment variables</a>).  
<small>CVS</small> expects the home
+directory to not end in a slash, for example <samp>C:</samp>
+or <samp>C:\cvs</samp>.
+
+</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 <a href="#Conflicts-example">Conflicts example</a>, 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>
+<a name="Credits"></a>
+<div class="header">
+<p>
+Next: <a href="#BUGS" accesskey="n" rel="next">BUGS</a>, Previous: <a 
href="#Troubleshooting" accesskey="p" rel="prev">Troubleshooting</a>, Up: <a 
href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Credits-1"></a>
+<h2 class="appendix">Appendix G Credits</h2>
+
+<a name="index-Contributors-_0028manual_0029"></a>
+<a name="index-Credits-_0028manual_0029"></a>
+<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>
+<div class="display">
+<pre class="display">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;.
+</pre></div>
+
+<p>The list of contributors here is not comprehensive; for a more
+complete list of who has contributed to this manual see
+the file <samp>doc/ChangeLog</samp> in the <small>CVS</small> source
+distribution.
+</p>
+<hr>
+<a name="BUGS"></a>
+<div class="header">
+<p>
+Next: <a href="#Index" accesskey="n" rel="next">Index</a>, Previous: <a 
href="#Credits" accesskey="p" rel="prev">Credits</a>, Up: <a href="#Top" 
accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of 
contents" rel="contents">Contents</a>][<a href="#Index" title="Index" 
rel="index">Index</a>]</p>
+</div>
+<a name="Dealing-with-bugs-in-CVS-or-this-manual"></a>
+<h2 class="appendix">Appendix H Dealing with bugs in CVS or this manual</h2>
+
+<a name="index-Bugs-in-this-manual-or-CVS"></a>
+<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>
+<a name="index-Reporting-bugs"></a>
+<a name="index-Bugs_002c-reporting"></a>
+<a name="index-Errors_002c-reporting"></a>
+<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:
+
+<a name="index-Ximbiot"></a>
+<a name="index-Support_002c-getting-CVS-support"></a>
+<div class="example">
+<pre class="example">Ximbiot LLC
+Suite 230
+200 Diversion St.
+Rochester Hills, MI  48307-6636
+USA
+Email: address@hidden
+Phone: (248) 835-1260
+Fax:   (248) 835-1263
+<a href="http://ximbiot.com/";>http://ximbiot.com/</a>
+
+</pre></div>
+
+</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.  A
+good place to start is:
+
+<div class="example">
+<pre class="example"><a 
href="http://cvs.nongnu.org/";>http://cvs.nongnu.org/</a>
+</pre></div>
+
+<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 <a 
href="mailto:address@hidden";>address@hidden</a>.
+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 <a href="mailto:address@hidden";>address@hidden</a>.  Note
+that submissions to <a href="mailto:address@hidden";>address@hidden</a> 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
+<a href="mailto:address@hidden";>address@hidden</a>; those maintainers who want 
to hear
+about such bug reports read <a 
href="mailto:address@hidden";>address@hidden</a>.  Also note
+that sending a bug report to other mailing lists or
+newsgroups is <em>not</em> a substitute for sending it to
+<a href="mailto:address@hidden";>address@hidden</a>.  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 <a href="mailto:address@hidden";>address@hidden</a>.
+</li></ul>
+
+<a name="index-Known-bugs-in-this-manual-or-CVS"></a>
+<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>
+<a name="Index"></a>
+<div class="header">
+<p>
+Previous: <a href="#BUGS" accesskey="p" rel="prev">BUGS</a>, Up: <a 
href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" 
title="Table of contents" rel="contents">Contents</a>][<a href="#Index" 
title="Index" rel="index">Index</a>]</p>
+</div>
+<a name="Index-1"></a>
+<h2 class="unnumbered">Index</h2>
+<a name="index-Index"></a>
+
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a class="summary-letter" 
href="#Index_cp_symbol-1"><b>!</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_symbol-2"><b>#</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_symbol-3"><b>&amp;</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_symbol-4"><b>-</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_symbol-5"><b>.</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_symbol-6"><b>/</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_symbol-7"><b>:</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_symbol-8"><b>&lt;</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_symbol-9"><b>=</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_symbol-10"><b>&gt;</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_symbol-11"><b>_</b></a>
+ &nbsp; 
+<br>
+<a class="summary-letter" href="#Index_cp_letter-A"><b>A</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_letter-B"><b>B</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_letter-C"><b>C</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_letter-D"><b>D</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_letter-E"><b>E</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_letter-F"><b>F</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_letter-G"><b>G</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_letter-H"><b>H</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_letter-I"><b>I</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_letter-J"><b>J</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_letter-K"><b>K</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_letter-L"><b>L</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_letter-M"><b>M</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_letter-N"><b>N</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_letter-O"><b>O</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_letter-P"><b>P</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_letter-R"><b>R</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_letter-S"><b>S</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_letter-T"><b>T</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_letter-U"><b>U</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_letter-V"><b>V</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_letter-W"><b>W</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_letter-X"><b>X</b></a>
+ &nbsp; 
+<a class="summary-letter" href="#Index_cp_letter-Z"><b>Z</b></a>
+ &nbsp; 
+</td></tr></table>
+<table class="index-cp" border="0">
+<tr><td></td><th align="left">Index Entry</th><td>&nbsp;</td><th align="left"> 
Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th><a name="Index_cp_symbol-1">!</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_0021_002c-in-modules-file">!, 
in modules file</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Excluding-directories">Excluding directories</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th><a name="Index_cp_symbol-2">#</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_0023cvs_002elock_002c-removing">#cvs.lock, 
removing</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Concurrency">Concurrency</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_0023cvs_002elock_002c-technical-details">#cvs.lock, technical 
details</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Locks">Locks</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_0023cvs_002erfl_002c-and-backups">#cvs.rfl, and 
backups</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Backing-up">Backing 
up</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_0023cvs_002erfl_002c-removing">#cvs.rfl, 
removing</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Concurrency">Concurrency</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_0023cvs_002erfl_002c-technical-details">#cvs.rfl, technical 
details</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Locks">Locks</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_0023cvs_002etfl">#cvs.tfl</a>:</td><td>&nbsp;</td><td 
valign="top"><a href="#Locks">Locks</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_0023cvs_002ewfl_002c-removing">#cvs.wfl, 
removing</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Concurrency">Concurrency</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_0023cvs_002ewfl_002c-technical-details">#cvs.wfl, technical 
details</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Locks">Locks</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th><a name="Index_cp_symbol-3">&amp;</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_0026_002c-in-modules-file">&amp;, in modules 
file</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Ampersand-modules">Ampersand modules</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th><a name="Index_cp_symbol-4">-</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002da_002c-in-modules-file">-a, 
in modules file</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Alias-modules">Alias modules</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dd_002c-in-modules-file">-d, 
in modules file</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Module-options">Module options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002de_002c-in-modules-file">-e, 
in modules file</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Module-options">Module options</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_002de_002c-in-modules-file-1">-e, in modules 
file</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Module-program-options">Module program options</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_002dj-_0028merging-branches_0029">-j (merging 
branches)</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Merging-a-branch">Merging a branch</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_002dj-_0028merging-branches_0029_002c-and-keyword-substitution">-j
 (merging branches), and keyword substitution</a>:</td><td>&nbsp;</td><td 
valign="top"><a href="#Merging-and-keywords">Merging and keywords</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_002dk-_0028keyword-substitution_0029">-k (keyword 
substitution)</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Substitution-modes">Substitution modes</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_002dkk_002c-to-avoid-conflicts-during-a-merge">-kk, to avoid 
conflicts during a merge</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Merging-and-keywords">Merging and keywords</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002do_002c-in-modules-file">-o, 
in modules file</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Module-options">Module options</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_002do_002c-in-modules-file-1">-o, in modules 
file</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Module-program-options">Module program options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002ds_002c-in-modules-file">-s, 
in modules file</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Module-options">Module options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dt_002c-in-modules-file">-t, 
in modules file</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Module-options">Module options</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_002dt_002c-in-modules-file-1">-t, in modules 
file</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Module-program-options">Module program options</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th><a name="Index_cp_symbol-5">.</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002e_0023-files">.# 
files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#update-output">update 
output</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_002ebashrc_002c-setting-CVSROOT-in">.bashrc, setting CVSROOT 
in</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Specifying-a-repository">Specifying a repository</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_002ecshrc_002c-setting-CVSROOT-in">.cshrc, setting CVSROOT 
in</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Specifying-a-repository">Specifying a repository</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002ecvsrc-file">.cvsrc 
file</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#g_t_007e_002f_002ecvsrc">~/.cvsrc</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_002eprofile_002c-setting-CVSROOT-in">.profile, setting CVSROOT 
in</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Specifying-a-repository">Specifying a repository</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_002etcshrc_002c-setting-CVSROOT-in">.tcshrc, setting CVSROOT 
in</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Specifying-a-repository">Specifying a repository</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th><a name="Index_cp_symbol-6">/</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_002fusr_002flocal_002fcvsroot_002c-as-example-repository">/usr/local/cvsroot,
 as example repository</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Repository">Repository</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th><a name="Index_cp_symbol-7">:</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_003aext_003a_002c-setting-up">:ext:, setting 
up</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Connecting-via-rsh">Connecting via rsh</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_003aext_003a_002c-troubleshooting">:ext:, 
troubleshooting</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Connection">Connection</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_003aextssh_003a_002c-setting-up">:extssh:, setting 
up</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Connecting-via-rsh">Connecting via rsh</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_003afork_003a_002c-setting-up">:fork:, setting 
up</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Connecting-via-fork">Connecting via fork</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_003agserver_003a_002c-setting-up">:gserver:, setting 
up</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#GSSAPI-authenticated">GSSAPI authenticated</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_003akserver_003a_002c-setting-up">:kserver:, setting 
up</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Kerberos-authenticated">Kerberos authenticated</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_003alocal_003a_002c-setting-up">:local:, setting 
up</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Repository">Repository</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_003apserver_003a_002c-setting-up">:pserver:, setting 
up</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Password-authentication-client">Password authentication 
client</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_003apserver_003a_002c-troubleshooting">:pserver:, 
troubleshooting</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Connection">Connection</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_003aserver_003a_002c-setting-up">:server:, setting 
up</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Connecting-via-rsh">Connecting via rsh</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_003aserver_003a_002c-troubleshooting">:server:, 
troubleshooting</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Connection">Connection</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th><a name="Index_cp_symbol-8">&lt;</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_003c_003c_003c_003c_003c_003c_003c">&lt;&lt;&lt;&lt;&lt;&lt;&lt;</a>:</td><td>&nbsp;</td><td
 valign="top"><a href="#Conflicts-example">Conflicts example</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th><a name="Index_cp_symbol-9">=</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_003d_003d_003d_003d_003d_003d_003d">=======</a>:</td><td>&nbsp;</td><td
 valign="top"><a href="#Conflicts-example">Conflicts example</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th><a name="Index_cp_symbol-10">&gt;</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_003e_003e_003e_003e_003e_003e_003e">&gt;&gt;&gt;&gt;&gt;&gt;&gt;</a>:</td><td>&nbsp;</td><td
 valign="top"><a href="#Conflicts-example">Conflicts example</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th><a name="Index_cp_symbol-11">_</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-_005f_005f-files-_0028VMS_0029">__ files 
(VMS)</a>:</td><td>&nbsp;</td><td valign="top"><a href="#update-output">update 
output</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th><a name="Index_cp_letter-A">A</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Abandoning-work">Abandoning 
work</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Editing-files">Editing 
files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Access-a-branch">Access a 
branch</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Accessing-branches">Accessing branches</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-add-_0028subcommand_0029">add 
(subcommand)</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Adding-files">Adding files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-add-_0028subcommand_0029-1">add 
(subcommand)</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#add">add</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Adding-a-tag">Adding a 
tag</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Tags">Tags</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Adding-files">Adding 
files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Adding-files">Adding 
files</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Admin-_0028subcommand_0029">Admin 
(subcommand)</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#admin">admin</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Administrative-files-_0028intro_0029">Administrative files 
(intro)</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Intro-administrative-files">Intro administrative files</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Administrative-files-_0028reference_0029">Administrative files 
(reference)</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Administrative-files">Administrative files</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Administrative-files_002c-editing-them">Administrative files, 
editing them</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Intro-administrative-files">Intro administrative files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Alias-modules">Alias 
modules</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Alias-modules">Alias 
modules</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ALL-in-commitinfo">ALL in 
commitinfo</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#commitinfo">commitinfo</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Ampersand-modules">Ampersand 
modules</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Ampersand-modules">Ampersand modules</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-annotate-_0028subcommand_0029">annotate 
(subcommand)</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#annotate">annotate</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Atomic-transactions_002c-lack-of">Atomic transactions, lack 
of</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Concurrency">Concurrency</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Attic">Attic</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Attic">Attic</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Authenticated-client_002c-using">Authenticated client, 
using</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Password-authentication-client">Password authentication 
client</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Authenticating-server_002c-setting-up">Authenticating server, 
setting up</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Password-authentication-server">Password authentication 
server</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Authentication_002c-stream">Authentication, 
stream</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Global-options">Global options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Author-keyword">Author 
keyword</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Keyword-list">Keyword list</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Automatically-ignored-files">Automatically ignored 
files</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#cvsignore">cvsignore</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Avoiding-editor-invocation">Avoiding editor 
invocation</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Common-options">Common options</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th><a name="Index_cp_letter-B">B</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Backing-up_002c-repository">Backing up, 
repository</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Backing-up">Backing up</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Base-directory_002c-in-CVS-directory">Base directory, in CVS 
directory</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Working-directory-storage">Working directory storage</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-BASE_002c-as-reserved-tag-name">BASE, as reserved tag 
name</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Tags">Tags</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-BASE_002c-special-tag">BASE, 
special tag</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Common-options">Common options</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Baserev-file_002c-in-CVS-directory">Baserev file, in CVS 
directory</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Working-directory-storage">Working directory storage</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Baserev_002etmp-file_002c-in-CVS-directory">Baserev.tmp file, in 
CVS directory</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Working-directory-storage">Working directory storage</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Bill-of-materials">Bill of 
materials</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Builds">Builds</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Binary-files">Binary 
files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Binary-files">Binary 
files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Branch-merge-example">Branch 
merge example</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Merging-a-branch">Merging a branch</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Branch-number">Branch 
number</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Revision-numbers">Revision numbers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Branch-number-1">Branch 
number</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Branches-and-revisions">Branches and revisions</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Branch-tags_002c-deleting">Branch tags, 
deleting</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Modifying-tags">Modifying tags</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Branch-tags_002c-moving">Branch 
tags, moving</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Modifying-tags">Modifying tags</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Branch_002c-accessing">Branch, 
accessing</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Accessing-branches">Accessing branches</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Branch_002c-check-out">Branch, 
check out</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Accessing-branches">Accessing branches</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Branch_002c-creating-a">Branch, 
creating a</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Creating-a-branch">Creating a branch</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Branch_002c-identifying">Branch, 
identifying</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Accessing-branches">Accessing branches</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Branch_002c-retrieving">Branch, 
retrieving</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Accessing-branches">Accessing branches</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Branch_002c-vendor_002d">Branch, 
vendor-</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Tracking-sources">Tracking sources</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Branches-motivation">Branches 
motivation</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Branches-motivation">Branches motivation</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Branches_002c-copying-changes-between">Branches, copying changes 
between</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Branching-and-merging">Branching and merging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Branches_002c-sticky">Branches, 
sticky</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Accessing-branches">Accessing branches</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Branching">Branching</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Branching-and-merging">Branching and merging</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Bringing-a-file-up-to-date">Bringing a file up to 
date</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Updating-a-file">Updating a file</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Bugs-in-this-manual-or-CVS">Bugs 
in this manual or CVS</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#BUGS">BUGS</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Bugs_002c-reporting">Bugs, 
reporting</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#BUGS">BUGS</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Builds">Builds</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Builds">Builds</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th><a name="Index_cp_letter-C">C</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Changes_002c-copying-between-branches">Changes, copying between 
branches</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Branching-and-merging">Branching and merging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Changing-a-log-message">Changing 
a log message</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#admin-options">admin options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Check-out-a-branch">Check out a 
branch</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Accessing-branches">Accessing branches</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Checked-out-copy_002c-keeping">Checked out copy, 
keeping</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Keeping-a-checked-out-copy">Keeping a checked out copy</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Checking-out-source">Checking 
out source</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Getting-the-source">Getting the source</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-checkout-_0028subcommand_0029">checkout 
(subcommand)</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#checkout">checkout</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Checkout-program">Checkout 
program</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Module-options">Module options</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Checkout_002c-as-term-for-getting-ready-to-edit">Checkout, as term 
for getting ready to edit</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Editing-files">Editing files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Checkout_002c-example">Checkout, 
example</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Getting-the-source">Getting the source</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-checkoutlist">checkoutlist</a>:</td><td>&nbsp;</td><td 
valign="top"><a href="#checkoutlist">checkoutlist</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Choosing_002c-reserved-or-unreserved-checkouts">Choosing, reserved 
or unreserved checkouts</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Choosing-a-model">Choosing a model</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Cleaning-up">Cleaning 
up</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Cleaning-up">Cleaning 
up</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Client_002fServer-Operation">Client/Server 
Operation</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Remote-repositories">Remote repositories</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Client_002fServer-Operation_002c-port-specification">Client/Server 
Operation, port specification</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Remote-repositories">Remote repositories</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Client_002fServer-Oper