cvs – create your own repository

cvs – create your own repository

cvs is an open source version control software.  It is
pretty widely used.  It also forms the basis for the FreeBSD source code tree. 
This article talks about creating a cvs repository for your own project. You can
put anything into cvs so long as it’s in a file.  I’m using cvs for storing
the source code for FreshPorts.

Don’t confuse cvsup
with cvscvs is a separate program.  cvsup is used
to get data from a cvsup server, which in turn, reads from a cvs repository.

Also, I am by no means a cvs expert.  I’m just writing down what I did so
when I go to do it again, I have my notes.  Of course, corrections and additions are always welcome in the comments section.


Here are some useful cvs resources:
<= Good basic stuff about cvs

And more recently (29 September 2000) found:
– CVS for new users
– Introduction to CVS
– CVS–Concurrent Versions System

And more recently (11 January 2001) found: – Using
CVS for Web Development
– Good and simple instructions.  READ THIS!
– CVS–Concurrent Versions System
– ideal for setting up a server

Creating the cvs repository

The first step is to create the cvs repository (also known as a

  1. create an empty directory which will hold the tree.

    mkdir ~/mycvs

  2. Set the CVSROOT environment variable.

    export CVSROOT=~/mycvs

    The above is for a bash shell.  If you are using a csh derived shell, try setenv
    CVSROOT /mycvs

  3. Create the repository:

    cvs init

If you now look in ~/mycvs, you’ll find the basic files which constitute a repository.

Adding your project to the repository

Now we’ll add your project to the repository.

  1. cd /path/to/project
  2. cvs import myproject devel beta

This instructs cvs to import the files located in the current directory.
  cvs uses the value of CVSROOT to determine which tree the files will be
imported into.  You should note the following points about the above command:

  • The files will be added under the directory ${CVSROOT}/CVSROOT/myproject.
  • myproject is the module name.
  • "devel" is the tag given to the entire branch.
  • "beta" is the release tag give to each of the files.

See man cvs for more detail.

Importing a vendor branch

I import vendor branches for the third party software which I use within my websites.
For example, Phorum and phpPgAds.
When a new release comes out, I import that source code into my CVS Repository. This makes it
easier for me to maintain my local customizations of these popular software packages.

Here I am importing the latest version of Phorum:

$ cvs import -ko -m "Import Phorum 3.4.6" phorum PHORUM_3_4_6 Phorum
U phorum/attach.php
C phorum/common.php
U phorum/down.php
U phorum/download.php
U phorum/edit.php
U phorum/help.php
U phorum/index.php
C phorum/list.php
U phorum/login.php
U phorum/moderator.php
U phorum/phorum.css


U phorum/smileys/smilie3.gif
U phorum/smileys/smilie4.gif
U phorum/smileys/smilie5.gif
U phorum/smileys/smilie6.gif
U phorum/smileys/smilie7.gif
U phorum/smileys/smilie8.gif
U phorum/smileys/smilie9.gif

5 conflicts created by this import.
Use the following command to help the merge:

        cvs checkout -j<prev_rel_tag> -jPhorum phorum

To resolve the conflicts, I did this:

$ cvs checkout -jPHORUM_3_4_4 -jPHORUM_3_4_6 phorum
cvs server: Updating phorum
U phorum/attach.php
U phorum/common.php
RCS file: /home/repositories/3rdPartyProducts/phorum/common.php,v
retrieving revision
retrieving revision
Merging differences between and into common.php
U phorum/down.php
U phorum/download.php
U phorum/edit.php
U phorum/help.php
U phorum/index.php
U phorum/list.php
RCS file: /home/repositories/3rdPartyProducts/phorum/list.php,v
retrieving revision
retrieving revision
Merging differences between and into list.php
rcsmerge: warning: conflicts during merge

CVS was unable to resolve conflicts in list.php. In short,
my local changes and the vendor branch changes overlap. We both changed the same
lines of code. CVS doesn’t know which should be used, so it leaves it up to you
to fix it. The conflicts will be highlighted within the file. Please refer to the
“Tracking Third-Party Sources” section of the red-bean link shown near the top of
this page.

Checking out the files

The first step in modifying something from your repository is to check out
the files.  So I did this:

mkdir /home/dan/work/myproject
cvs co myproject

Note that "myproject" is the name of the module we created when we did the
import.  However, the above will place the files in /home/dan/work/myproject.
  If you want the files to be placed into the current directory and you don’t want cvs
to create a subdirectory, try this instead:

mkdir /home/dan/work/myproject
cvs co -d . myproject

Checking out a single file

If youi want to get a single file from the repository, you do it like

cvs co myproject/the.file.i.want

If you want a particular revision of that file:

cvs co -r1.1 myproject/the.file.i.want

That will give you revision 1.1 of that file.

Perhaps the file lives in a subdirectory of the project.  No problem.  Just
supply the pathname

cvs co myproject/path/to/the.file.i.want

What’s changed?

Now you can make your changes.  To see what’s changed between your
work files and your repository, use this command:

cvs diff

Or compare the current files against revision 1.3:

cvs diff -r1.3 category-watch.php3

Adding new files to the repository

If a new file is needed, you can add it to the repository by doing this:

$ cvs add
cvs add: scheduling file '' for addition

On your next commit, the file will be added to the repository.

Checking things back in

Once you are happy with any changes you have made, you can commit these
changes to the repository by doing this:

cvs commit

cvs commit: Up-to-date check failed for `about.html’

Sometimes, when you try to commit stuff back to the database, things don’t
go as planned.  For example:

$ cvs commit
cvs commit: Examining .
cvs commit: Up-to-date check failed for `about.html'
cvs commit: Examining _private
cvs commit: Examining graphics
cvs commit: Examining images
cvs commit: Examining scripts
cvs commit: Examining work
cvs commit: Examining work/graphics
cvs [commit aborted]: correct above errors first!

It was suggested to me that about.html was older than that which was in the repository
and that I should try this instead:

$ cvs update about.html
RCS file: /home/dan/mycvs/freshports/about.html,v
retrieving revision
retrieving revision 1.2
Merging differences between and 1.2 into about.html
about.html already contains the differences between and 1.2

That worked for me!

other useful options

This section shows you some interesting options.

  • status
# cvs status category-watch.php3 
File: category-watch.php3       Status: Locally Modified

   Working revision:    1.3     Mon May  1 13:35:50 2000
   Repository revision: 1.3     /home/dan/mycvs/freshports/category
   Sticky Tag:          (none)
   Sticky Date:         (none)
   Sticky Options:      (none)
  • history (might help you find the revision you want)
cvs history -c category-watch.php3 

Backing out a commit (added on 30 September 2003)

You made a mistake. You committed something you didn’t want to commit. There
is an easy way to undo those changes and commit a new revision.
For our example, we’ll assume the last commit
created revision 1.4. We want to reverse all of those changes. We want revision
to go back to what we had in revision 1.3. By the nature of a repository, all revisions are held forever.
We will use the features of cvs to automatically undo the changes for ut.
The file we need to change is freshports.php.

A very useful cvs feature is the ability to merge changes between revision. The
following command merges the changes between the two revisions into the working
copy of the file:

cvs up -j 1.4 -j 1.3 freshports.php

The order of the revisions is important. In this case, we first specify the revision
containing the mistaken commit first, and then the revision we wish to which we want
to revert.

After executing the above command, check that your working copy is identical to revision

cvs di -r 1.3 freshports.php

After verifying this is how we want the file to look, we commit:

cvs ci freshports.php

Done. Revision committed. We’re back with what we had in revision 1.3.

Leave a Comment

Scroll to Top