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.