[Bioperl-l] bioperl-dev or branch?

Robert Buels rmb32 at cornell.edu
Fri May 22 07:30:42 UTC 2009


Mark A. Jensen wrote:
> Maybe the solution here is what you cjf have been suggesting lately, that
> the trunk is your friend, and that frequent and fearless branching+merging
> needs to become part of the Modern BioPerl Way.

Never any need for fear when you have version control.  Once it's in the 
repository, everything is completely reversible, completely recoverable.

Actually, junk lying around a developer's working copy is the most 
frequent source of pain.  For example, somebody moves a dir in the 
repository, you update your working copy, and your uncommitted changes 
are attempting to sit on top of something somebody else has moved out 
from under you, and you have to move your local changes out of the way 
and then put them back in the right (new) place, and it's a pain.

A couple of techniques for avoiding things like this:

1.) As much as possible, try to keep your working copy clean and make 
your commits both small and atomic, meaning each commit you make should 
strive to be a self-contained change that works and stands alone.  This 
is especially important if you are working on the trunk, where changes 
might be coming in often and some of them could be major.  I find it 
useful to run 'svn diff' on the set of changes I'm about to commit, to 
make sure they make sense in and of themselves.  Also, by following this 
rule, not only do you avoid problems in your working copy but you also 
help ensure that the svn HEAD is not very broken at any given time.

2.) If you find it increasingly hard to satisfy rule 1, that is a good 
indication that you are making a lot of changes, and should be working 
on a branch.  If you get to the point where you realize this and have 
heretofore managed to follow rule 1, then you can actually just make 
yourself a branch and switch to it right to your own branch right then 
and there, even with your uncommitted changes still in your working copy:

svn cp svn+ssh://.../trunk svn+ssh://.../branches/mybrokenstuff
svn switch svn+ssh://.../branches/mybrokenstuff

and poof, there you are, you are now sitting on a checkout of that 
branch, and the changes that you have sitting in your working copy are 
still there, and you can commit whatever you want, and it won't affect 
anybody else.  You should still strive to hew to rule 1 though, it just 
makes things nicer all around.

"But what about when you have to merge your stuff back into trunk?" You 
say?  People sometimes make rather too much of 'the difficulty of 
merging back into trunk'.  If you are working on different things from 
other people, the merge is likely to come off without a hitch.  If there 
are conflicts, they are usually minor textual differences that can be 
resolved easily.  If two developers are actually working on the same 
thing, they should probably be on the same branch, or at least merge 
their work into one of their branches before merging that one back into 
trunk.

All this branching and merging is a little more cumbersome with svn than 
with more recent tools, though, because only the very latest versions of 
svn (1.5 and above I think) actually have support for tracking exactly 
which revisions of a branch need to be merged at any given time. 
Because of this, if you're doing a big long-lived branch in which you 
are tracking changes from the trunk (the most common case), or 
periodically sending changes to the trunk and keeping the branch, or 
both, it's a good idea to use an additional tool to help track exactly 
which revisions you have already merged in each direction, like 
svnmerge.py, svk, or git + git-svn (listed in increasing order of 
sophistication).  I've only ever used svnmerge.py, cause I'm still a 
relatively new at this version control stuff.  I'm working on learning 
git and git-svn though.  :-)

Rob





More information about the Bioperl-l mailing list