Sven - Subversion
{
"sven.auth.commandTimeout": 60,
"sven.auth.credentialMode": "auto" // values: ["auto","systemKeyring","extensionStorage","prompt"],
"sven.autorefresh": true,
"sven.blame.autoBlame": true,
"sven.blame.dateFormat": "relative" // values: ["relative","absolute"],
"sven.blame.enableLogs": true,
"sven.blame.enabled": true,
// Date format for gutter annotations
"sven.blame.gutter.dateFormat": "relative" // values: ["relative","absolute"],
"sven.blame.gutter.enabled": true,
// Show colored revision icons in gutter
"sven.blame.gutter.showIcons": true,
// Show author/revision/date text in gutter (verbose)
"sven.blame.gutter.showText": null,
"sven.blame.gutter.template": "${author} (${revision}) ${date}",
// Only show inline annotation on current line (cursor position)
"sven.blame.inline.currentLineOnly": true,
"sven.blame.inline.enabled": true,
// Opacity of inline annotations (0.0 = invisible, 1.0 = solid)
"sven.blame.inline.opacity": 0.5,
"sven.blame.inline.showMessage": null,
"sven.blame.inline.template": " ${author}, ${date} (r${revision}) • ${message}",
// Line count threshold for large file warning (0 to disable)
"sven.blame.largeFileLimit": 3000,
// Show warning before blaming files exceeding line limit
"sven.blame.largeFileWarning": true,
// Highlight uncommitted changes in blame view
"sven.blame.showWorkingCopyChanges": true,
// Show blame info for current line in status bar
"sven.blame.statusBar.enabled": true,
"sven.blame.statusBar.template": "$(person) ${author}, $(clock) ${date} - ${message}",
"sven.commit.autoUpdate": "both" // values: ["both","before","after","none"],
// Select all staged files by default when committing
"sven.commit.changes.selectedAll": true,
// Warn before committing with empty message
"sven.commit.checkEmptyMessage": true,
"sven.commit.conventionalCommits": true,
"sven.commit.useQuickPick": true,
"sven.conflicts.autoResolve": null,
"sven.debug.disableSanitization": null,
"sven.decorator.baseColor": "charts.blue" // values: ["charts.blue","charts.purple","charts.green","charts.yellow","charts.orange","charts.red","editorInfo.foreground","editorWarning.foreground"],
"sven.decorator.serverColor": "charts.orange" // values: ["charts.orange","charts.yellow","charts.red","charts.purple","charts.blue","charts.green","editorWarning.foreground","editorInfo.foreground"],
"sven.default.encoding": null,
// Default folder for new checkouts
"sven.defaultCheckoutDirectory": null,
// Action when tracked files are deleted in Explorer
"sven.delete.actionForDeletedFiles": "remove" // values: ["none","prompt","remove"],
"sven.delete.ignoredRulesForDeletedFiles": [],
// Automatically detect and show svn:externals
"sven.detectExternals": true,
// Scan ignored folders for SVN repositories
"sven.detectIgnored": true,
"sven.diff.tool": null,
"sven.diff.withHead": true,
// Experimental: Auto-detect output encoding
"sven.experimental.detect_encoding": null,
// Encoding detection priority order
"sven.experimental.encoding_priority": [],
// Suppress warning when SVN executable not found
"sven.ignoreMissingSvnWarning": null,
"sven.ignoreRepositories": null,
// Suppress warning when working copy needs upgrade
"sven.ignoreWorkingCopyIsTooOld": null,
"sven.layout.branchesRegex": "branches/([^/]+)(/.*)?",
// Regex capture group for branch name
"sven.layout.branchesRegexName": 1,
"sven.layout.showFullName": true,
// Regex capture group for tag name
"sven.layout.tagRegexName": 1,
"sven.layout.tagsRegex": "tags/([^/]+)(/.*)?",
"sven.layout.trunkRegex": "(trunk)(/.*)?",
// Regex capture group for trunk name
"sven.layout.trunkRegexName": 1,
// Show colored dots for different authors in history view
"sven.log.authorColors": true,
"sven.log.length": 50,
// Maximum folder depth to scan for SVN repositories
"sven.multipleFolders.depth": 4,
"sven.multipleFolders.enabled": null,
// Folders to skip when scanning for SVN repositories
"sven.multipleFolders.ignore": ["**/.git","**/.hg","**/vendor","**/node_modules"],
// Auth mode logging frequency in output panel
"sven.output.authLogging": "once" // values: ["once","always","never"],
"sven.path": null,
"sven.performance.maxXmlTags": 500000,
"sven.previousCommitsUser": null,
// Include remote changes check when running Refresh command
"sven.refresh.remoteChanges": null,
"sven.remoteChanges.checkFrequency": 300,
// Show SVN output panel on extension start
"sven.showOutput": null,
// Show notification after update completes
"sven.showUpdateMessage": true,
"sven.sourceControl.changesLeftClick": "open diff" // values: ["open","open diff"],
// Show externals in main repository if from the same server
"sven.sourceControl.combineExternalIfSameServer": null,
// Include unversioned files in the badge count
"sven.sourceControl.countUnversioned": true,
// Hide unversioned files from Source Control view
"sven.sourceControl.hideUnversioned": null,
"sven.sourceControl.ignore": [],
// Changelists to exclude from commit operations
"sven.sourceControl.ignoreOnCommit": ["ignore-on-commit"],
// Changelists to exclude from badge count
"sven.sourceControl.ignoreOnStatusCount": ["ignore-on-commit"],
"sven.sparse.confirmExclude": true,
// Timeout for download operations (minutes). Increase for large folders.
"sven.sparse.downloadTimeoutMinutes": 10,
"sven.sparse.largeFileWarningMb": 10,
// Timeout for folder size estimation (seconds)
"sven.sparse.preScanTimeoutSeconds": 30,
"sven.update.ignoreExternals": true
}
Sven - Subversion for VS Code & Positron

