[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Savannah-cvs] [CvSToSvN]
From: |
Beuc |
Subject: |
[Savannah-cvs] [CvSToSvN] |
Date: |
Sun, 26 Nov 2006 12:29:07 +0000 |
Tools
There are a couple tools to convert CVS to SVN:
* cvs2svn (http://cvs2svn.tigris.org/) - uses a fixed repository layout.
* VCP http://public.perforce.com/public/revml/index.html is a many-to-many
repository converter; there is a SVN/SVK plug-in for it at
http://search.cpan.org/~clkao/VCP-Dest-svk-0.28/svk.pm.
* 'svk mirror' should be able to import a CVS repository (apparently through
VCP).
* RefineCVS: Another one with flexible layout capability:
http://lev.serebryakov.spb.ru/refinecvs/
cvs2svn
Here are an experiment I did with cvs2svn. We probably need to use the latest
(not Debian sarge's) version.
The first step is to mirror the CVS repository on your local host using the
Savannah rsync access - you'll probably need to convert the repository a couple
times before getting exactly what you want.
rsync -av rsync://cvs.sv.gnu.org/sources/yourproject/ yourproject-cvs/
Note that if you work on Unix only, you're likely to only work with "text"
files: CVS does _not_ set files as binary (cvs admin -kb) automatically (not by
analysing content, _nor by extension_), unless extensions are mentioned in
CVSROOT/cvswrappers or ./.cvswrappers, and that's only at import/add time, this
has to be manually fixed later. For example, I had to run either of those to
fix the Savane PNGs:
# Fix a remote repository:
cvs co -d... myworkingcopy
cd myworkingcopy
find -name "*.png" -o -name "*.xcf" | xargs cvs admin -kb
# Fix a rsync'd repository:
find -name "*.png,v" -o -name "*.xcf,v" | xargs rcs -kb
It took me 30 minutes to convert the (26M tar.gz) Savane repository, while
people at Gna! mention several hours.
It's probably faster to convert repositories in your personal computer, but
this is yet to prove.
Default conversion creates a layout like::
\
|-trunk
|-CVSROOT
|-modulename1
|-modulename2
`...
|-branches
`-tags
Here is the command::
cvs2svn --use-cvs --fs-type=fsfs --username=YOUR_SAVANNAH_ACCOUNT
--cvs-revnums -s SVN_REPOSITORY CVS_REPOSITORY \
--mime-types=/etc/mime.types > out.txt 2>err.txt
'--use-cvs': use CVS instead of RCS, which is necessary in some rare cases;
since we want a generic command line, let's use it, even if slower
'--mime-types': adds a better content-type than application/octet-stream; not
necessary strictly speaking
'--fs-type=fsfs': the BDB (Berkley DB) format is apparently not a good one;
FSFS is a bit more transparent and has some improvements. Savane uses it.
It is possible to get a different layout using a several-step import::
\
|-CVSROOT
|-trunk
|-branches
`tags
|-modulename1
|-trunk
|-branches
`tags
|-modulename2
|-trunk
|-branches
`tags
`...
Importing in several steps may cause searches by date to provide bogus results,
because SVN assumes that if revno1 < revno2, date_revno1 < date_revno2, which
typically isn't necessary the case when importing different modules one after
the other (with ever incrementing revnos). Here're the commands (not tested)::
svn init ...
for modname in cvs-repo/*; do
cvs2svn --use-cvs --cvs-revnums --fs-type=fsfs
--username=YOUR_SAVANNAH_ACCOUNT \
--mime-types=/etc/mime.types --dumpfile=$modname.dump CVS_REPOSITORY/$modname
svnadmin --parent-dir $modname load /path/to/svnrepo < $modname.dump
done
Of course, in both cases we may want to filter CVSROOT out, but user still can
hide it thereafter.
Yet another last layout is::
modulename1 # trunk
modulename1-branches
modulename1-tags
modulename2
modulename2-branches
modulename2-tags
You may or may not like this. The best way for Savannah would be to provide an
automated way to complete the whole conversion process (beware of DoS though).
Documentation on http://cvs2svn.tigris.org/cvs2svn.html . Don't miss --tmpdir
zand --dumpfile. Also check the FAQ: http://cvs2svn.tigris.org/faq.html
https://gna.org/task/index.php?func=detailitem&item_id=2229 details issues
during the conversion of the Savane project repository itself.
Commands that I ran to convert Savane
(note: eventually the other Savane maintainer kept his own, less exhaustive,
conversion that he did a few days earlier)::
cvs2svn --use-cvs --fs-type=fsfs --username=beuc --cvs-revnums
--mime-types=/etc/mime.types \
-s savane-svn savane-cvs/savane > out.txt 2>err.txt
cvs2svn --use-cvs --fs-type=fsfs --username=beuc --cvs-revnums
--mime-types=/etc/mime.types \
--dumpfile CVSROOT.dump --dump-only savane-cvs/CVSROOT
svn mkdir file://`pwd`/savane-svn/CVSROOT -m "Added CVSROOT directory."
svnadmin --parent-dir CVSROOT load savane-svn < CVSROOT.dump
cvs2svn --use-cvs --fs-type=fsfs --username=beuc --cvs-revnums
--mime-types=/etc/mime.types \
--dumpfile moved_out.dump --dump-only savane-cvs/moved_out
svn mkdir file://`pwd`/savane-svn/moved_out -m "Added moved_out directory."
svnadmin --parent-dir moved_out load savane-svn < moved_out.dump
cvs2svn --use-cvs --fs-type=fsfs --username=beuc --cvs-revnums
--mime-types=/etc/mime.types \
--dumpfile devel.dump --dump-only savane-cvs/devel
svn mkdir file://`pwd`/savane-svn/devel -m "Added devel directory."
svnadmin --parent-dir devel load savane-svn < devel.dump
--
forwarded from
https://savannah.gnu.org/maintenance/address@hidden://savannah.gnu.org/maintenance
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Savannah-cvs] [CvSToSvN],
Beuc <=