Vagrearg Logo  
Small Example
A CVS/RCS repository grapher
Small Example



CvsGraph is a utility to make a graphical representation of all revisions and branches of a file in a CVS/RCS repository. It has been inspired by the 'graph' option in WinCVS, but I could not find a stand-alone version of this graph code. So, it was time to write one.

Where to get it

The source-code:
Tarball cvsgraph-1.7.2.tar.gz
Older version can be downloaded here.

The source of CvsGraph can be found at GitLab at Yes, I know, the irony is not lost on me. Times change and and we move on.

CvsGraph in action

An example

An example CvsGraph image
Command-line used (with default cvsgraph.conf) with source t.c,v:
./cvsgraph -O'merge_from="^source_(.*)"; merge_to="^merge_%1$"; merge_color="#e00000"' \
	-O'merge_from="^source2_(.*)"; merge_to="^merge2_%1$"; merge_color="#00e000"' \
	-O'strip_untagged=1; strip_first_rev=0; transparent_bg=1' \
	-o ../t.png -r. -m. ../t.c,v

More info


CvsGraph is published under GNU General Public License v.2. For more information on GPL visit the GNU website.


Moved to old FAQ


  • Images can still be very large when you have many revisions and branches. You can reduce imagesize by using any combination of these options:
    strip_untagged Reduce the number of revisions shown that have no tags
    rev_maxtags Reduce revision boxes by limiting the number of tags shown
    tag_ignore Remove tags that match a regular expression
    rev_hidenumber Do not display the revision number in revision boxes (and branch boxes)
    branch_fold Fold all branches without revisions into one branch-box
    branch_subtree Only show parts of the tree


Changes for 1.7.2
  • Make config option rev_hidenumber function properly for branch boxes (see issue report)
  • Also apply rev_hidenumber to folded branch boxes
Changes for 1.7.1
  • Update cvsgraph after 11 years and relocate home after the original server went the way of dead Dodo bits (may its bytes zero in peace).
    • update autotools version
    • fix two printf format warning and unused var warning
    • use pkg-config for libgd and freetype
    • fix web and mail references
    • still being amazed of the portability and surviving 10+ years bitrot
    • bump the version to 1.7.1
Changes for 1.7.0
  • Do a better job at drawing the merge lines by selecting the shortest path from the revision boxes. An analysis is now done whether the source and destinations should be on the left or right side.
  • Fix the left_right case for merge lines to display correctly.
  • Fix a +/-1 error on the merge lines to account for both rounding errors and the shadow of the revision boxes.
  • Add configuration option 'merge_on_tag' to force the left_right case to display merge lines on the tags instead of on the top/bottom sides. This also solves imagemap overlaps where multiple sources or destinations would be displayed at the same position.
  • Fix the imagemap function to record the correct position of the merges.
  • Use automake
  • Streamline the package with patches from the Fedora RPMS
Changes for 1.6.2
  • Imagemap bugfix
  • Never released
Changes for 1.6.1
  • Minor textual fixes in the config manual page
  • Do a better job at drawing merge lines. Ugly cross over lines could be generated if branches had the same parent. Now they are moved to the right (or bottom)
Pre 1.6.1 changes


  • Many thanks to Jason Corley for the RPM spec-file
  • Thanks to Russell Yanofsky and Chris Bridges (cvsgraph at rfel dot com) for the windows binaries.
    Please see for details if you want to compile a windows binary. I do not know anything about it.
  • Thanks to all others who contributed bugreports and patches which I probably have mentioned in a log or other places. Mail me if your ego is big enough to want a place on the frontpage ;-)
  • * The icon used is shamelessly taken from the ViewCVS distro, file cvsgraph_16x16.png. I cannot find any reference to the original creator, otherwise I would gladly credit him or her personally.


As of 20 August 2005, if you send me an email with a contained or attached disclaimer that includes one or more of the following items:
  • legal notice or threat(s)
  • disclosure restriction(s)
  • forward restriction(s)
  • "intended recipient" nonsense
Then you automatically agree to pay me a license fee of DKK 1000,- for using my email address and a DKK 250,- fee for wasting my time on reading it.
Overengineering @ request