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

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 Repository
- File → Open Folder → select folder with
.svn
- SVN panel appears in Source Control sidebar
Checkout New Repository
Ctrl+Shift+P → SVN: Checkout
- Enter repository URL
- Choose local folder
Daily Workflow
1. Make changes → Files appear in "Changes"
2. Click + to stage → Files move to "Staged"
3. Ctrl+Enter → Commit staged files
Key Features
Staging (Git-like)
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
File Locking
Prevent conflicts on binary files (CSVs, images, models).
| Command |
Use Case |
| Lock |
Claim exclusive edit rights |
| Unlock |
Release when done |
| Break Lock |
Admin override |
Visual: 🔒 = locked, 🔓 = needs lock (read-only)
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
Repository History
Browse commits with file changes, diffs, and filtering.
- B badge = your BASE revision
- ↻ Refresh / ↓ Fetch / ↓↓ Pull
- Filter by author, date, text
Smart Operations
Explorer actions auto-convert to SVN commands:
- Rename →
svn move (preserves history)
- Delete →
svn delete (proper removal)
Essential Settings
Open Settings (Ctrl+,) and search sven.
| Setting |
Default |
What it does |
sven.blame.autoBlame |
true |
Show blame when opening files |
sven.commit.conventionalCommits |
false |
Conventional commit format |
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 →
Common Tasks
Compare with server
Right-click file → Open Changes with HEAD
Resolve conflicts
- Fix conflict 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 file → Set Line Ending Style (EOL)
Troubleshooting
"SVN not found"
- Set
sven.path to full SVN path (e.g., /usr/bin/svn)
Password prompts loop
- Try
sven.auth.credentialMode: extensionStorage
- Then restart extension host
Slow on large repos
- Enable sparse checkout
- Reduce
sven.log.length
Full troubleshooting →
Positron IDE
Works automatically in Positron:
- Connections pane integration
- Optimized for data science workflows
- All operations local (zero telemetry)
Links
Credit: Forked from JohnstonCode/svn-scm