Note: This extension is currently in active development. While stable for daily use, expect occasional breaking changes. Please report any issues to help improve the extension.
Git-like SVN experience with staging, inline blame, file locking, and sparse checkout. Zero telemetry.
Requires: SVN installed. Windows users: enable Command Line Tools when installing TortoiseSVN.
Why Sven?
| Pain Point |
Sven Solution |
| SVN has no staging |
Git-like stage → commit workflow |
| "Who wrote this line?" |
Inline blame annotations (GitLens-style) |
| Binary file conflicts |
File locking with visual indicators |
| Giant repos are slow |
Sparse checkout - download only what you need |
| Clunky diff tools |
Beyond Compare, Meld, any external tool |
Quick Start
Open existing repo: File → Open Folder → select folder with .svn
Checkout new repo: Ctrl+Shift+P → SVN: Checkout → enter URL → choose folder
Daily workflow:
1. Make changes → Files appear in "Changes"
2. Click + to stage → Files move to "Staged"
3. Ctrl+Enter → Commit staged files
Features
Staging
Stage files before commit - no more accidental commits.
| Action |
How |
| Stage |
+ button or right-click |
| Unstage |
- button |
| Commit |
Ctrl+Enter |
Blame Annotations
See who changed each line, when, and why.
- Gutter: Colored revision indicators
- Inline: Author + date at line end
- Hover: Full commit message
Toggle: Ctrl+Shift+P → SVN: Toggle Annotations
Repository History
Browse commits with file changes and diffs.
- Repo History view: Full commit log with filtering (author, date, text)
- File History view: Per-file revisions (right-click file → Show Log)
- B badge: Your BASE revision
- Explorer rename/delete auto-converts to
svn move/svn delete (preserves history)
File Locking
Prevent conflicts on binary files (CSVs, images, models).
| Badge |
Meaning |
K |
Locked by you |
O |
Locked by someone else |
L |
Needs lock (read-only) |
Setup: right-click file → Set Needs-Lock Property
Commands: Lock, Unlock, Manage Locks, Break Lock
Full locking guide →
Sparse Checkout
Download only specific folders from large repos.
- Open Selective Download panel in SCM sidebar
- Click ghost folders to download
- Choose depth: Full, Shallow, Files Only, Empty
How To
| Task |
How |
| Compare with server |
Right-click → Open Changes with HEAD |
| Resolve conflicts |
Fix markers in file → right-click → Resolve |
| Switch branches |
Ctrl+Shift+P → SVN: Switch Branch |
| Create patch |
Right-click files → Show Changes (Patch) |
| Set line endings |
Right-click → Set Line Ending Style (EOL) |
| Ignore files |
Right-click → Add to Ignore List |
| External diff |
Set sven.diff.tool to tool path |
| Merge branches |
Ctrl+Shift+P → SVN: Merge |
| Cleanup |
Ctrl+Shift+P → SVN: Cleanup |
Configuration
Settings
Open Settings (Ctrl+,) and search sven.
| Setting |
Default |
What it does |
sven.blame.autoBlame |
true |
Show blame when opening files |
sven.commit.autoUpdate |
none |
Run update before/after commit |
sven.diff.tool |
null |
External diff tool path |
sven.remoteChanges.checkFrequency |
300 |
Remote check interval (seconds) |
sven.sourceControl.hideUnversioned |
false |
Hide unversioned files |
sven.log.length |
50 |
Commits shown in history |
All 70+ settings →
Troubleshooting
"SVN not found" → Set sven.path to full SVN path (e.g., /usr/bin/svn)
Password prompts loop → Set sven.auth.credentialMode to extensionStorage, restart
Slow on large repos → Enable sparse checkout, reduce sven.log.length
Full troubleshooting →
More Info
Positron IDE: Works automatically with Connections pane integration.
Links:
Settings ·
Security ·
File Locking ·
Privacy ·
Contributing ·
Changelog ·
Issues
Forked from JohnstonCode/svn-scm