From Unfuddle (svn) to git
I've blogged about converting a Subversion repository to git a couple times. While it was a tedious process at first, I've made my peace with it and now cannot count the code repositories I have migrated successfully anymore. The migration usually works, except for when I deal with our old provider unfuddle.
For some reason, sometimes it didn't work right away and I had to re-run git svn clone
a couple of times to get it right.
git svn clone
Here's a snippet to make it work for you:
$ git svn clone --authors-file=./authors.txt --no-metadata \ --prefix=svn/company_repositoryname/ \ --tags=tags \ --trunk=trunk \ --branches=branches \ http://company.unfuddle.com/svn/company_repositoryname \ ./new-git-repo
Make sure to replace the company and the company_repositoryname part in above scripts.
For some reason, I was never able to get prefix and all that completely right from the start. That is, until now — needless to say the above works. And for the sake of documenting and not re-learning each time (e.g. today, as a migrate another Subversion repository to git (Github :-)), here's my documentary blog post.
Tags and branches
Tags and branches are slightly different concepts in Subversion and git.
In Subversion, we usually ran pre-processing on tags before we deployed them (because doing this in a branch was a huge pita due to size of the repository and the overall joy of merging commits in Subversion. So in the end, a tag we created in Subversion, is not a tag in git because we modified the tag — which makes it a branch.
So as a follow up to my prior snippet to convert a repostitory, I've used this script to convert the branches it created to proper tags in git:
#!/bin/sh branches=(`git branch -r`) for branch in "${branches[@]}" do case $branch in *tag*) tag=${branch//svn\/company_repositoryname\/tags\//} remote="remotes/${branch}" echo "$tag from $branch, remote: $remote" git checkout -b "tag-$tag" $remote && git tag -a $tag -m "SVN tag: $tag" ;; *) echo "Skipping: $branch" esac done
Again, you will have to adjust company_repositoryname in this piece. :-)
Once the script completes, I verify the tags with git tag -l
and delete the branches with git branch -D foo
.
If all looks ok and the tests confirm this, I add an origin, push branches and also git push --tags
.
Fin
That's all — happy migrating. Just in case: the code is BSD licensed, which means, you can do whatever you want with it.