I had checked out a bunch of modules fron CVS, but then I realized that CVS checkouts don't come with all the info such as version numbers, so I wanted to delete them and replace them with real copies. I used Drush and Bash, and here's how I did it.
Need to delete every CVS file from the sites/all/modules directory, and then replace each module with a fresh copy downloaded from drupal.org, and do it without ruining your SVN repository? "What's the difference?" you ask. Well, modules checked out directly from CVS don't get extra packaging info from drupal.org, and don't keep track of their own version numbers properly (you'll see a blank Version column on admin/build/modules).
So by getting a fresh copy from drupal.org, you get a proper .info file, and a LICENSE.txt file added for you. And it's a long module list? No problemo!
Assumptions - you have Drush installed and you're working with a checkout of an SVN repository.
cd to your modules directory, usually
cd examplesite/sites/all/modules
Update your modules to their latest versions - Drush is going to try and download the latest anyway, and you want them to match up.
Tell Drush to grab fresh copies of modules from drupal.org with:
find . -name CVS -depth 2 | sed 's/\// /g' | awk {'print $2'} | xargs drush dl
and watch the "Project xxx downloaded to ..." messages scroll by.
Get rid of all the CVS files with
find . -name CVS -prune -exec svn rm {} \;
Add all the new files (should just be a bunch of LICENSE.txt files) with svn status | grep '^?' | xargs svn add
Then do a quick svn status - and you should see a bunch of Deletes on CVS files, Adding LICENSE.txt files, and Modifying any .info files
Last, SVN commit the whole bunch! yay! svn commit -m "removed old CVS tags, redownloaded modules from drupal.org" .
--
edit: thanks to Joel for a better introduction




Or, install CVS Deploy like you're supposed to when you checkout directly from CVS.