FAQ

.. snip

You keep saying "svn doesn't support branches" yet I use branches
every day. While there is no way to "list branches" it would be
possible. I think the current implementation records the parent path
in the branch, but not vice versa... I assume svn doesn't do this
because it would be a change to the parent path and the svn design
avoids modifying the repository on its own.
There are two definitions of branches; svn's definition of a branch (i.e. a dir)
and the high-level definition of a branch (theory.) The reason why svn doesn't
"support branches" is because a svn branch is just a dir, a dir that is only a
branch because it is given special meaning by Humans. Internally, svn doesn't
know or care if a dir is a branch or not.

The distinction is important because one of the theoretical benefits of
branching is isolation. An outside change shouldn't affect the branch's
contents. Unfortunately, changing the parent path of a branch injects a
spurious revision into 'svn log' and causes 'svn log --stop-on-copy' to stop early.
This is detailed in my original email that started this thread.
True but doesn't the log of ^/projectname1/trunk also change when you commit something to ^/projectname2/trunk ?? Projects aren't isolated within the same repo either.



So when people say that svn doesn't have branches, they are saying that
a) svn has directory objects, not branch objects, i.e. a svn branch is a branch by
human convention only,
b) svn dirs lack the special protections expected of branches (e.g. being isolated
from outside change),
c) svn dirs lack the special abilities expected of branches, such as computing
ancestry reliably.

Fortunately, in practice, "dirs-as-branches" works fine for the most part and any
limitations tend to be minor.

While there is no way to "list branches" it would be possible.
No-ish. In the average case, "list branches" is easy. Just iteratively run 'log --
stop-on-copy'. However, there are edge cases that prevent "list branches" from
being deterministic or otherwise make determining ancestry complicated.

For example, is this a rename (to fix a misspelling) or a case where someone
combined two steps: 1) creating a new branch and 2) deleting an obsolete
branch?
svn copy branches/ofo-1.0 branches/foo-1.0
svn rm branches/ofo-1.0
svn ci
... creates revision 100 ...

If I want to find the start of the branch, I run 'svn log --stop-on-copy
^/branches/foo-1.0' which will stop on revision 100. However, svn can't tell me
if rev 100 is the start of the branch or whether it's just a spelling fix (in which
case I need to run 'svn log --stop-on-copy' again.) Hopefully, the Human who
created rev 100 provided a meaningful commit message.

Search Discussions

Discussion Posts

Previous

Follow ups

Related Discussions

People

Translate

site design / logo © 2021 Grokbase