SVN: Can you remove directories from a local checkout only (not from the repository)?

Svn

Svn Problem Overview


Assume that you have a directory under subversion control, that contains some files and tons of subdirectories, like that:

file1.txt
file2.txt
file3.txt
dir1/
dir2/
dir3/
dir4/
:
dirXX/

Now you need the files and some of the dirs, but not all of them. This can be done with SVN. Just make the checkout non-recursive:

svn checkout -N <URL>

This checks out only the first directory and the files inside. No subdirectories are included. Even if you go into the checkout directory and run a "svn up", it will only update the files checked out previously, it will not add the directories. You can now selectively add the directories you need by explicitly updating those. E.g. if you need dir2 and dir4 only, you can go into the checkout directory and execute

svn up dir2
svn up dir4

If you run a generic "svn up" in the future, it will only update the files and those two directories, it will not add any of the other directories.

Now the problem: What if I decide at any later point that I don't need dir2 any longer? How do I get rid of it? There seems no way of doing so, other than deleting the whole checkout and start over from scratch.

When you just delete dir2, the next "svn up" will bring it back, as "svn status" of course shows it as missing now ("!" in front of its name). Running a "svn remove" will remove it of course, but on next commit it will also remove it from the repository, which must not happen.

Even the new sparse directory ("shallow checkout") feature of SVN 1.5 is of no use here:

> Subversion 1.5's implementation of > shallow checkouts is good but does not > support a couple of interesting > behaviors. First, you cannot > de-telescope a working copy item. > Running svn update --set-depth empty > in an infinite-depth working copy will > not have the effect of discarding > everything but the topmost > directory—it will simply error out. >
- http://svnbook.red-bean.com/en/1.5/svn.advanced.sparsedirs.html

Is this complete impossible with SVN? Anyone ever came up with a clever work-a-round to that?

Just creating the checkout directory (without SVN) and then checking out the individual subdirectories from the repository directly as subdirectories to this directory will work for the directories: now every directory is a checkout of its own, can be updated and once not needed any longer, you can just delete it. However, how do I get the files then (e.g. file1.txt)? SVN does not allow to checkout individual files, you can only checkout whole directories.

Svn Solutions


Solution 1 - Svn

What I'm trying to do cannot be done with Subversion 1.4 or Subversion 1.5; Period.
No work around exists, that's just the way it is.

It can be done with Subversion 1.6, though.

Unlike SVN 1.5, SVN 1.6 can reduce the depth on a directory

svn up --set-depth exclude dir2

is the solution. It sets the depth for dir2 to zero and it will immediately vanish from the checkout and no update will bring it back, unless you explicitly set the depth of this directory to a value again (or just do an update on it without depth option, since not giving any depth always means infinity, unless you use non-recursive, which means "files").

TIP:
Actually SVN 1.6 cannot really reduce the depth the same way it can increase it. You can increase it from any level to any higher level. You can only reduce it to "exclude" (the lowest level of all). If you want to reduce from "infinity" (highest) to "files" (somewhere in the middle), you must first reduce it to "exclude" (causing the directory to vanish) and then increase it back again to "files". This is a bit of a hack, but it works just nice.

Solution 2 - Svn

For anyone who comes across this later, and uses TortoiseSVN, here is how to do the same thing...

  1. Right-click on the folder that you no longer want checked out (this is the folder you want to exclude)
  2. From the context menu, choose "TortoiseSVN > Update to Revision..."
  3. In the window that pops up, set the "Update Depth" dropdown box to "Exclude"
  4. Click "OK". SVN will automatically remove that directory from your drive now.

(Note: This was done with TortoiseSVN 1.7.5, and may vary for other versions.)

Solution 3 - Svn

Update: I'm running SVN 1.6.11 and I was able to de-telescope using svn up --set-depth empty dir rather that having to exclude the directory.

Solution 4 - Svn

With svn 1.6, --set-depth is the answer.

With svn < 1.6, you can get sparse checkouts by abusing svn switch: Create an empty directory somewhere in your repository, and switch the subdirectories you don't need right now to point to that instead of their "real" URL.

Solution 5 - Svn

You can try this trick involving a local repository and svn:externals declarations.

Haven't tried it myself, though.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMeckiView Question on Stackoverflow
Solution 1 - SvnMeckiView Answer on Stackoverflow
Solution 2 - SvnCodingWithSpikeView Answer on Stackoverflow
Solution 3 - SvnleogerView Answer on Stackoverflow
Solution 4 - SvnslowdogView Answer on Stackoverflow
Solution 5 - Svnpetr k.View Answer on Stackoverflow