views:

456

answers:

4

So I'm using git and interacting with an svn repo.

I have a svn TRUNK that looks like this:

A-B-C-D

And a svn bug_fixes branch that branches off at commit B or C:

 -c-d-e-f-g-h-i

Now I need to get the cdefghi commits that are in my svn branch back into the master branch.

I'm aware that I could just do a squashed commit, let's call it squash SQUASH (which would contain cdefghi), but then it seems like I would have to kill the bug_fixes branch and start a new branch to cleanly continue.

Here: http://blog.red-bean.com/sussman/?p=92 they suggest:

checkout the branch.

merge master's changes into the branch.

Checkout the master.

merge --reintegrate the branch's changes onto master.

Continue development.

Unfortunately, git-svn doesn't seem to recognize any "merge --reintegrate" command for svn.

So how do I cleanly make branch and master have all commits, so that development on both can continue, using git-svn's commands?

A: 

The Caveats section of the git-svn documentation warns

For the sake of simplicity and interoperating with a less-capable system (SVN), it is recommended that all git svn users clone, fetch and dcommit directly from the SVN server, and avoid all git clone/pull/merge/push operations between git repositories and branches.

The author does provide a recommendation:

The recommended method of exchanging code between git branches and users is git format-patch and git am, or just dcommiting to the SVN repository.

Adapting to your situation

git format-patch --stdout c^..i >my.patch
git reset --hard trunk
git am <my.patch

where c and i are appropriate identifiers for the commits in your history.

Greg Bacon
This allows me to apply all the commits to the trunk, but doesn't allow me to continue developing on the branch. Unfortunately, since svn has a linear revision history it seems that the recommended course of action is actually to merge the branch in to trunk, then delete the branch and create one of the same name.
Tchalvak
+1  A: 

Would this not be a good case for rebasing your local stuff (<branchpoint>..i) onto the new master fetched from SVN?

ndim
That works well in git, but not with svn's linear revision history.
Tchalvak
That works well in git, but not with svn's linear revision history. So you can get the changes from branch to trunk, but continuing development on the branch afterwards is apparently futile.
Tchalvak
A: 

Ok, so a few approaches that I found:

git checkout your_branch
git rebase master
git checkout master
git merge your_branch

or

git checkout your_branch
git rebase master
git checkout master
git merge --squash your_branch

or

git checkout your_branch
git rebase master
git checkout master
git rebase -i your_branch

And then after all that.

git svn dcommit (to commit to master)
git branch -D your_branch

Then (from svn because git-svn doesn't support deletion) delete the branch, and recreate it from trunk and start the cycle all over again.

Tchalvak
A: 

If you dcommit a merge it automatically squashes it into 1 commit. Sadly it does not internally use svn:mergeinfo or --reintegrate as it should, so you lose the association with the branch created via 'git svn branch'.

Bryan Drewery