- You are supposed to work on a svn branch
- You hate svn.
- You want to follow changes of svn trunk.
- You hate the merging in svn.
- You already checked out the svn repository with git-svn-clone with stdlayout option.
First you make a local git branch
topic that'll sync with svn
$ git checkout -b topic topic
Then you work on the branch, including
git-commit a lot. Before
you go home you push the changes into the main svn repository by
You sometimes have to see the changes in trunk.
$ git checkout master $ git svn rebase
And merges the changes into your topic branch.
$ git checkout topic $ git merge --no-ff master
You know that merge without
--no-ff option breaks git-svn system
so you did
Finally you finished all your work on the topic branch and tried to merge the changes into trunk.
$ git checkout master $ git merge --no-ff topic
That causes a lot of conflicts that you have to resolve manually.
The "Wrong way" example had two failures.
- ambiguous name of topic
- merge from trunk to topic
The first one is not fatal but annoying. Every time you run a git command with specifying a branch name shows a warning message that your local git branch name is ambiguous. You should have make a local git branch in which name is different to the svn branch.
$ git checkout -b tpc topic
Next. You are not supposed to merge changes in trunk to topic branch that will be merged to trunk. That causes a lot of conflicts.
The solution is that you create another local git branch that doesn't sync svn branch directly.
$ git checkout -b t tpc
Instead of trying to merge from master to t, try to rebase from master to t. Regard the tpc branch for very temporary one.
$ git checkout master $ git svn rebase $ git checkout t $ git rebase master $ git checkout tpc $ git svn dcommit $ svn delete `git svn info --url` $ git checkout t $ git branch -d -r topic $ git branch -D tpc $ git svn branch topic $ git checkout -b tpc topic
Note that this approach make the svn repository log messy. Be resigned; that's the subversion.