Perhaps the most important way to familiarize CVS users with Subversion is to let them continue to work on their projects using the new system. And while that can be somewhat accomplished using a flat import into a Subversion repository of an exported CVS repository, the more thorough solution involves transferring not just the latest snapshot of their data, but all the history behind it as well, from one system to another. This is an extremely difficult problem to solve; it involves deducing changesets in the absence of atomicity and translating between the systems' completely orthogonal branching policies, among other complications. Still, there are a handful of tools claiming to at least partially support the ability to convert existing CVS repositories into Subversion ones.
The most popular (and most mature) conversion tool is
http://cvs2svn.tigris.org/), a Python
script originally created by members of Subversion's own
development community. This tool is meant to run exactly once:
it scans your CVS repository multiple times and attempts to
deduce commits, branches, and tags as best it can. When it
finishes, the result is a either a Subversion repository or a
portable Subversion dumpfile representing your code's history.
See the web site for detailed instructions and caveats.