BoringLi SVN SCM

SVN source control for VS Code with reliable nested working-copy discovery and
a Git-like, color-coded changes tree that keeps SVN commit semantics.
Highlights
- Use the Webview-based Changes view in the Subversion activity bar for
status-colored file names, VS Code product icons, folder hierarchy, and
multi-repository roots.
- Select individual SVN paths for the next commit with the inline + action;
use - to return them to Changes.
- Select or unselect every visible file from the Changes or Commits group title.
- Commit only files in the transient Commits group; this is SVN commit
selection, not a Git index.
- Keep added, deleted, replaced, or missing parent folders with their selected descendants in tree view.
- Show each SCM folder on its own row by default so directory status badges remain visible.
- Keep nested, independent SVN working copies visible as separate providers.
- Hide clean working copies while continuing to monitor them for changes.
- Prepare, cancel, and submit commit messages explicitly.
- Apply the current diff block from the working-file editor.
SCM groups use consistent markers: [✓] Commits, [+] Changes,
[!] Conflicts, [≡] Changelist, and
[↓] Remote Changes.
Colored SVN Changes view
The Changes view in the Subversion activity bar is the recommended working
view. It is a theme-aware WebviewView that follows the visual structure of VS
Code Git while retaining SVN behavior. Repository roots use full-width header
rows, change-group names are genuinely bold, folders and files use VS Code
product icons, and Added, Modified, Deleted, Conflicted, and Unversioned paths
use the matching Git decoration colors. Deleted paths remain readable and are
not struck through.
Expansion state, keyboard navigation, multi-selection, inline actions, and
context menus are implemented inside the view and remain connected to the
existing SVN commands.
The view exposes the plugin's existing transient Commits group rather than
a Git Staged Changes group. Use + and - to prepare exactly which SVN
paths belong to the next commit. The check action opens the commit-message
editor with those paths and submits only that selection. Clean repositories are
not shown. The Subversion activity bar contains only this Changes view; history,
branch, and repository operations remain available through commands and menus.
The original native Source Control provider remains registered for Quick Diff,
gutter integration, and command compatibility.
Selective commit workflow
- Click + beside a changed file, the Changes group, or the repository title.
- Confirm that the intended files appear under Commits.
- Choose the check action, enter a message in the commit editor, and commit.
- Use - to return a file or the whole Commits group without committing it.
Only files in Commits are passed to SVN. A file hidden from Source Control is
therefore not selected or committed by default. When a selected file depends on
a changed parent folder (for example, an added directory), that folder moves to
Commits automatically. SVN still receives explicit, non-recursive targets, so
unselected siblings remain outside the commit.
Unversioned files and folders appear directly in Changes as Added resources.
Folders are expanded recursively so their contents participate in the normal
SCM tree. Selecting one automatically runs svn add before moving it to
Commits, so new files use the same one-click flow as existing changes. Revert
All follows the mixed Changes-group behavior used by VS Code Git: after
confirmation, versioned changes are reverted and unversioned roots are moved to
the system trash.
The extension contributes scm.compactFolders: false as a default because VS
Code hides an SCM directory resource's own status decoration when it compresses
a single-child folder chain. An explicit user or workspace setting still takes
precedence if compact folders are preferred.
The Source Control view defaults to tree mode, and nested SVN working copies
are discovered automatically up to the configured folder depth.
Prerequisites
Note: This extension leverages your machine's SVN installation,
so you need to install SVN first.
Windows
If you use TortoiseSVN, make sure the option
Command Line Tools is checked during installation and
C:\Program Files\TortoiseSVN\bin is available in PATH.
Features
Checkout
You can checkout a SVN repository with the SVN: Checkout command in the Command Palette (Ctrl+Shift+P). You will be asked for the URL of the repository and the parent directory under which to put the local repository.
- Source Control View
- Quick Diffs in gutter
- Status Bar
- Create changelists
- Add files
- Revert edits
- Remove files
- Create branches
- Switch branches
- Create patches
- Diff changes
- Commit changes/changelists
- See commit messages
Blame
Please use a dedicated extension like blamer-vs
Attribution
This extension is forked from
JohnstonCode/svn-scm 2.17.0 and is
independently maintained by BoringLi under the MIT License. The original
copyright and license notices are preserved in LICENSE.
Settings
Here are all of the extension settings with their default values. To change any of these, add the relevant Config key and value to your VSCode settings.json file. Alternatively search for the config key in the settings UI to change its value.
{
// Whether auto refreshing is enabled
"svn.autorefresh": true,
// Check empty message before commit
"svn.commit.checkEmptyMessage": true,
// Set file to status resolved after fix conflicts
"svn.conflicts.autoResolve": null,
// Encoding of svn output if the output is not utf-8. When this parameter is null, the encoding is automatically detected. Example: 'windows-1252'.
"svn.default.encoding": null,
// The default location to checkout a svn repository.
"svn.defaultCheckoutDirectory": null,
// When a file is deleted, what SVN should do? `none` - Do nothing, `prompt` - Ask the action, `remove` - automatically remove from SVN
"svn.delete.actionForDeletedFiles": "prompt" // values: ["none","prompt","remove"],
// Ignored files/rules for `svn.delete.actionForDeletedFiles`(Ex.: file.txt or **/*.txt)
"svn.delete.ignoredRulesForDeletedFiles": [],
// Controls whether to automatically detect svn externals.
"svn.detectExternals": true,
// Controls whether to automatically detect svn on ignored folders.
"svn.detectIgnored": true,
// Show diff changes using latest revision in the repository. Set false to use latest revision in local folder
"svn.diff.withHead": true,
// Whether svn is enabled
"svn.enabled": true,
// Show ordinary workspace files as planned additions when no SVN working copy is open.
"svn.previewUnversionedWorkspace": true,
// Glob patterns excluded from the unversioned workspace preview.
"svn.previewUnversionedWorkspaceExclude": ["**/.svn/**","**/.git/**","**/.hg/**","**/node_modules/**"],
// Try the experimental encoding detection
"svn.experimental.detect_encoding": null,
// Priority of encoding
"svn.experimental.encoding_priority": [],
// Url for the gravitar icon using the <AUTHOR>, <AUTHOR_MD5> and <SIZE> placeholders
"svn.gravatar.icon_url": "https://www.gravatar.com/avatar/<AUTHOR_MD5>.jpg?s=<SIZE>&d=robohash",
// Use garavatar icons in log viewers
"svn.gravatars.enabled": true,
// Ignores the warning when SVN is missing
"svn.ignoreMissingSvnWarning": null,
// List of SVN repositories to ignore.
"svn.ignoreRepositories": null,
// Ignores the warning when working copy is too old
"svn.ignoreWorkingCopyIsTooOld": null,
// Regex to detect path for 'branches' in SVN URL, 'null' to disable. Subpath use 'branches/[^/]+/([^/]+)(/.*)?' (Ex.: 'branches/...', 'versions/...')
"svn.layout.branchesRegex": "branches/([^/]+)(/.*)?",
// Regex group position for name of branch
"svn.layout.branchesRegexName": 1,
// Set true to show 'branches/<name>' and false to show only '<name>'
"svn.layout.showFullName": true,
// Regex group position for name of tag
"svn.layout.tagRegexName": 1,
// Regex to detect path for 'tags' in SVN URL, 'null' to disable. Subpath use 'tags/[^/]+/([^/]+)(/.*)?'. (Ex.: 'tags/...', 'stamps/...')
"svn.layout.tagsRegex": "tags/([^/]+)(/.*)?",
// Regex to detect path for 'trunk' in SVN URL, 'null' to disable. (Ex.: '(trunk)', '(main)')
"svn.layout.trunkRegex": "(trunk)(/.*)?",
// Regex group position for name of trunk
"svn.layout.trunkRegexName": 1,
// Number of commit messages to log
"svn.log.length": 50,
// Maximum depth to find subfolders using SVN
"svn.multipleFolders.depth": 4,
// Allow to find subfolders using SVN
"svn.multipleFolders.enabled": true,
// Folders to ignore using SVN
"svn.multipleFolders.ignore": ["**/.svn","**/.git","**/.hg","**/vendor","**/node_modules"],
// Path to the svn executable
"svn.path": null,
// Only show previous commits for a given user. Requires svn >= 1.8
"svn.previousCommitsUser": null,
// Refresh remote changes on refresh command
"svn.refresh.remoteChanges": null,
// Set the interval in seconds to check changed files on remote repository and show in statusbar. 0 to disable
"svn.remoteChanges.checkFrequency": 300,
// Show the output window when the extension starts
"svn.showOutput": null,
// Show the update message when update is run
"svn.showUpdateMessage": true,
// Set left click functionality on changes resource state
"svn.sourceControl.changesLeftClick": "open diff" // values: ["open","open diff"],
// Combine the svn external in the main if is from the same server.
"svn.sourceControl.combineExternalIfSameServer": null,
// Allow to count unversioned files in status count
"svn.sourceControl.countUnversioned": true,
// Hide unversioned files in Source Control UI
"svn.sourceControl.hideUnversioned": null,
// Ignore unversioned files like .gitignore, Configuring this will overlook the default ignore rule
"svn.sourceControl.ignore": [],
// Changelists to ignore on commit
"svn.sourceControl.ignoreOnCommit": ["ignore-on-commit"],
// Changelists to ignore on status count
"svn.sourceControl.ignoreOnStatusCount": ["ignore-on-commit"],
// Set to ignore externals definitions on update (add --ignore-externals)
"svn.update.ignoreExternals": true
}