Install CVS Server on SUSE 11

This tutorial show how to install the CVS version control system on SUSE 11.

What is CVS

This is an explanation picked up from the Wikipedia:

"The Concurrent Versions System (CVS), also known as the Concurrent Versioning System, is a client-server free software revision control system in the field of software development. Version control system software keeps track of all work and all changes in a set of files, and allows several developers (potentially widely separated in space and time) to collaborate. Dick Grune developed CVS as a series of shell scripts in July 1986."

As you can see from the last sentence we can consider CVS like the grandfather of the version control systems, and it still used by developers, but if you are just starting now versioning your projects I strongly suggest to have a look at Git and a great place to learn it is GitHub.

Preliminary Note

Before to start I just want to warn you that this is a practical guide without any warranty, it was written with the purpose to help system administrators, so I won't explain technical details neither the theory behind of them.


I used a Suse server in this tutorial to install CVS, so you will need a Suse server installed.

Have a look to the Suse Linux Enterprise Server 11 SP2 Installation tutorial to install one.

Install CVS on SUSE 11

Login as root user and install the cvs package:

# zypper install cvs
Loading repository data...
Reading installed packages...
Resolving package dependencies...

The following NEW package is going to be installed:

1 new package to install.
Overall download size: 386.0 KiB. After the operation, additional 899.0 KiB will be used.
Continue? [y/n/?] (y):
Retrieving package cvs-1.12.12-144.21.x86_64 (1/1), 386.0 KiB (899.0 KiB unpacked)
Installing: cvs-1.12.12-144.21 [done]

CVS Configuration

Create a user and a group called cvs:

# groupadd cvs
# useradd -gcvs cvs

Set the repository in the /srv/cvsroot directory:

# cvs -d /srv/cvsroot init

Repeat this process if you want to create multiple repositories, e.g., /srv/cvsroot2, /srv/cvspublic, etc. Each repository can have different sets of authorized users.

Change owner and group of all files of the repository to cvs:

# chown -R cvs.cvs /srv/cvsroot

Configure xinetd to run the cvs service by editing the /etc/xinetd.d/cvs file:

# CVS pserver (remote acces to your CVS repositories)
# Please read the section on security and passwords in the CVS manual,
# before you enable this.
# default: off

service cvspserver
    disable         = no
    socket_type     = stream
    protocol        = tcp
    port            = 2401
    wait            = no
    user            = root
    server          = /usr/bin/cvs
    server_args     = -f --allow-root=/srv/cvsroot pserver

Now restart xinetd:

# /etc/init.d/xinetd restart
Shutting down xinetd: (not running)         done
Starting INET services. (xinetd)            done

CVS Repository Testing

Login as root and add yourusername to the cvs group:

# usermod -G cvs yourusername

Login as yourusername and set the default repository in the environment

> export CVSROOT=:pserver:yourusername@localhost:/srv/cvsroot

Test the basic login:

> cvs login

Enter the yourusername password. There should not be any error messages.

If you get an error like this:

cvs login: warning: failed to open /home/yourusername/.cvspass for reading: No such file or directory

you can easily fix it by changing the file permissions:

> chmod 660 .cvspass

Create a tiny test project:

> cd
> mkdir testproject
> echo "Testing CVS Server" > testproject/README.txt

Now import the project to the repository:

> cd testproject
> cvs import -m "Imported a test project" testproject mycompany start

Make sure the project was created in the repository.

You should see the file README.txt inside /srv/cvsroot/testproject folder:

> ls -la /srv/cvsroot/testproject/

Remove your test project folder and checkout a working copy:

> cd
> rm -r testproject
> cvs checkout testproject

That's it ! Now you can start versioning your projects with CVS.