{"id":288,"date":"2026-10-13T09:11:28","date_gmt":"2026-10-13T09:11:28","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2010\/11\/26\/subversions-components\/"},"modified":"2026-10-13T09:11:28","modified_gmt":"2026-10-13T09:11:28","slug":"subversions-components","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/subversions-components\/","title":{"rendered":"Subversion Components Explained: What Each SVN Tool Does and When to Use It"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Originally published on 2010-11-26; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Subversion includes more than just the <code>svn<\/code> client binary. If you are developing, administering repositories, or setting up network access, knowing which component to use prevents mistakes and speeds up troubleshooting. This guide explains the core Subversion components, how they fit together, and the commands you are most likely to run.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2010\/11\/subversions-components.png\" alt=\"Subversion components overview\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Subversion components at a glance<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original post listed the primary binaries and modules commonly installed with Subversion. The table below summarizes what each one is for.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Component<\/th><th>Type<\/th><th>Primary purpose<\/th><\/tr><\/thead><tbody><tr><td><code>svn<\/code><\/td><td>Client CLI<\/td><td>Day-to-day version control operations from a working copy<\/td><\/tr><tr><td><code>svnversion<\/code><\/td><td>Client utility<\/td><td>Reports working copy revision state<\/td><\/tr><tr><td><code>svnlook<\/code><\/td><td>Repository inspection utility<\/td><td>Reads repository data directly (no working copy required)<\/td><\/tr><tr><td><code>svnadmin<\/code><\/td><td>Repository admin utility<\/td><td>Creates, maintains, backs up, and repairs repositories<\/td><\/tr><tr><td><code>mod_dav_svn<\/code><\/td><td>Apache module<\/td><td>Publishes repositories over HTTP or HTTPS<\/td><\/tr><tr><td><code>svnserve<\/code><\/td><td>Server daemon<\/td><td>Publishes repositories using the Subversion network protocol<\/td><\/tr><tr><td><code>svndumpfilter<\/code><\/td><td>Stream utility<\/td><td>Filters repository dump streams by path<\/td><\/tr><tr><td><code>svnsync<\/code><\/td><td>Replication utility<\/td><td>Incrementally mirrors one repository to another<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">How these components fit together<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In a typical setup, developers use client commands, repositories are served via Apache or <code>svnserve<\/code>, and admin tools handle backup, inspection, and replication.<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart LR\n    Dev[Developer] --> Cli[svn client]\n    Cli -->|https| Apache[Apache mod_dav_svn]\n    Cli -->|svn or svn+ssh| Serve[svnserve]\n    Apache --> Repo[(Subversion repository)]\n    Serve --> Repo\n    Look[svnlook] --> Repo\n    Admin[svnadmin] --> Repo\n    Repo --> Dump[Repository dump]\n    Dump --> Filter[svndumpfilter]\n    Repo --> Mirror[svnsync job]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Client and inspection commands you will run most often<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">These examples cover common developer and read-only inspection tasks. Adjust repository URLs and filesystem paths to your environment.<\/p>\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\"># Working copy operations<\/span>\nsvn checkout https:<span class=\"hljs-comment\">\/\/svn.example.com\/svn\/project project-wc<\/span>\ncd project-wc\nsvn update\nsvn status\nsvnversion .\n\n<span class=\"hljs-comment\"># Repository inspection without checkout<\/span>\nsvnlook youngest \/srv\/svn\/project\nsvnlook tree \/srv\/svn\/project | head<\/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<h2 class=\"wp-block-heading\">Administration, dump filtering, and mirroring<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use administrative tools directly on repository storage paths or repository URLs, not inside a working copy. For mirroring with <code>svnsync<\/code>, destination-side hook setup is typically required before synchronization.<\/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\"><span class=\"hljs-comment\"># Create and back up a repository<\/span>\nsvnadmin create \/srv\/svn\/project\nsvnadmin hotcopy \/srv\/svn\/project \/backups\/project-hotcopy\nsvnadmin dump \/srv\/svn\/project &gt; \/backups\/project.dump\n\n<span class=\"hljs-comment\"># Filter paths from a dump stream<\/span>\nsvndumpfilter <span class=\"hljs-keyword\">include<\/span> trunk branches\/team-a &lt; \/backups\/project.dump &gt; \/backups\/project-filtered.dump\n\n<span class=\"hljs-comment\"># Initialize and run a mirror<\/span>\nsvnsync init file:<span class=\"hljs-comment\">\/\/\/srv\/svn\/project-mirror https:\/\/svn.example.com\/svn\/project<\/span>\nsvnsync sync file:<span class=\"hljs-comment\">\/\/\/srv\/svn\/project-mirror<\/span><\/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\">Serving repositories: Apache module vs svnserve<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Option<\/th><th>Protocol and URL style<\/th><th>Strengths<\/th><th>Trade-offs<\/th><\/tr><\/thead><tbody><tr><td><code>mod_dav_svn<\/code> with Apache<\/td><td>HTTP or HTTPS<br\/>Example: <code>https:\/\/svn.example.com\/svn\/project<\/code><\/td><td>Works with Apache ecosystem (TLS termination, auth modules, reverse proxies)<\/td><td>More moving parts to configure and maintain<\/td><\/tr><tr><td><code>svnserve<\/code> daemon<\/td><td>svn protocol<br\/>Example: <code>svn:\/\/svn.example.com\/project<\/code><\/td><td>Lightweight and straightforward deployment<\/td><td>Different auth and transport model than web-based access<\/td><\/tr><tr><td><code>svnserve<\/code> via SSH tunnel<\/td><td>svn+ssh protocol<br\/>Example: <code>svn+ssh:\/\/alice@svn.example.com\/project<\/code><\/td><td>Uses SSH accounts and encrypted transport<\/td><td>Operational model depends on SSH account management<\/td><\/tr><\/tbody><\/table><\/figure>\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\"><span class=\"hljs-comment\"># Start svnserve as a daemon, rooted at \/srv\/svn<\/span>\nsvnserve -d -r \/srv\/svn<\/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\">Common pitfalls<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Running <code>svnadmin<\/code> or other repository-admin commands against a working copy path instead of repository storage.<\/li><li>Assuming <code>svnversion<\/code> is the same as a single global repository revision; mixed-revision working copies can report ranges or flags.<\/li><li>Editing repository internals directly instead of using supported tools such as <code>svnadmin<\/code> and <code>svnlook<\/code>.<\/li><li>Setting up <code>svnsync<\/code> without destination-side hook prerequisites.<\/li><li>Choosing an access method without planning authentication, authorization, and transport security requirements.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Subversion ships with multiple command-line tools and server modules, each designed for a specific repository task. This updated guide maps the components, shows how they work together, and provides practical command examples.<\/p>\n","protected":false},"author":1,"featured_media":4346,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[23],"tags":[246,4064,4069,394,4062,4063,395,4061,4065,4068,4071,4067,4070,4072,4066],"class_list":["post-288","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-svnsubversion","tag-components","tag-introduction-of-svn-components","tag-mod_dav_svn","tag-subversion","tag-subversion-components-overview","tag-subversion-different-component-introduction","tag-svn","tag-svn-components","tag-svn-components-list","tag-svnadmin","tag-svndumpfilter","tag-svnlook","tag-svnserve","tag-svnsync","tag-svnversion"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/288","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=288"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/288\/revisions"}],"predecessor-version":[{"id":79125,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/288\/revisions\/79125"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4346"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=288"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=288"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=288"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}