How to create an efficient "blacklist" style sparse checkout?

20 views
Skip to first unread message

Chris E.

unread,
Mar 19, 2025, 2:01:29 PMMar 19
to TortoiseSVN
Hello,

I am trying to figure out a generic step-by-step procedure for efficient spare checkouts. There are two approaches to sparse checkouts: blacklist and whitelist.

To explain the difference, assume the following repository structure:

/trunk
/trunk/A
/trunk/B
/trunk/C

where I am not interested in checking out the folder "A".

Whitelist means "Only checkout B and C". Blacklist means "Do not checkout A". Initially, both looks the same. But when a new folder /trunk/D is added, and you updated your working copy afterwards, it shouldn't appear for whitelist, since D was not part of the whitelist, but it should appear for blacklist, since D is not part of the blacklist.

Whitelist was quite trivial to get to work:
Checkout /trunk with depth = empty
Update /trunk/B with sticky depth = infinity
Update /trunk/C with sticky depth = infinity

I can also get blacklist to work like this:
Checkout /trunk with depth = infinity
Update /trunk/A with sticky depth = exclude

But here's the problem: I wanted to exclude /trunk/A precisely because it is huge in size; I don't want to wait for it on checkout. But the above approach creates a full checkout at first, only to throw away A afterwards. Not very efficient.

Alas so far I have failed to find a different routine that avoids having to download A in its entirety. Here's what I tried:

Attempt 1:
Checkout /trunk with depth = empty
Update /trunk/A with depth = empty
Update /trunk/A with sticky depth = exclude
Update /trunk with depth = infinity
Result: trunk remains empty.

Attempt 2:
Checkout /trunk with depth = empty
Update /trunk/A with depth = empty
Update /trunk/A with sticky depth = exclude
Update /trunk with sticky depth = infinity
Result: this overrides "exclude" for A, restores it and downloads its content

Attempt 3:
Checkout /trunk with depth = children
Update /trunk/A with sticky depth = exclude
Update /trunk with depth = unknown
Result: trunk is populated, but B and C remain empty since they were checked out with  depth = empty

Is there any way I can change trunk's depth to "sticky infinity" but at the same time retain A's depth  = exclude?

Thank you
Chris
Reply all
Reply to author
Forward
0 new messages