Working with svn repo from git - git-svn


Posted:

Cloning:-

git svn clone -s -r 600 https://your-domain.com/svn/project

Using -r to do shallow copy only at that point of svn revision. This help from pulling your whole svn repo when it's quite big. Sometime I got revmap error of some kind, probably because it can't find the parent of the particular revision which is before rev 600. In this case I just specify slightly lower svn rev number and see if it go through.

cd project
git branch -a
* master
  remotes/trunk

We can see that not all our svn branches get clone so next is to actually get all the branches that have been created since rev 600 since that probably contain the branch that you want to work on.

cd project
git svn fetch
git branch -a
* master
  remotes/135-feature1
  remotes/tags/release-1.21
  remotes/trunk

Now we have all the svn branches we want to work on. Let's start checking out the branch and doing work in our local git branch:-

git checkout -b 135-feature1-svn remotes/135-feature1

Above command create a local git branch from the remotes svn branch. We put suffix -svn to the branch name to avoid git complain warning: refname '135-feature1' is ambiguous. We can now make changes in the branch and commit it just like normal git repo. Once done we may want to commit back all the changes we've made to the main svn repo.

# make changes, hack, hack
git add .
git commit -m 'new feature'
# make changes again, hack, hack
git add .
git commit -m 'fix new feature'
git svn rebase
git svn dcommit

Committing back to svn is done using the git svn dcommit command. Always make a habit to git svn rebase first before committing to make sure we always in sync with the main svn repo. There's one thing I don't really like in above situation - dcommit basically send 2 commits back to the svn repo which are 'new-feature' and 'fix new feature'. This mean dcommit always recommit or replay back your git commit to the svn repo. I'd prefer to have single commit to svn.

Can't find native way to do above so what I did is I'd never work in the '135-feature1' branch directly. Instead I create another branch from that branch where I did the real work.

git checkout -b 135-sub1 135-feature1
# hack, hack
git add .
git commit -m 'fix sub1'
# hack, hack
git add .
git commit -m 'fix sub2'
git checkout 135-feature1
git svn rebase
git merge --squash 135-sub1
git commit -m 'this commit will be send back to svn'
git svn rebase
git dcommit -n # make sure it will commit to the correct svn branch
git dcommit
git branch -d 135-sub1
Comments powered by Disqus

About me

Web developer in Malaysia. Currently work at MARIMORE Inc building internet services using Python and Django web framework.

ImportError is an error message emitted by Python when it failed to load certain module as requested by programmer. It's a very common error when someone new to the language trying it out. This website on the same theme, will try provide help for newcomers on any technologies to overcome their first hurdle.

Try most of the examples you may find here on Digital Ocean cloud service. They provide excellent VPS at a very cheaper price. Using this referral link you'll get USD10 credits upon sign up. That's enough to run single VPS with 1GB RAM for a month.

Others

I can also be found at the following sites:-

  • http://k4ml.blogspot.com/
  • http://k4ml.github.io/
  • http://metak4ml.blogspot.com/
  • http://www.mydev.my/
  • http://github.com/k4ml/

Disclaimers

The postings on this site are my own and don't necessarily represent my employer's positions, strategies or opinions.

Share