Digital Peak had all of it's Joomla extension code in Subversion repositories, as it was state of the art a couple of years ago. Nowadays Git is widly used under PHP developers and also Joomla itself stores it's code on Github. It was time for us to move to Git. Now we store our public code on Github and the private code on Bitbucket. As I'm a total newbie with Git, probably some steps can be made simpler but the migration explained below worked for us and I hope it will be of help for others too.
If you are not interested in the code histroy then just create a new Git repository and copy the most actual code, probably th SVN trunk to it. But we were interested in the full commit history so here are the steps to migrate your Subversion repository to to Git on an Ubuntu machine.
Setup the system
Install the needed packages from the Ubuntu:
$ sudo apt-get install git-core git-svn
$ sudo apt-get install subversion.
$ mkdir git
$ cd git/
Migrate the commiters
Subversion has a simple authoring system on the otherside Git uses the convention Name <email>. To convert the authors from Subversion to Git format perform the following steps:
$ svn log -q https://mysvnrepo.com/reponame | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors.txt
Then you have manually to adapt the file authors.txt to the new usernames. For example
laoneo = laoneo <laoneo>
becomes
laoneo = Lao Neo <laoneo@digital-peak.com>
Make the clone
This is the step where your SVN repository gets converted to the Git repository:
$ git svn clone https://mysvnrepo.com/reponame/ --no-metadata -A authors.txt --stdlayout
Depending on your repository size it can take a while, but you should see on the screen step by step how each commit gets converted.
New bare repository
We create a new bare repository where the migrated repository gets merged into.
$ git init --bare new-repo
$ cd new-repo/
$ git symbolic-ref HEAD refs/heads/trunk
Push orig to the new one.
$ cd ../dpcalendar
$ git remote add bare ../new-repo/
$ git config remote.bare.push 'refs/remotes/*:refs/heads/*'
$ git push bare
Cleanup
Now we have to do some cleanup before we can push it to one of the online repositories. First we have to rename trunk to master.
$ cd ../new-repo/
$ git branch -m trunk master
The git svn command creates from the tags branches, means we have to create from them git tags and then delete the branches.
$ 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
If you need to cleanup some invalid tags then do it now.
$ git tag -d Archive
Final push
If there doesn't need to be done more work on code we can push it to the online repository (if you want you can do ssh key exchange before).
$ git remote add origin https://github.com/Digital-Peak/GCalendar.git
$ git push --all
$ git push --tags
Now we are done!!