{"id":263,"date":"2026-10-13T05:01:31","date_gmt":"2026-10-13T05:01:31","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2010\/06\/27\/how-to-install-subversion-on-linux\/"},"modified":"2026-10-13T05:01:31","modified_gmt":"2026-10-13T05:01:31","slug":"how-to-install-subversion-on-linux","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/how-to-install-subversion-on-linux\/","title":{"rendered":"Install Subversion (SVN) on Linux: Package Install, Source Build, Apache Setup, and Authentication"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Installing <strong>Subversion (SVN)<\/strong> on Linux is easiest when you treat it as three tasks: install binaries, create a repository, and publish it over HTTP with authentication. This guide is for engineers who want a reliable server setup and a quick way to verify that users can import and check out code.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on 2010-06-27; fully revised and updated.<\/em><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2010\/06\/subversion-on-linux-install.png\" alt=\"Subversion on Linux installation process\" \/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">Choose an installation approach first<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original post built SVN from source (version 1.6.9). That still teaches the mechanics, but most teams should start with distro packages for maintainability and security updates.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Approach<\/th><th>Best for<\/th><th>Pros<\/th><th>Trade-offs<\/th><\/tr><\/thead><tbody><tr><td>Package manager (apt\/dnf\/yum\/zypper)<\/td><td>Most production servers<\/td><td>Fast install, easier updates, integrated service files<\/td><td>Version tied to distro repos<\/td><\/tr><tr><td>Build from source tarballs<\/td><td>Legacy compatibility or custom builds<\/td><td>Full control over compile options and version<\/td><td>More dependencies, harder patching\/upgrades<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">SVN server setup workflow<\/h2>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Select install method] --> B[Install Subversion binaries]\n    B --> C[Create repository with svnadmin]\n    C --> D[Configure Apache mod_dav_svn]\n    D --> E[Create auth and access files]\n    E --> F[Restart Apache]\n    F --> G[Import initial project]\n    G --> H[Checkout from client]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Install Subversion binaries<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Option A: Install from distro packages (recommended)<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Debian\/Ubuntu<\/span>\nsudo apt update\nsudo apt install -y subversion apache2 libapache2-mod-svn apache2-utils\nsudo a2enmod dav dav_svn authz_svn\nsudo systemctl restart apache2\n\n<span class=\"hljs-comment\"># RHEL\/CentOS\/Rocky\/Alma<\/span>\nsudo dnf install -y subversion httpd mod_dav_svn\nsudo systemctl enable --now httpd<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Option B: Build from source (legacy style from the original article)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The original instructions used Subversion 1.6.9 tarballs and dependency tarballs. Use this only when you specifically need source compilation.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\">mkdir -p \/usr\/local\/softwares\/svn\ncd \/usr\/local\/softwares\/svn\n\n<span class=\"hljs-comment\"># Historical URLs from the original post<\/span>\nwget http:<span class=\"hljs-comment\">\/\/subversion.tigris.org\/downloads\/subversion-1.6.9.tar.gz<\/span>\nwget http:<span class=\"hljs-comment\">\/\/subversion.tigris.org\/downloads\/subversion_deps-1.6.9.tar.gz<\/span>\n\ntar -xvzf subversion<span class=\"hljs-number\">-1.6<\/span><span class=\"hljs-number\">.9<\/span>.tar.gz\ntar -xvzf subversion_deps<span class=\"hljs-number\">-1.6<\/span><span class=\"hljs-number\">.9<\/span>.tar.gz\n\ncd subversion<span class=\"hljs-number\">-1.6<\/span><span class=\"hljs-number\">.9<\/span>\n.\/autogen.sh\n.\/configure --with-berkeley-db=\/usr\/local\/softwares\/svn\/db<span class=\"hljs-number\">-4.6<\/span><span class=\"hljs-number\">.21<\/span>\nmake\nsudo make install<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Create a repository and import initial content<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\">sudo mkdir -p \/srv\/svn\nsudo svnadmin create \/srv\/svn\/repos\n\n<span class=\"hljs-comment\"># Set ownership to your web server user:<\/span>\n<span class=\"hljs-comment\"># Debian\/Ubuntu usually uses www-data<\/span>\n<span class=\"hljs-comment\"># RHEL-family usually uses apache<\/span>\nWEB_USER=www-data\nsudo chown -R <span class=\"hljs-string\">\"$WEB_USER\"<\/span>:<span class=\"hljs-string\">\"$WEB_USER\"<\/span> \/srv\/svn\/repos\n\n<span class=\"hljs-comment\"># Initial import from a local project folder<\/span>\nsvn import -m <span class=\"hljs-string\">\"Initial import\"<\/span> \/path\/to\/project file:<span class=\"hljs-comment\">\/\/\/srv\/svn\/repos<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Publish the repository through Apache with authentication<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To serve SVN over HTTP(S), configure <strong>mod_dav_svn<\/strong>, then add user authentication and path authorization.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-apache\"><span class=\"hljs-comment\"># Example: \/etc\/httpd\/conf.d\/subversion.conf (RHEL)<\/span>\n<span class=\"hljs-comment\"># or \/etc\/apache2\/mods-available\/dav_svn.conf (Debian)<\/span>\n&lt;Location \/svn\/repos&gt;\n    DAV svn\n    SVNPath \/srv\/svn\/repos\n\n    AuthType Basic\n    AuthName <span class=\"hljs-string\">\"Subversion repository\"<\/span>\n    AuthUserFile \/etc\/svn-auth-file\n    AuthzSVNAccessFile \/etc\/svn-access-file\n    <span class=\"hljs-keyword\">Require<\/span> valid-user\n&lt;\/Location&gt;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Create first SVN user<\/span>\nsudo htpasswd -cm \/etc\/svn-auth-file test\n\n<span class=\"hljs-comment\"># Authorization rules (read\/write to all authenticated users)<\/span>\nprintf <span class=\"hljs-string\">\"&#91;\/]\\\\n* = rw\\\\n\"<\/span> | sudo tee \/etc\/svn-access-file &gt; \/dev\/<span class=\"hljs-keyword\">null<\/span>\n\n<span class=\"hljs-comment\"># Restart Apache<\/span>\nsudo systemctl restart apache2   <span class=\"hljs-comment\"># Debian\/Ubuntu<\/span>\nsudo systemctl restart httpd     <span class=\"hljs-comment\"># RHEL family<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Verify access from CLI and clients<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># List repository contents over HTTP<\/span>\nsvn <span class=\"hljs-keyword\">list<\/span> http:<span class=\"hljs-comment\">\/\/localhost\/svn\/repos --username test<\/span>\n\n<span class=\"hljs-comment\"># Checkout a working copy<\/span>\nsvn checkout http:<span class=\"hljs-comment\">\/\/localhost\/svn\/repos \/path\/to\/checkout --username test<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The original article also mentioned SmartSVN. Any modern SVN-compatible client can use the same repository URL once Apache authentication is working.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Common pitfalls and best practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Prefer distro packages unless you have a strict reason to compile from source.<\/li><li>Confirm module and service names for your distro (<em>apache2<\/em> vs <em>httpd<\/em>, module package names, config paths).<\/li><li>Use a dedicated repository path (for example, <em>\/srv\/svn<\/em>) rather than build directories.<\/li><li>Apply least privilege in <em>svn-access-file<\/em> instead of granting global write to everyone.<\/li><li>If browser access fails, check Apache logs, SELinux context, and firewall rules.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Learn how to install Subversion on Linux, create a repository, and publish it through Apache with user authentication. This revised guide includes both package-based and legacy source-build paths with practical commands.<\/p>\n","protected":false},"author":1,"featured_media":4429,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[4957],"tags":[3113,4263,4264,237,460,394,4266,4267,4268,4265,4259,395,4261,4260,4262],"class_list":["post-263","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux","tag-how-to","tag-how-to-install-svn-in-linux-step-by-step","tag-how-to-install-svn-on-linux","tag-install","tag-linux","tag-subversion","tag-subversion-installation-in-linux-guide","tag-subversion-installation-in-linux-instructions","tag-subversion-installation-in-linux-references","tag-subversion-installation-in-linux-tutorial","tag-subversion-installation-process-in-linux","tag-svn","tag-svn-configuration","tag-svn-installation-in-linux-guide","tag-svn-setup-in-linux"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/263","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=263"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/263\/revisions"}],"predecessor-version":[{"id":79091,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/263\/revisions\/79091"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4429"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=263"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=263"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=263"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}