Suppose you have an idea and you are eager to try it. You don't want to create a branch in Subversion because you don't know if your idea will work out, and committing all your crazy stuff in Subversion can easily pollute it. So you create a local Git branch and start working.
$ git checkout -b topic/great-idea
You code, test, git-add, git-commit, code, test, etc. At some point you see that your idea was great indeed and it's time to show the amazing results to your teammates. Now you need to "push" your Git branch to Subversion. To do this you have to create Subversion brunch first
$ svn copy http://svn.repo.path/project-name/trunk \
http://svn.repo.path/project-name/branches/great-idea \
-m "Created branch for my cool stuff"
Next step is to add this Subversion branch as a remote branch to Git configuration. Open .git/config file with a text editor. You should see something like this
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[svn-remote "svn"]
url = http://svn.repo.path
fetch = project-name/trunk:refs/remotes/trunk
If you built your Git repository by cloning Subversion repository (which you most likely did), you will have one or more svn-remote sections in this configuration file. You need to add another one for new Subversion branch.
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[svn-remote "svn"]
url = http://svn.repo.path
fetch = project-name/trunk:refs/remotes/trunk
[svn-remote "svn-great-idea"]
url = http://svn.repo.path
fetch = project-name/branches/great-idea:refs/remotes/great-idea
Next step is to fetch Subversion branch, but first you need to know revision number when this branch was created. Run this command
$ svn log --stop-on-copy http://svn.repo.path/project-name/branches/great-idea
You should get something like this:
------------------------------------------------------------------------
r2165 | andy | 2009-07-03 14:36:59 -0400 (Fri, 03 Jul 2009) | 1 line
Created branch for my cool stuff
------------------------------------------------------------------------
The first number of the output is what we are looking for:
$ git svn fetch svn-great-idea -r2165
Now you have the Subversion branch in you Git. If you run git branch -a command you will see "great-idea" branch in the list.
master
* topic/great-idea
great-idea
trunk
You shouldn't work on remote branch, so let's create local one:
$ git branch svn-branch/great-idea remotes/great-idea
I put it in svn-branch namespace just to make it visually clear that this branch is in synch with Subversion. The next set of commands is a standard way to bring your work from one local branch to another. In our case: from initial topic/great-idea to svn-branch/great-idea
$ git rebase svn-branch/great-idea
$ git checkout svn-branch/great-idea
$ git rebase topic/great-idea
That's it. Now you are ready to commit your code to Subversion:
$ git svn dcommit
Done. As an option, you can delete initial branch because you have a Subversion backed copy of it:
$ git branch -D topic/great-idea
Resources
• Ian Boston's post explaining how to add Subversion branches to Git.
No comments:
Post a Comment