A summary of the experimental Shelving feature added in Subversion 1.10.
Summary
This initial version of shelving is based on patch files.
Shelving is roughly equivalent to using "svn diff" to write local changes to a patch file, followed by reverting the shelved changes. Unshelving is roughly equivalent to using "svn patch" to apply a patch file.
The kinds of change that can be shelved and unshelved are the same kinds that "svn diff" and "svn patch" support – basically that is changes to text files and properties. Details are below.
Functionality
Command-Line UI
see Shelving v1 CLI
shelve name [paths/changelist]: save a WC diff
reverts the successfully shelved changes from the WC
unshelve [name]: apply specified (or newest) shelved patch to WC
removes the patch (or rather renames to '*.bak' so not shown in list)
can apply to any revision or branch
list shelved patches
delete a shelved patch
Kinds of change that can be shelved
WC State or Change | Shelving v1 |
---|---|
committable changes | |
file text, file delete/add, most properties | yes |
mergeinfo changes | yes |
copies and moves | no |
directories (mkdir/rmdir/...) | no |
binary files & properties | no |
uncommittable state | |
unresolved conflicts | no |
changelist assignment | no |
unversioned items (git stash -u/-a) | no |
inconsistent WC states (missing/obstructed) | no |
base state | |
WC base state (rev, URL, switched, depth) | no |
Conflicts and Error Handling
When 'shelve' encounters any unshelvable state ... [TODO]
When 'unshelve' encounters any conflict, it is handled just like 'svn patch'. That means, in most cases, printing a warning message and creating a '*.svnpatch.rej' file.
Implementation
- library functions implemented in libsvn_client
- not exposed through bindings (SWIG, JavaHL, etc.)
Client-level support (user interfaces):
- 'svn' command-line UI
- TortoiseSVN (for Windows)
- Cornerstone (for Mac)
Shelves are stored as standard svn patch files in WC metadata dir '.svn/shelves/'.