Finally we migrated one of our legacy project from Subversion to Git considering the fact some of the team members still continue to work on SVN until they complete the development of feature(s) of a product on which they are working on.
In this post I tried to replicate the steps what we followed during migration taking an example of moving the project name my-application stored in a locally hosted SVN, following below steps:
Step 1: Download svn-migration-scripts.jar from here and place it in any directory, for me it’s svn-to-git under windows directory D:\ as follows:
D:\> mkdir svn-to-git D:\> cd svn-to-git
Step 2: Verify the scripts to make sure Java Runtime Environment, Git, Subversion, and the git-svn utility installed.
java -jar D:\svn-to-git\svn-migration-scripts.jar verify
Step 3: Extract the author information from SVN in a text file as follows:
D:\svn-to-git> java -jar D:\svn-to-git\svn-migration-scripts.jar authors http://localhost:81/svn/my-application > authors.txt
http://localhost:81/svn specified above is the svn host url
my-application refers to the name of a project in svn
Above command creates authors.txt that contains the username of every author in the SVN repository along with a generated name and email address. Edit the name and email address of the user and save it.
Step 4: Clone the SVN repository using git svn clone command as follows:
D:\svn-to-git> git svn clone --trunk=/trunk/dev/ --username=ArpitAggarwal --branches=/branches/dev --authors-file=authors.txt http://localhost:81/svn/my-application dev-git
Above command clone and update the information essential for git about the dev branch stored in a /branches/dev of my-application inside .git folder generated under directory dev-git.
If above command fails because of Perl crash then instead of restarting the git svn clone process move to your partially retrieved git repository and execute git-svn fetch command, it continues fetching the svn revisions from where we left off as follows:
D:\svn-to-git\dev-git> git svn fetch
Step 5: Next, we will clean the newly created Git repository to make it ready to push on a remote GitHub repository and also make Git aware about the authors file which we created before, as follows:
D:\svn-to-git\dev-git> java -Dfile.encoding=utf-8 -jar D:\svn-to-git\svn-migration-scripts.jar clean-git --force D:\svn-to-git\dev-git> git config svn.authorsfile D:\svn-to-git\authors.txt
If clean-git command fails then checkout my answer on stackoverflow.com.
Step 6: Now create a new repository on GitHub for me it’s my-application and push the code to it following below commands:
D:\svn-to-git\dev-git> git remote add origin email@example.com:arpitaggarwal/my-application.git D:\svn-to-git\dev-git> git push -u origin master
Now anytime from now if you want to update Git from SVN code, just fetch the new commits from the SVN repository, rebase the same with the local Git repository, clean and push it to the remote, as follows:
D:\svn-to-git\dev-git> git svn fetch D:\svn-to-git\dev-git> java -Dfile.encoding=utf-8 -jar D:\svn-to-git\svn-migration-scripts.jar sync-rebase D:\svn-to-git\dev-git> java -Dfile.encoding=utf-8 -jar D:\svn-to-git\svn-migration-scripts.jar clean-git --force D:\svn-to-git\dev-git> git add . D:\svn-to-git\dev-git> git push