Migrating a SourceForge project from Subversion to Git
Many projects are now contemplating the move from Subversion to a more modern, distributed version control system (VCS) such as Git or Mercurial.
Until recently, the default strategy was to take the whole source repository from the SourceForge site and import it into the rival GitHub site.
SourceForge offers their own comperehensive Git solution now, and there is no imperative reason to abandon SourceForge. The instructions presented here show how to convert the code repository into the SourceForge Git system, but they could just as easily be used to import the project into any Git host (such as GitHub) if that is desired.
We use dynalogin as an example
As an example, we will use the conversion of the dynalogin project.
Check out the old repository
mkdir ~/dynalogin-conversion
svn checkout https://dynalogin.svn.sourceforge.net/svnroot/dynalogin dynalogin-svn-full
cd dynalogin-svn-full
svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > ~/dynalogin-conversion/authors-transform.txt
cd ~/dynalogin-conversion/
vi authors-transform.txt
- Edit the authors file by hand
- After the = symbol on each line, put the full name and email address that should be used in the git log
d_pocock = Daniel Pocock <daniel@pocock.com.au>
Build a temporary git repository
- You must have already installed
gitand the optional componentgit-svn
mkdir ~/dynalogin-conversion
cd ~/dynalogin-conversion
git svn clone https://dynalogin.svn.sourceforge.net/svnroot/dynalogin --no-metadata -A ~/dynalogin-conversion/authors-transform.txt --stdlayout dynalogin-git-tmp
mkdir ~/dynalogin-conversion/dynalogin.git
cd ~/dynalogin-conversion/dynalogin.git/
git init --bare .
git symbolic-ref HEAD refs/heads/trunk
cd ~/dynalogin-conversion/dynalogin-git-tmp
git remote add bare ~/dynalogin-conversion/dynalogin.git
git config remote.bare.push 'refs/remotes/*:refs/heads/*'
git push bare
cd ~/dynalogin-conversion/dynalogin.git/
git branch -m trunk master
git for-each-ref --format='%(refname)' refs/heads/tags | cut -d / -f 4 | while read ref; \
do
git tag "$ref" "refs/heads/tags/$ref"
git branch -D "tags/$ref"
done
git remote add origin ssh://d_pocock@dynalogin.git.sourceforge.net/gitroot/dynalogin/dynalogin
git config branch.master.remote origin
git config branch.master.merge refs/heads/master
git push --tags origin master
All done
You can now use the SourceForge git browser to inspect the results and verify that your project was migrated.
Once complete, it is a good idea to completely disable SVN access to your project to ensure no developers submit code to the wrong repository. SourceForge does not attempt to synchronize commits across their SVN and Git repositories in any way.
- Daniel.Pocock's blog
- Login to post comments
