Concurrent Versions System (CVS)

advertisement
An Intro to Concurrent
Versions System (CVS)
ECE 417/617:
Elements of Software Engineering
Stan Birchfield
Clemson University
What is CVS?
• CVS
– is a version (or revision) control system
– maintains entire history of source file
(for each change: who, when, and why)
– is open-source and free (unlike SourceSafe)
• What does it do?
–
–
–
–
–
–
stores entire history of each file efficiently
allows multiple people to work simultaneously
enables retrieval of old systems
helps to manage different versions, releases
works well over WAN (server/client)
works for any ASCII file, and limited support for binary
• What is it not?
– a build system
– a substitute for management or communication
Why CVS?
• Problem: how to coordinate source file
changes from multiple developers?
– Solution #1: Manual merging and
coordination
– Solution #2: lock-modify-unlock (RCS,
SCCS)
– Solution #3: concurrent development (CVS)
How CVS manages changes
• Scenarios:
– People work on different files  trivial
– People work on different parts of the same
file  CVS essentially runs ‘diff’
– People work on the same part of the same
file  CVS alerts user, requires manual
merging of changes
CVS model
Server (Unix/Linux)
Local machine (any O/S)
checkout, update, diff
Respository: central,
official copy, as well as
entire history
Local copy: used for
editing
add, remove, commit, tag
Note: checkout is a one-time operation
CVS directory structure
Repository on server
/pub/cvsprojects/ece417
|
+--CVSROOT (admin. files)
+--3dmm
| +-- data
|
+-- main.cpp,v
|
+-- database.cpp,v
| +-- ui
|
+-- MainFrame.cpp,v
|
+-- SettingsDlg.cpp,v
|
+--klt-ui
+--bibtex-manager
...
Copy on local machine
C:/user/me/mycode
|
+--CVS (admin. files)
|
+--data
+-- CVS (admin. files)
+-- main.cpp
+-- database.cpp
+--ui
+-- CVS (admin. files)
+-- MainFrame.cpp
+-- SettingsDlg.cpp
Note: All information stored on a per-file basis
Pserver authentication
• Each CVS command needs to authenticate you
• Instead of a password for each command, first login
• Steps:
– cvs login (server checks its passwd file; if no passwd, then falls
back to Unix system authentication)
– now your password is stored locally in ~/.cvspass
– local password is automatically used in the future as long as it’s
there
– CVS_PASSFILE can be used to change location of .cvspass
• Note: pserver authentication provides minimal
security; do NOT use an important password
CVS commands
• Syntax:
cvs [goptions] command [coptions] [arguments]
• Example:
cvs -d :pserver:me@cvs.ces.clemson.edu:/pub/cvsprojects/ece417 login
• Common commands:
–
–
–
–
–
cvs checkout modules ; create private copy
cvs update ; incorporate others’ changes into
private copy
cvs add file ; add private file to repository
cvs remove file ; remove file from repository
cvs commit file ; publish changes to others
• Customizing:
– .cvsrc file contains default options, both global and commandspecific
Create / checkout module
• To put a directory under CVS control,
cvs import –m “New file” foo me start
– All files in current directory are stored in foo subdirectory of
repository
– -m “New file” specifies the log comment
– foo is directory name in repository
– me is vendor tag (can be anything)
– start is start tag (can be anything)
• To checkout a directory,
cvs checkout foo
– All files in foo subdirectory of repository are copied to current
directory
Changing files
• To add a file to the repository,
cvs add file
; takes effect at the next commit
• To remove a file from the repository,
cvs remove file ; takes effect at the next commit
• To commit changes you’ve made to a file,
cvs commit files
• To tag a file revision,
cvs tag –c MyProject-v1.0.0.0 files
(-c warns and aborts if source files are not up-to-date)
Bringing files up to date
• To bring local files up to date,
cvs update
– All files in current directory are updated using repository
– For each file, prints one-letter code:
•
•
•
•
U (update): your file has been updated with someone’s changes
M (merge): same, but you had made changes to the file, too
C (conflict): same, but CVS could not merge the changes
? (unknown): file is not under CVS control
• Note: You cannot commit a file unless it’s up-to-date
Other useful commands
• To get information about a file,
cvs status file
• To examine a file’s log,
cvs log file
• To see who made what change,
cvs annotate file
Conflicts
• If two people modify the same part of a file, there is a
conflict
• CVS retains both sets of changes in the file, separated
by <<<< (changes1) ==== (changes2) >>>>
• Example:
main() {
<<<<<<< hello.c
puts("Hello, World!");
======= printf("Hello World");
>>>>>>> 1.2
}
Setting up server
•
•
Create a CVS repository if there is not already one
Add this to /etc/services:
cvs 2401/tcp # remote cvs server
•
Add this to /etc/inetd.conf:
•
•
Restart inetd
To encrypt password for CVSHOME/passwd file,
cvs stream tcp nowait root /path/to/cvs cvs pserver
– /usr/local/bin/perl
-e 'print crypt("MyPassword","St") . "\n";‘
– copy and paste into passwd file as name:epswd
•
•
To use RSH instead,
use :ext instead of :pserver for CVSROOT. Might want to add
set CVS_RSH to ssh which makes CVS use SSH and encryption for
remote access.
Initialize CVS repository,
cvs –d /usr/local/cvsrep init ; sets up CVSROOT directory
Versions and revisions
• Each file has a unique revision number
– Even number of dot-separated integers (start with 1.1)
– Successive revisions increment the rightmost number
• Each branch has a unique branch number
– Number appended to revision number
– Correspond to user versions
Suggested CVS policies
• Each file has an owner
• You may
– completely modify your own file
(but don’t change class interface)
– make minor/obvious bug fixes to others’ files, but only if 100%
confident (also notify them, just in case)
– ask for permission before making bigger changes, or request
the change from the developer
• Alternative: You are never allowed to modify anyone
else’s file
– Good: no chance of conflict
– Bad: extra overhead, not taking advantage of the “C” in CVS
(might as well be using lock-modify-unlock)
Other suggestions
• Make sure system clock reflects real time
• Frequently update
(stay in sync with repository)
• Frequently commit changes
(once compiled, completed, tested, reviewed)
• Do NOT share code except via repository
(e.g., emails)
• Build early, build often (BEBO)
• Tag early, tag often
• Save executables associated with tagged builds
Obtaining CVS
• CvsGui (WinCVS/MacCvs,gCvs):
http://www.wincvs.org
Download and install; this is a GUI
front-end and also includes CVS
CVS: http://www.cvshome.org
If you just want the command-line
version; documentation is here, too
Download