Published in Articles on by Michiel van Oosterhout ~ 6 min read
Subversion is the has-been of version control systems. At one point it was very popular, but its popularity waned after Git became mainstream, due in large part to GitHub's rise in popularity. But Subversion still has its place, so let's see if we can automate the installation of the Subversion command-line client for Windows.
Finding a suitable binary distribution
Subversion is a project of the Apache Software Foundation, famous for its web server. Many Apache projects do not distribute binary packages, and the Apache Subversion project is the same:
The Apache Subversion project does not officially endorse or maintain any binary packages of the Subversion software.
Luckily there are 3rd-party binary distributions for Windows, but they vary quite widely in the way they package the command-line client.
- TortoiseSVN
A visual client first and foremost (integrated directly with Windows Explorer), but the installer can install the command-line client as well. - VisualSVN
A Subversion server for Windows and a client that integrates with Visual Studio. They distribute the Subversion command-line client for Windows as a stand-alone zip file. - Slik
Provides commercial Subversion hosting, and distributes the Subversion command-line client for Windows as a stand-alone zip file.
Of these, VisualSVN and Slik are commercial entities that support Subversion because it is in their best interest, whereas TortoiseSVN is an open-source (GPL) project, active for many years and with lots of contributors. Both TortoiseSVN and Slik have created a winget
package, but only TortoiseSVN's winget
package supports ARM64.
Installing TortoiseSVN
The TortoiseSVN installer contained in the winget
package is an MSI package. These type of packages are supported by the Windows Installer service, and executed using msiexec
. We can execute msiexec /?
to see the available parameters:

msiexec
's command-line parameters
As we saw in Installing Git on Windows, winget
supports certain types of installers, and MSI package is one of the supported types. Supported means that some of winget
s parameters, such as --silent
, are mapped onto parameters of the installer.
But when we use the --override
parameter then winget
does not map any other parameters to the installer's. So if we need --override
then we need to take full control of all the installer parameters. For an MSI package that means passing --override="/quiet /norestart"
.
Selecting the features to install
An MSI package may contain multiple features, and each feature consists of one more components. Querying MSI packages shows how to query the database contained in an MSI package to list all the features and components.
When we know the features contained in the MSI package, we can select the features using the ADDLOCAL
parameter. For TortoiseSVN, the features contained in TortoiseSVN-1.14.5.29465-ARM64-svn-1.14.2
are as follows:
DefaultFeature
: TortoiseSVNF_OVL
: Tortoise Overlay handlerMoreIcons
: Additional icon setsCLI
: Command-line client toolsUDiffAssoc
: Register diff/patch filesDictionaryENGB
: English (GB) dictionaryDictionaryENUS
: English (US) dictionary
Installing via winget
The Windows PowerShell script below invokes winget
to install TortoiseSVN. This script must be run from an elevated prompt.
# Define parameters for the installer
$msiParameters = @{
quiet = $true
norestart = $true
}
$msiFeatures = @(
"DefaultFeature"
"F_OVL"
"CLI"
)
# Map parameters to tokens for the command line
$parameters = $msiParameters.GetEnumerator() | ForEach-Object {
"/$($_.Key)"
}
$parameters += "ADDLOCAL=$([string]::Join(",", $msiFeatures))"
$override = [string]::Join(" ", $parameters)
# Install Git for Windows
& winget install TortoiseSVN.TortoiseSVN -s winget --accept-source-agreements --override "$override"
The CLI
feature is the Subversion command-line client, and installing this feature add the bin
directory to the PATH
environment variable.

