1. CVS can be found here. IMHO, this is the best introduction to CVS on the web.

  2. Linux environment variables that must be set for CVS in a distributed environment:
    export CVS_RSH=ssh
    export CVSROOT=grevera@cava2:/home/grevera/cvsroot

  3. (Don't do this if the server already exists!) Setting up the server repository for the first time on the machine, cava2, using existing code:
    mkdir cvsroot
    cvs init
    cvs import -m "cavass" cavass mipg start

  4. Obtaining the code from the repository:
    cvs checkout cavass

  5. Update the repository with your changes:
    cvs commit -m "improvements to alpha" testProgram.cpp

  6. Other useful commands:
    cvs login - store an encrypted version of password for future sessions
    - you won't (shouldn't) have to enter a password for each command
    cvs log file
    or
    cvs log -t -N
    - who did what
    cvs diff -b testProgram.cpp
    cvs release
    cvs annotate file - verbose version of who did what
    cvs remove file - file will be removed at the next commit
    - cvs remove will not work unless you delete file first
    cvs add alpha.cpp
    cvs commit alpha.cpp
    - to add a new file to the repository


  7. Bring your copy of a module up to date: (Update the code in your directories with any changes made to the code in the repository.)
    
    	cvs -n -q update -d
    
    	Display all files which are not up-to-date (and any new directories)
    	without actually change anything in your working directory.  It can
    	be used to check what has been going on with the project.
    
    	cvs update -d
    
    	Update will compare files in a checked out module with their
    	counterparts in the repository.  All files examined will be shown
    	with a one letter code preceding them.  The '-d' option also updates
            the current checkout with new directories that are in the repository 
            but not in the current checkout.
    
    	U file
    	The file was brought up to date with respect to the repository. This is done for any file that exists in the repository but not in your source, and for files that you haven't changed but are not the most recent versions available in the repository.
    
    	A file
    	The file has been added to your private copy of the sources, and will be added to the source repository when you run commit on the file. This is a reminder to you that the file needs to be committed.
    
    	R file
    	The file has been removed from your private copy of the sources, and will be removed from the source repository when you run commit on the file. This is a reminder to you that the file needs to be committed.
    
    	M file
    	The file is modified in your working directory.
    
    	`M' can indicate one of two states for a file you're working on: either there were no modifications to the same file in the repository, so that your file remains as you last saw it; or there were modifications in the repository as well as in your copy, but they were merged successfully, without conflict, in your working directory.
    
    	CVS will print some messages if it merges your work, and a backup copy of your working file (as it looked before you ran update) will be made. The exact name of that file is printed while update runs.
    
    	C file
    	A conflict was detected while trying to merge your changes to file with changes from the source repository. file (the copy in your working directory) is now the output of the rcsmerge(1) command on the two revisions; an unmodified copy of your file is also in your working directory, with the name `.#file.revision' where revision is the RCS revision that your modified file started from. (Note that some systems automatically purge files that begin with `.#' if they have not been accessed for a few days. If you intend to keep a copy of your original file, it is a very good idea to rename it.)
    
    	? file
    	file is in your working directory, but does not correspond to anything in the source repository, and is not in the list of files for CVS to ignore (see the description of the `-I' option, and see section Ignoring files via cvsignore).
    
  8. Tagging / Releases
    	Each file in cvs has a version number.  However, it is often useful
    	to give a symbolic name to all the files at once.
    
    	cvs tag version_1_0
    
    	will attach the tag "version_1_0" to all the files in the current
    	directory.
    
    	file1   file2   file3   file4   
    	                1.1
    	                1.2
    	                1.3     1.1
    	        1.1     1.4     1.2
    	1.1 --- 1.2 --- 1.5 --- 1.3 <-- version_1_0
    	1.2     1.3     1.6
    	1.3
    
    	Checking out a specific version
    
    		cvs checkout -r version_1_0 hello
    
    		will checkout a copy of the 1.0 version of the hello module.
    
  9. CVS doesn't handle binaries well. Use:
    	cvs add -kb filename
    	cvs ci -m "added blah" filename
    
    	If a file accidentally gets added without '-kb', one can use the
    	cvs admin command to recover. For example:
    
    		echo '$Id$' > kotest
    		cvs add -m"A test file" kotest
    		cvs ci -m"First checkin; contains a keyword" kotest
    		cvs admin -kb kotest
    		cvs update -A kotest
    		# For non-unix systems:
    		# Copy in a good copy of the file from outside CVS
    		cvs commit -m "make it binary" kotest