> Regarding the "live" database, you can simply make a file copy of the
> VSS files to your local computer and run the conversion from there. If
> you do it in a silent minute, during the night, you could probaply get
> a pristine copy.

Definitely ! A copy of the database should be the first thing you do to
begin your migration. Actually, in case anyone is interested, here is
the complete workflow I used for our migration :

1. Choose a powerful, dedicated machine to run the migration. It can be
  your own laptop, or another server just as long as it is not the VSS
  server. I used our automated build server since it already had Perl
  and is a pretty beefy box that is somewhat underused. From this point
on
  I'm assuming a Windows box was selected.

2. Make sure the following software is available on that machine :
 - SourceSafe 6.0d (please avoid VSS 8, I'm sorry to say this but they
   actually managed to make it less stable). Make sure SS.exe and 
   ANALYZE.exe are on the PATH.
 - ROBOCOPY.EXE, you can get this from the Windows Resource Kits, or
   many other places on the web. Make sure it is on the PATH too.
 - vss2svn (preferably in Perl source form, so that you are ready for
   a quick patch if anything goes wrong) and its dependencies.
 - the latest Subversion, make sure it is in the PATH too.

3. Log in to that machine using an account that has read-only access to
  the VSS share. I'll actually be altering the VSS database before the
  migration and I'm a bit paranoid about accidentally destroying our
  production database. Notice that this read-only access prevents the
  SourceSafe client from accessing the VSS database, but that's
  actually a good thing.

4. Create a local copy of your VSS database using ROBOCOPY :
 ROBOCOPY /MIR \\vssserver\vss C:\svnmigration\vsscopy

5. Open srcsafe.ini in the VSS db copy, make sure to remove
  any references to shadow folders and a journal file : again
  we don't want local operations on this copy to disrupt the
  production environment.

5. Create a directory somewhere, call it something like 
  "C:\svnmigration\migration1".

  You'll be doing several migrations and you may want to compare the
  results from one to another so it's a good idea to archive the
attempts.
  I went further and copied the whole of vss2svn under this directory,
  this allowed me to also archive what little tweaks I had made to the
  script for each attempt.

6. If you want to keep your hair through your migration, a key
  word is "automate" ! Create a script using whatever systems automation
  language you are comfortable with. I guess Perl would be a logical
  choice, but I selected CMD scripts (batch files) since I didn't know
  enough Perl to do what I wanted. Your script should do the following :
   a. synchronize the data in the local copy of the VSS database :

        SET SSDIR=C:\svnmigration\vsscopy
        ROBOCOPY /MIR \\vssserver\vss\data %SSDIR%\data

     (notice I synchronized only the data subdirectory since I want
      to keep the local modifications to srcsafe.ini that I did above)
     (notice also that the /MIR switch to ROBOCOPY makes it remove
      files that are no longer present in the VSS db, and also
      avoids copying files that have not been modified, which means
      this operation should run pretty fast for each migration)

   b. "SS Destroy" any projects/files you don't want to migrate :

        SS Destroy -I-Y $/ProjectIDontWant
    
        (-I-Y means "shut up and do it" to SS.exe)

        I have found that destroying projects in a copy leads to
        cleaner migrations than the alternative which is to
        backup/restore only selected projects.

      Some of the projects/files that you don't want may have been
deleted,
        but not purged. You need to recover them first :

        SS Recover $/MyProject/HugeFileThatWasCheckedInByMistake.zip
        SS Destroy -I-Y
$/MyProject/HugeFileThatWasCheckedInByMistake.zip

   c. Run ANALYZE on the database copy :
        
        rmdir /S/Q %SSDIR%\data\backup
        ANALYZE -f -i- -v4 %SSDIR%\data
        copy /Y %SSDIR%\data\backup\analyze.log .

        (ANALYZE flags : force repair, no interaction, deep analysis)

   d. Run vss2svn :
        
        perl -Ivss2svn vss2svn\vss2svn.pl --ssphys vss2svn\ssphys.exe
--vssdir %SSDIR% --verbose --timing > vss2svn.log 2>&1

        (this assumes you made a local copy of vss2svn)

   e. Create and load the SVN repository :

        rmdir /S/Q repos
        svnadmin create repos
        svnadmin load repos < vss2svn-dumpfile.txt > svnadmin.log 2>&1

   f. Do any post-migration cleanup in svn :

      SET SVNREPOS=file:///%CD:\=/%/repos
      svn mv %SVNREPOS%/MainBranch /trunk
      svn rm %SVNREPOS%/OldProject

        (see point 10 for why it is sometimes better to remove a
directory from
        the SVN repository than to purge it from VSS beforehand)

7. Launch your script, making sure to redirect all output to a log file
   that you can analyze later for errors.

        migrate.cmd > migrate.log 2>&1

8. Let time pass for a bit. If you want to know what the migration is
   doing at any point, you may find http://tailforwin32.sourceforge.net/
   useful to look at the log files as they are being appended to.

9. Once the migration is complete, take a look at the results. What
   I did was launch an svnserve on the migration machine and browse
   the repository from my laptop using TortoiseSVN.

10. You'll find something you don't like about the migration results.
   No problem, just create a "migration2" directory, copy vss2svn and
   your script there, make any fixes you need and start again.

 Some random things to look out for :

 - It is a good idea to grep for ERROR in the vss2svn.log file, but
   don't get frightened by every match : unfortunately vss2svn does not
   try very hard currently to rank the errors from benign to fatal.

 - Are there "too many" files in /orphaned ? You may have had a heavy
hand in step 6b above (destroying projects). Let's say for example a
file was initially created in $/Version1/file.txt, and then $/Version1
was shared/branched to $/Version2. If you destroy $/Version1,
$/Version2/file.txt is orphaned ! It is much better to keep $/Version1
in the migration, then add "svn rm /Version1" to step 6f if you truly
want to hide that old project.
   In short, try to only destroy truly irrelevant projects.

 - What are the biggest revisions in your new SVN repository ? This is
easy to find by peeking into repos\db\revs. Most of these files should
be pretty small, any that exceeds a few megabytes is suspicious (well,
depending on your data of course, if you were handling large assets in
VSS it could be just fine). In my repository only 85 revisions out of
24500 exceed one megabyte.
   To see the details of a "suspicious" revision :

        svn log svn://path/to/repository/root/ -v -rREV

   This could help you find the instances of
HugeFileThatWasCheckedInByMistake.zip that bloat your repository for no
good reason. Go then to step 6b and add such files to the "black list".

That's it ! I hope these suggestions are useful to someone going through
a migration.
Perhaps the vss2svn wiki should contain information of this kind ?

Cheers,
--Jonathan

_______________________________________________
vss2svn-users mailing list
Project homepage:
http://www.pumacode.org/projects/vss2svn/
Subscribe/Unsubscribe/Admin:
http://lists.pumacode.org/mailman/listinfo/vss2svn-users-lists.pumacode.org
Mailing list web interface (with searchable archives):
http://dir.gmane.org/gmane.comp.version-control.subversion.vss2svn.user

Reply via email to