Configuring via Windows Registry
While the Subversion command-line client on Windows stores its settings in $Env:AppData\Subversion\config
, TortoiseSVN stores its settings in the Windows Registry, under the HKCU:\Software\TortoiseSVN
, TortoiseOverlays
, and TortoiseMerge
keys.
The Windows PowerShell script below configures TortoiseSVN (and the included TortoiseMerge program) via the Windows Registry.
# Declare the registry values to set per key
$keys = @(
@{
Name = "TortoiseSVN"
Values = @(
@{ Name = "ContextMenuEntries"; Value = 0; DisplayName = "No items in main context menu" }
@{ Name = "HideMenusForUnversionedItems"; Value = $true; DisplayName = "Hide menus for unversioned paths" }
@{ Name = "LogFontName"; Value = "Cascadia Mono"; DisplayName = "Font for log messages: Cascadia Mono" }
@{ Name = "LogFontSize"; Value = 9; DisplayName = "Font size for log messages: 9" }
@{ Name = "LogDateFormat"; Value = $true; DisplayName = "Short date/time format in log messages" }
@{ Name = "UseSystemLocaleForDates"; Value = $true; DisplayName = "Use system locale for date/time" }
@{ Name = "AutoClose"; Value = 0; DisplayName = "Autoclose: Close manually" }
@{ Name = "DriveMaskRemovable"; Value = $true; DisplayName = "Show icon overlays for removable drives" }
@{ Name = "UnversionedAsModified"; Value = $true; DisplayName = "Unversioned files mark parent folder as modified" }
@{ Name = "BlameFontName"; Value = "Cascadia Mono"; DisplayName = "TortoiseBlame font: Cascadia Mono" }
@{ Name = "BlameFontSize"; Value = 9; DisplayName = "TortoiseBlame font size: 9" }
@{ Name = "UDiffFontName"; Value = "Cascadia Mono"; DisplayName = "TortoiseUDiff font: Cascadia Mono" }
@{ Name = "UDiffFontSize"; Value = 9; DisplayName = "TortoiseUDiff font size: 9" }
@{ Name = "CleanupRefreshShell"; Value = $true; DisplayName = "Refresh shell overlays as part of clean up operation" }
)
}
@{
Name = "TortoiseOverlays"
Values = @(
@{ Name = "ShowIgnoredOverlay"; Value = $false; DisplayName = "Disable 'ignored' overlay handler" }
)
}
@{
Name = "TortoiseMerge"
Values = @(
@{ Name = "FontName"; Value = "Cascadia Mono"; DisplayName = "TortoiseMerge font: Cascadia Mono" }
@{ Name = "FontSize"; Value = 9; DisplayName = "TortoiseMerge font size: 9" }
)
}
)
$keys | ForEach-Object {
# Ensure the registry key exists
$path = "HKCU:\Software\$($_.Name)"
if (-not (Test-Path -Path $path))
{
$key = New-Item -Force -ItemType Directory -Path $path
}
# Force the (re)creation of the registry values
$_.Values | ForEach-Object {
$displayName = $_.DisplayName
$name = $_.Name
$type = "DWord"
$value = $_.Value
if ($value -is [bool])
{
$value = [int]$value
}
elseif ($value -is [string])
{
$type = "String"
}
Write-Host "Setting [$displayName]..." -NoNewline
$value = New-ItemProperty -Force -Name $name -Path $path -PropertyType $type -Value $value
Write-Host " OK"
}
}
A note about overlay handlers
When you go to the TortoiseSVN settings page for overlay handlers, you may see this warning:
There are currently 10 overlay handlers installed besides the ones Tortoise uses. TortoiseSVN will not be able to show the following overlays: Unversioned, Needs-lock, Ignored, Locked.
On a typical Windows 11 installation, there may be multiple overlay handlers registered for OneDrive. Other software, such as Dropbox, also registers overlay handlers (see this list of well-known overlay handlers). As indicated by the warning above, the number of overlay handlers that can be installed (e.g. 'active' in Windows Explorer) is limited, so you may want to remove some other overlay handlers. Since OneDrive adopts the cloud files API introduced in Windows 10 version 1709, it seems we can safely unregister its overlay handlers.
(This Windows PowerShell script requires an elevated Windows PowerShell session.)
# Unregister the OneDrive overlay handlers
$path = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers"
Get-ChildItem $path | ForEach-Object {
if ($_.Name.Contains("OneDrive"))
{
Remove-Item $_.Name.Replace("HKEY_LOCAL_MACHINE", "HKLM:") -Force
}
}
Summary
The download and installation of the Subversion command-line client for Windows can be fully automated using winget
, if we use the package for TortoiseSVN, an open-source graphical Windows client, and select the CLI
feature. Since the installer is an MSI package, we have some control over the features that get installed. For configuration, we had to make some changes to the registry.