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 ...