Problem: Subversion doesn't have branches.
Subversion has directory objects, and we Humans(tm) arbitrarily decide that
some directories are "branches," thereby giving these directories (branches)
magical powers and mystical significance. Meanwhile, Subversion grinds on,
treating those magic branches as mundane directories.
You can see the effects of this problem when you change a parent directory
common to multiple branches, e.g. changing "/projectFoo/branches" to
"/projectBar/branches" will cause every "branch" in "/projectBar/branches/*" to
have a shared revision. This complicates finding branch points
(--stop-on-copy), finding the common ancestor, etc..
Are there any plans to address this issue or otherwise make branches a first
class object? Or at least add a switch to 'svn log' to skip over extraneous
"only the parent dir path changed" revisions?
Demonstration:
$ svn mkdir -m "" ^/project1/branches
Committed revision 73.
$ svn mkdir -m "" ^/project1/branches/alpha
Committed revision 74.
$ svn mkdir -m "" ^/project1/branches/beta
Committed revision 75.
$ svn log -q -v ^/project1/branches/alpha
------------------------------------------------------------------------
r74 | test | 2013-05-09 15:27:49 -0400 (Thu, 09 May 2013) | 1 line
Changed paths:
A /project1/branches/alpha
------------------------------------------------------------------------
$ svn log -q -v ^/project1/branches/beta
------------------------------------------------------------------------
r75 | test | 2013-05-09 15:27:50 -0400 (Thu, 09 May 2013)
Changed paths:
A /project1/branches/beta
------------------------------------------------------------------------
As you can see from the svn logs, the "alpha" and "beta" branches are
completely independent. They have no revisions in common.
But by renaming the parent "project1" dir to "project100", we create a linkage
between the two:
$ svn mv -m "" ^/project1 ^/project100
Committed revision 76.
$ svn log ^/project100/branches/alpha
------------------------------------------------------------------------
r76 | test | 2013-05-09 15:29:11 -0400 (Thu, 09 May 2013)
Changed paths:
D /project1
A /project100 (from /project1:75)
------------------------------------------------------------------------
r74 | test | 2013-05-09 15:27:49 -0400 (Thu, 09 May 2013)
Changed paths:
A /project1/branches/alpha
------------------------------------------------------------------------
$ svn log ^/project100/branches/beta
------------------------------------------------------------------------
r76 | test | 2013-05-09 15:29:11 -0400 (Thu, 09 May 2013)
Changed paths:
D /project1
A /project100 (from /project1:75)
------------------------------------------------------------------------
r75 | test | 2013-05-09 15:27:50 -0400 (Thu, 09 May 2013)
Changed paths:
A /project1/branches/beta
------------------------------------------------------------------------
Note that the independent branches "alpha" and "beta" now have revision 76 in
common... even though neither branch was changed.
Adding insult to injury, "svn log --stop-on-copy" will stop on revision 76,
i.e. it treats r76 as a branch point:
$ svn log --stop-on-copy -v ^/project100/branches/alpha
------------------------------------------------------------------------
r76 | test | 2013-05-09 15:29:11 -0400 (Thu, 09 May 2013)
Changed paths:
D /project1
A /project100 (from /project1:75)
------------------------------------------------------------------------
$ svn log --stop-on-copy -v ^/project100/branches/beta
------------------------------------------------------------------------
r76 | test | 2013-05-09 15:29:11 -0400 (Thu, 09 May 2013)
Changed paths:
D /project1
A /project100 (from /project1:75)
------------------------------------------------------------------------
As you can see, the "independent" alpha and beta branches now have revision 76
in common. All because Subversion doesn't have branches.
/grumble