Migrating Subversion (SVN) to Git

We decided to move from a local subversion we were using to git using Bitbucket. Why moving from svn to git is a matter of taste imho. Whatever suits you best, there would definitely be pros and cons for each. We did it cause the programmers seemed to like working with git and we didn’t want to maintain an svn ourselves.  Bitbucket vs Github is all about the cost, in the end they are both git. In our case Bitbucket was cheaper since we are a small group of developers with large amount of repos, so the pricing of Bitbucket (per developer) is just right for us.

Bitbucket offers migration through their webpage but that was no option for us because we needed our commit history intact. So we were off for alternatives. Also our svn was pretty old so we had to do some extra steps before migrating. So let’s go through them.

Step 1

Install svn to a local machine.

sudo yum install mod_dav_svn subversion

For the rest you can follow this guide up to the point of creating a testrepo. Instead of creating testrepo we are going to take our own repos from the remote svn and put them in /var/www/svn.

Step 2
On the remote server.

tar -zcvf svnbackup.tar.gz /var/www/svn

Then get this to your local svn and extract accordingly.

Step 3

Give proper user rights

chown -R apache.apache *
chcon -R -t httpd_sys_rw_content_t /var/www/svn/*

And then goto your backuped svn folders and perform and svnadmin upgrade like this

 svnadmin upgrade /var/www/svn/myproject 

Step 4

Get a list of the authors so our commits get linked to them. Using this trick.

svn log --quiet http://localhost/svn/myproject \
| grep '^r' | awk '{print $3}' | sort | uniq > authors.txt

Step 5

Now the rest is simple using this guide.

git svn clone http://localhost/svn/svn.myrepo/ -A authors.txt my_repo
git init --bare my_bare_repo
cd my_bare_repo
git symbolic-ref HEAD refs/heads/trunk
cd ../my_repo
git remote add bare ../my_bare_repo
git config remote.bare.push 'refs/remotes/*:refs/heads/*'
git push bare
cd ../my_bare_repo
git branch -m git-svn master
git remote add origin https://me@bitbucket.org/me/myrepo.git
git push origin master

Bumps and how you can manage them!

    1. After git svn clone you end up with this error
fatal: refs/remotes/trunk: not a valid SHA1
update-ref HEAD refs/remotes/trunk: command returned error: 128

In most cases the below should do the job. Else do a git branch -a see your remotes and set master to follow one of them.

 git update-ref refs/heads/master refs/remotes/git-svn 

#bitbucket, #git-2, #github, #migration, #svn-2

Git: Cherry-picking from another repository

Quite often when working with an android kernel there would be some nifty commits you’d wish to add to your local repo. So here is the way to do it.

In my case i am working on the Huawei kernel for G300 which involves the msm7627a chipset. So let’s patch it a bit with some commits from Code Aurora Forum (CAF).

Firstly let’s fetch our project locally

git clone https://github.com/ezeteze/android_kernel_huawei_u8815 g300-kernel

Okey now let’s add our remote branch and fetch.

git remote add msm  git://codeaurora.org/kernel/msm.git

git fetch

Cool! Now git branch -a should show your branches and all the remote tracking branches. You are now ready! You can either cherry-pick your commits or if you are brave enough do a full merge, which will probably result in ^n conflicts!

Let’s try out a cherry-pick

akis@localhost:~/kernel/huawei/u8815$ git cherry-pick 4e17bc5b7846448344c262c89ce769f756864b62
[detached HEAD 7ce9f8c] msm: qdsp6v2: Reduce the step size of soft volume and soft pause.
Author: Deepa Madiregama <dmadireg@codeaurora.org>
2 files changed, 8 insertions(+), 2 deletions(-)

Success! Happy cherry-picking! 🙂

#android, #cherry-pick, #cherry-picking, #code-aurora-forum, #github, #kernel, #msm