Subversion tracks tree structures, not just file contents.
It's one of the biggest reasons Subversion was written to
replace CVS.
Here's what this means to you, as a former CVS user:
-
The
svn add
and
svn
delete
commands work on directories now, just as
they work on files. So do
svn copy
and
svn move
. However, these commands do
not
cause any kind of immediate change
in the repository. Instead, the working items are simply
“scheduled” for addition or deletion. No
repository changes happen until you run
svn
commit
.
-
Directories aren't dumb containers anymore; they have
revision numbers like files. (Or more properly, it's
correct to talk about “directory
foo/
in revision 5”.)
Let's talk more about that last point. Directory versioning
is a hard problem; because we want to allow mixed-revision
working copies, there are some limitations on how far we can
abuse this model.
From a theoretical point of view, we define “revision
5 of directory foo
” to mean a
specific collection of directory-entries and properties. Now
suppose we start adding and removing files from
foo
, and then commit. It would be a lie
to say that we still have revision 5 of
foo
. However, if we bumped
foo
's revision number after the commit,
that would be a lie too; there may be other changes to
foo
we haven't yet received, because we
haven't updated yet.
Subversion deals with this problem by quietly tracking
committed adds and deletes in the .svn
area. When you eventually run
svn update
,
all accounts are settled with the repository, and the
directory's new revision number is set correctly.
Therefore, only after an update is it truly safe to
say that you have a “perfect” revision of a
directory.
Most of the time, your working copy will
contain “imperfect” directory revisions.
Similarly, a problem arises if you attempt to commit
property changes on a directory. Normally, the commit would
bump the working directory's local revision number. But again,
that would be a lie, because there may be adds or deletes that
the directory doesn't yet have, because no update has happened.
Therefore, you are not allowed to commit
property-changes on a directory unless the directory is
up-to-date.
For more discussion about the limitations of directory
versioning, see
the section called “Mixed Revision Working Copies”.