{"id":62,"date":"2007-01-28T05:58:29","date_gmt":"2007-01-28T13:58:29","guid":{"rendered":"http:\/\/jaredrobinson.com\/blog\/?p=62"},"modified":"2007-01-28T05:58:29","modified_gmt":"2007-01-28T13:58:29","slug":"whats-happening-with-version-control-systems","status":"publish","type":"post","link":"https:\/\/jaredrobinson.com\/blog\/whats-happening-with-version-control-systems\/","title":{"rendered":"What&#8217;s happening with Version Control Systems?"},"content":{"rendered":"<p>\nI&#8217;ve long had an interest in <a href=\"http:\/\/en.wikipedia.org\/wiki\/Revision_control\">version control systems<\/a> (VCS), also known<br \/>\nas source code management (SCM) systems &#8212; beginning with RCS, SCCS and<br \/>\nCVS. <a href=\"http:\/\/www.nongnu.org\/cvs\/\">CVS<\/a><br \/>\nwas already showing it&#8217;s age when I started using it in 1998. When the<br \/>\ncompany I worked for, Axent, was acquired by Symantec in 2000, we switched to<br \/>\nusing <a href=\"http:\/\/www.perforce.com\">Perforce<\/a>. At first, I<br \/>\nthought Perforce was a step backwards from CVS. After using it heavily<br \/>\nfor a few months, it was clear that CVS and <a href=\"http:\/\/www.wincvs.org\/\">WinCVS<\/a><br \/>\ndidn&#8217;t come close to the ease-of-use and features of Perforce and<br \/>\np4win. CVS was dreadfully slow compared to Perforce, which was<br \/>\nlightning fast (and still is).<\/p>\n<p>\nPerforce encourages third-party developers to develop add-ons for use<br \/>\nwith their software, which is almost as good as what you get with an<br \/>\nactive open-source project. Alough Perforce is proprietary, it&#8217;s about as open<br \/>\nas I&#8217;ve ever seen a commercial project. It runs on many platforms, has<br \/>\nconversion scripts to migrate CVS repositories to Perforce, etc. It&#8217;s not<br \/>\ncheap, unless you&#8217;re working on an open-source project, in which case, you can<br \/>\nget free licenses to use it.<\/p>\n<p>\nAt some point, I heard about the <a href=\"http:\/\/subversion.tigris.org\">Subversion<\/a><br \/>\nproject, which aimed to correct many of the deficiencies of CVS. Those<br \/>\nwere the pre-1.0 days, and it was interesting to watch the development<br \/>\nof Subversion.<\/p>\n<p>\nAbout the same time, <a href=\"http:\/\/en.wikipedia.org\/wiki\/BitKeeper\">Bitkeeper<\/a> was in the news. It was different than CVS, Subversion and Perforce because it was a <span style=\"font-style: italic;\">distributed<\/span><br \/>\nversion control system. The idea appealed to me because of the<br \/>\nidea that a developer could have version control for his\/her private<br \/>\nchanges without having to check-in to the main repository until they<br \/>\nwere ready. At that time, there weren&#8217;t any mature open-source<br \/>\ndistributed version control systems to investigate.<\/p>\n<p>\nI switched jobs late in 2004, and my new company was using Subversion.<br \/>\nOverall, I have been very pleased with Subversion in day-to-day use.<br \/>\nIt&#8217;s much better than CVS. We had some reliability problems with the<br \/>\nSubversion server. It was running on Windows with the BDB database<br \/>\nstorage back-end. When it was switched to a Linux server with the FSFS<br \/>\nback-end, it became much more reliable. My team uses <a href=\"http:\/\/tortoisesvn.tigris.org\/\">TortiseSVN<\/a> &#8212; an<br \/>\nexcellent user interface that integrates with Windows Explorer.<\/p>\n<p>\nI&#8217;ve periodically kept tabs on version control systems. Many open-source variants have sprung up over the last few years: <a href=\"http:\/\/en.wikipedia.org\/wiki\/Mercurial_%28software%29\">Mercurial<\/a>, <a href=\"http:\/\/en.wikipedia.org\/wiki\/Bazaar_%28software%29\">Bazaar-NG<\/a>, <a href=\"http:\/\/en.wikipedia.org\/wiki\/Git_%28software%29\">Git<\/a>\/<a href=\"http:\/\/en.wikipedia.org\/wiki\/Cogito_%28software%29\">Cogito<\/a>, <a href=\"http:\/\/en.wikipedia.org\/wiki\/Darcs\">Darcs<\/a>, <a href=\"http:\/\/en.wikipedia.org\/wiki\/SVK\">SVK<\/a>, <a href=\"http:\/\/en.wikipedia.org\/wiki\/GNU_arch\">Arch<\/a> and <a href=\"http:\/\/en.wikipedia.org\/wiki\/Monotone_%28software%29\">Monotone<\/a>.<br \/>\nLately though, I haven&#8217;t seen any great reviews on which ones are the<br \/>\nmost mature, or what the pros and cons are of each. So, I&#8217;ve done some<br \/>\ngoogle research to figure it out, focusing primarily on the distributed<br \/>\nvariants.<\/p>\n<p>\nThe conclusion I&#8217;ve come to is that the developers of each version<br \/>\ncontrol system are learning from the developers of the other version<br \/>\ncontrol systems, and each project is improving. The Subversion developers are<br \/>\nlearning from the distributed version control developers. Recently, there was<br \/>\nan <a href=\"http:\/\/svn-dev.blogspot.com\">SVN developer summit<\/a> and they tried out Mercurial, which tells me that there&#8217;s merit to the distributed approach.<\/p>\n<p>\nIf you&#8217;re already using a modern version control system, the cost to<br \/>\nswitch may outweight the benefit. Organizations seem to be able to<br \/>\ncope with legacy tools like Visual SourceSafe and CVS, although better tools<br \/>\ncan make developer&#8217;s lives easier.<\/p>\n<p>\nHere&#8217;s my own highly subjective comparison table. I&#8217;ve marked, in red, some of the things<br \/>\nI think are noteworthy. I focused my efforts on the compeitors that<br \/>\nseem to have garnered the most community adoption. I&#8217;ve included one<br \/>\ncommercial system, Perforce. Each item is rated on a scale of 1 to 10, 10 being the best. (Update: There&#8217;s a better table than mine at <a href=\"http:\/\/bazaar-vcs.org\/RcsComparisons\">http:\/\/bazaar-vcs.org\/RcsComparisons<\/a> and various comparisons at <a href=\"http:\/\/en.wikipedia.org\/wiki\/Comparison_of_revision_control_software\">Wikipedia<\/a>)<\/p>\n<p>\n<big>Comparison of Source Code Management systems<\/big><\/p>\n<table border=\"1\" style=\"border-collapse: collapse\" bordercolor=\"#111111\">\n<tbody>\n<tr valign=\"bottom\">\n<td>January 31, 2007\n      <\/td>\n<td><a href=\"http:\/\/subversion.tigris.org\"><b>Subversion<\/b><\/a><\/td>\n<td><a href=\"http:\/\/svk.bestpractical.com\/\"><b>SVK<\/b><\/a><\/td>\n<td><b><a href=\"http:\/\/git.or.cz\/\">Git<\/a>\/<a href=\"http:\/\/kernel.org\/pub\/software\/scm\/cogito\/\">Cogito<\/a><\/b><\/td>\n<td><a href=\"http:\/\/www.selenic.com\/mercurial\/\"><b>Mercurial<\/b><\/a><\/td>\n<td><a href=\"http:\/\/bazaar-vcs.org\/\"><b>Bazaar-NG<\/b><\/a><\/td>\n<td><a href=\"http:\/\/abridgegame.org\/darcs\/\"><b>Darcs<\/b><\/a><\/td>\n<td><a href=\"http:\/\/www.perforce.com\/\"><b>Perforce<\/b><\/a><\/td>\n<td style=\"text-align: left;\"><b>Notes<\/b><\/td>\n<\/tr>\n<tr>\n<td>Command-line name<\/td>\n<td>svn<\/td>\n<td>svk<\/td>\n<td>git \/ cg<\/td>\n<td>hg<\/td>\n<td>bzr<\/td>\n<td>darcs<\/td>\n<td>p4<\/td>\n<td><\/td>\n<\/tr>\n<tr valign=\"bottom\">\n<td style=\"color: rgb(204, 0, 0);\"><b>Cross-Platform<\/b><\/font><\/td>\n<td style=\"font-weight: bold; color: rgb(204, 0, 0);\" align=\"right\">10<\/font><\/td>\n<td style=\"font-weight: bold; color: rgb(204, 0, 0);\" align=\"right\">9<\/font><\/td>\n<td align=\"right\"><span style=\"font-family: Sans;\">6<\/span><\/td>\n<td style=\"font-weight: bold; color: rgb(204, 0, 0);\" align=\"right\">10<\/font><\/td>\n<td style=\"font-weight: bold; color: rgb(204, 0, 0);\" align=\"right\">10<\/font><\/td>\n<td style=\"font-weight: bold; color: rgb(204, 0, 0);\" align=\"right\">9<\/font><\/td>\n<td style=\"font-weight: bold; color: rgb(204, 0, 0);\" align=\"right\">10<\/font><\/td>\n<td>Windows, Linux, Mac, Solaris, etc.<\/td>\n<\/tr>\n<tr valign=\"bottom\">\n<td><b>Maturity<\/b><\/td>\n<td align=\"right\">9<\/td>\n<td align=\"right\">6<\/td>\n<td align=\"right\">8<\/td>\n<td align=\"right\">7<\/td>\n<td align=\"right\">5<\/td>\n<td align=\"right\">8<\/td>\n<td align=\"right\">10<\/td>\n<td>Maturity based on lifetime, and project flux in code<\/td>\n<\/tr>\n<tr valign=\"bottom\">\n<td><b>Maturity: GUI<\/b><\/td>\n<td style=\"font-weight: bold; color: rgb(204, 0, 0);\" align=\"right\">9<\/font><\/td>\n<td align=\"right\">0<\/td>\n<td align=\"right\">5<\/td>\n<td align=\"right\">4<\/td>\n<td align=\"right\">3<\/td>\n<td align=\"right\">1<\/td>\n<td align=\"right\">10<\/td>\n<td align=\"right\"><\/td>\n<\/tr>\n<tr valign=\"bottom\">\n<td style=\"color: rgb(204, 0, 0);\"><b>Disconnected\/offline operation<\/b><\/font><\/td>\n<td align=\"right\">2<\/td>\n<td align=\"right\">10<\/td>\n<td style=\"color: rgb(204, 0, 0); font-weight: bold;\" align=\"right\">10<\/font><\/td>\n<td style=\"color: rgb(204, 0, 0); font-weight: bold;\" align=\"right\">10<\/font><\/td>\n<td style=\"color: rgb(204, 0, 0); font-weight: bold;\" align=\"right\">10<\/font><\/td>\n<td style=\"color: rgb(204, 0, 0); font-weight: bold;\" align=\"right\">10<\/font><\/td>\n<td align=\"right\">0<\/td>\n<td>Disconnected 1. editing of files, 2. branching, 3. merging, 4. history, etc. Especially handy when there&#8217;s no network connectivity, such as when on an airplane.<\/td>\n<\/tr>\n<tr valign=\"bottom\">\n<td style=\"color: rgb(204, 0, 0);\"><b>Community Adoption<\/b><\/font><\/td>\n<td style=\"font-weight: bold; color: rgb(204, 0, 0);\" align=\"right\">10<\/font><\/td>\n<td align=\"right\">2<\/td>\n<td style=\"font-weight: bold; color: rgb(204, 0, 0);\" align=\"right\">8<\/font><\/td>\n<td align=\"right\">7<\/td>\n<td align=\"right\">5<\/td>\n<td align=\"right\">2<\/td>\n<td align=\"right\">1<\/td>\n<td align=\"right\"><\/td>\n<\/tr>\n<tr valign=\"bottom\">\n<td><b>Documentation Quality<\/b><\/td>\n<td align=\"right\">10<\/td>\n<td align=\"right\">7<\/td>\n<td align=\"right\">7<\/td>\n<td align=\"right\">8<\/td>\n<td align=\"right\">6<\/td>\n<td align=\"right\">8<\/td>\n<td align=\"right\">10<\/td>\n<td align=\"right\"><\/td>\n<\/tr>\n<tr valign=\"bottom\">\n<td><b>Storage Format: Robustness<\/b><\/td>\n<td align=\"right\">5<\/td>\n<td align=\"right\">5<\/td>\n<td style=\"color: rgb(204, 0, 0); font-weight: bold;\" align=\"right\">10<\/font><\/td>\n<td align=\"right\">8<\/td>\n<td align=\"right\">7<\/td>\n<td align=\"right\">5<\/td>\n<td align=\"right\">5<\/td>\n<td style=\"text-align: left;\">Storage format least susceptible to corruption.<\/td>\n<\/tr>\n<tr valign=\"bottom\">\n<td><b>Storage Format: Not in flux<\/b><\/td>\n<td align=\"right\">1<\/td>\n<td align=\"right\">1<\/td>\n<td style=\"color: rgb(204, 0, 0); font-weight: bold;\" align=\"right\">10<\/font><\/td>\n<td align=\"right\">8<\/td>\n<td align=\"right\">1<\/td>\n<td align=\"right\">1<\/td>\n<td align=\"right\">?<\/td>\n<td align=\"right\"><\/td>\n<\/tr>\n<tr valign=\"bottom\">\n<td><b>(re)Merging support<\/b><\/td>\n<td align=\"right\">0<\/td>\n<td style=\"font-weight: bold; color: rgb(204, 0, 0);\" align=\"right\">9<\/font><\/td>\n<td style=\"font-weight: bold; color: rgb(204, 0, 0);\" align=\"right\">9<\/font><\/td>\n<td style=\"font-weight: bold; color: rgb(204, 0, 0);\" align=\"right\">9<\/font><\/td>\n<td style=\"font-weight: bold; color: rgb(204, 0, 0);\" align=\"right\">9<\/font><\/td>\n<td style=\"font-weight: bold; color: rgb(204, 0, 0);\" align=\"right\">10<\/font><\/td>\n<td align=\"right\">4<\/td>\n<td>Remembers prior merges, cherry-picking, etc.<\/td>\n<\/tr>\n<tr valign=\"bottom\">\n<td><b>Repository Size<\/b><\/td>\n<td align=\"right\">1<\/td>\n<td align=\"right\">9<\/td>\n<td align=\"right\">10<\/td>\n<td align=\"right\">9<\/td>\n<td align=\"right\">?<\/td>\n<td align=\"right\">?<\/td>\n<td align=\"right\">?<\/td>\n<td align=\"right\"><\/td>\n<\/tr>\n<tr valign=\"bottom\">\n<td><b>Speed<\/b><\/td>\n<td align=\"right\">2<\/td>\n<td style=\"font-weight: bold; color: rgb(204, 0, 0);\" align=\"right\">7<\/font><\/td>\n<td style=\"font-weight: bold; color: rgb(204, 0, 0);\" align=\"right\">10<\/font><\/td>\n<td style=\"font-weight: bold; color: rgb(204, 0, 0);\" align=\"right\">8<\/font><\/td>\n<td align=\"right\">6<\/td>\n<td align=\"right\"><\/td>\n<td style=\"font-weight: bold; color: rgb(204, 0, 0);\" align=\"right\">10<\/font><\/td>\n<td align=\"right\"><\/td>\n<\/tr>\n<tr valign=\"bottom\">\n<td><b>Scalability<\/b><\/td>\n<td align=\"right\">9<\/td>\n<td align=\"right\">9<\/td>\n<td align=\"right\">10<\/td>\n<td align=\"right\">9<\/td>\n<td align=\"right\">5<\/td>\n<td align=\"right\">5<\/td>\n<td align=\"right\">9<\/td>\n<td align=\"right\"><\/td>\n<\/tr>\n<tr valign=\"bottom\">\n<td><b>Commercial Backing<\/b><\/td>\n<td align=\"right\">10<\/td>\n<td align=\"right\">5<\/td>\n<td align=\"right\">10<\/td>\n<td align=\"right\">10<\/td>\n<td align=\"right\">10<\/td>\n<td align=\"right\">5<\/td>\n<td align=\"right\">10<\/td>\n<td align=\"right\"><\/td>\n<\/tr>\n<tr valign=\"bottom\">\n<td><b>Subversion Integration<\/b><\/td>\n<td align=\"right\">10<\/td>\n<td align=\"right\">8<\/td>\n<td align=\"right\">6<\/td>\n<td align=\"right\">5<\/td>\n<td align=\"right\">4<\/td>\n<td align=\"right\">4<\/td>\n<td align=\"right\">?<\/td>\n<td><i><a href=\"http:\/\/www.darcs.net\/DarcsWiki\/Tailor\">Tailor<\/a> can be used to migrate changes between all systems<\/i>\n      <\/td>\n<\/tr>\n<tr valign=\"bottom\">\n<td><b>Totals:<\/b><\/td>\n<td align=\"right\"><b>88 <\/b><\/td>\n<td align=\"right\"><b>87 <\/b><\/td>\n<td align=\"right\"><b>119<\/b><\/td>\n<td align=\"right\"><b>112<\/b><\/td>\n<td align=\"right\"><b>81 <\/b><\/td>\n<td align=\"right\"><b>68 <\/b><\/td>\n<td align=\"right\"><b>79 <\/b><\/td>\n<td align=\"right\"><b>   <\/b><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\nIf I were to pick a VCS system today, it would probably be Git, followed by Mercurial. What follows are my unpolished notes and ideas.\n<\/p>\n<p>\n<span style=\"font-weight: bold;\">Git\/Cogito<\/span><\/p>\n<p>\nGit is very scalable, and is<br \/>\nthe <span style=\"font-style: italic;\">fastest<\/span><br \/>\nopen-source version control system available. Git has a wide community<br \/>\nof professional engineers supporting it, and it has a bright<br \/>\nfuture. There are graphical user interfaces available for Git such as<br \/>\n<a href=\"http:\/\/www.kernel.org\/pub\/software\/scm\/git\/docs\/gitk.html\">gitk<\/a> and <a href=\"http:\/\/sourceforge.net\/projects\/qgit\">qgit<\/a>, although none of them are as mature as the user interfaces available for Subversion. <a href=\"http:\/\/kernel.org\/pub\/software\/scm\/cogito\/\">Cogito<\/a> is the easy-to-use command-line wrapper around git. See also the <a href=\"http:\/\/git.or.cz\/cogito\/\">Cogito Wiki<\/a>.<br \/>\nAccording to Keith Packard of xorg fame, Git has the <a href=\"http:\/\/keithp.com\/blog\/Repository_Formats_Matter.html\">most<br \/>\nrobust\/reliable repository storage format<\/a>. Advantages of git and all distributed VCSes include 1. offline repository access, 2.<br \/>\nprivate branches, 3. distributed backups including change history.<\/p>\n<p>\nFor those wishing to use Git\/Cogito on Windows, use <a href=\"http:\/\/www.cygwin.com\/\">Cygwin<\/a> and select the git and\/or cogito packages and read the information at <a href=\"http:\/\/git.or.cz\/gitwiki\/WindowsInstall\">http:\/\/git.or.cz\/gitwiki\/WindowsInstall<\/a>. For those organizations wishing for excellent Windows-Explorer integration, use <a href=\"http:\/\/git.or.cz\/gitwiki\/InterfacesFrontendsAndTools#git-cvsserver\">git-cvsserver<\/a> in combination with <a href=\"http:\/\/www.tortoisecvs.org\/\">TortiseCVS.<\/a><\/p>\n<p>\nTo install git and cogito on Fedora, run the following as root:<br \/>\n<code>&nbsp;&nbsp;yum install git cogito qgit<\/code><\/p>\n<p>\nI&#8217;ve reluctantly decided that Git isn&#8217;t as mature as Subversion, which<br \/>\nshouldn&#8217;t be surprising because Subversion has been around for longer. Git<br \/>\nisn&#8217;t the right fit for all projects. Git was designed for <em>monolithic<\/em> code<br \/>\nbases, not for <em>modular<\/em> code bases, although work is in progress to allow it to<br \/>\nsupport <a href=\"http:\/\/git.or.cz\/gitwiki\/SubprojectSupport\">sub projects<\/a><br \/>\n(similar to <a href=\"http:\/\/svnbook.red-bean.com\/en\/1.1\/ch07s04.html\">svn:externals<\/a>).<br \/>\n&#8220;Such flexibility is an implicit feature of centralized SCMs, but is much more<br \/>\ndifficult to implement in a distributed system like git.  As a result, git<br \/>\ncurrently lacks built-in subproject support, although gitweb does have a notion<br \/>\nof subprojects.&#8221;\n<\/p>\n<p>\nThere&#8217;s a document that describes <a href=\"http:\/\/git.or.cz\/gitwiki\/GitCommonMistakes\">Common Mistakes made when using Git<\/a>. Unfortunately, most of it isn&#8217;t written yet &#8212; there&#8217;s only a loose outline.<\/p>\n<p>\nTutorials:<\/p>\n<ul>\n<li><a href=\"http:\/\/wellington.pm.org\/archive\/200510\/git\/\">http:\/\/wellington.pm.org\/archive\/200510\/git\/<\/a><\/li>\n<li>Crash course for CVS users: <a href=\"http:\/\/git.or.cz\/course\/cvs.html\">http:\/\/git.or.cz\/course\/cvs.html<\/a><\/li>\n<li>Crash course for Subversion users: <a href=\"http:\/\/git.or.cz\/course\/svn.html\">http:\/\/git.or.cz\/course\/svn.html<\/a><\/li>\n<li>Howto use git to hack on sources coming from a Subversion repository.<br \/>\n<a href=\"http:\/\/tw.apinc.org\/weblog\/2007\/01\/03#subverting-git\">http:\/\/tw.apinc.org\/weblog\/2007\/01\/03#subverting-git<\/a> <\/li>\n<\/ul>\n<p>Tools &#8212; See <a href=\"http:\/\/git.or.cz\/gitwiki\/InterfacesFrontendsAndTools\">http:\/\/git.or.cz\/gitwiki\/InterfacesFrontendsAndTools<\/a><\/p>\n<p>\n<b>Mercurial<\/b>\n<\/p>\n<p>\nThe OpenSolaris project decided between Bazaar-NG, Git and Mercurial.<br \/>\nMercurial was chosen primarily because 1. it was fast (although Git is<br \/>\nfaster), 2. the Mercurial developers were very responsive to the<br \/>\nOpenSolaris developers and 3. OpenSolaris developers felt like they<br \/>\ncould hack Python code, and 4. the repository format works well with ZFS &amp;<br \/>\nNetApp filesystem snapshotting. Their evaluation of Git is <a href=\"http:\/\/www.opensolaris.org\/os\/community\/tools\/scm\/git-report-final.txt\">here<\/a>,<br \/>\nand it looks like the listed downsides are now out-of-date or superficial. The Mozilla project had a &#8220;<a href=\"http:\/\/weblogs.mozillazine.org\/preed\/2006\/11\/version_control_system_shootou.html\">version control shootout<\/a>&#8220;, and although they haven&#8217;t yet made a decision, Mercurial and Bazaar-NG sounded the best to them.<\/p>\n<p>\nThe following has diagrams to illustrate distributed merging:<br \/>\n<a href=\"http:\/\/www.selenic.com\/mercurial\/wiki\/index.cgi\/UnderstandingMercurial\">http:\/\/www.selenic.com\/mercurial\/wiki\/index.cgi\/UnderstandingMercurial<\/a><\/p>\n<p>\nMercurial is more mature than Bazaar-NG, and Mercurial is faster:<br \/>\n<a href=\"http:\/\/sayspy.blogspot.com\/2006\/11\/bazaar-vs-mercurial-unscientific.html\">http:\/\/sayspy.blogspot.com\/2006\/11\/bazaar-vs-mercurial-unscientific.html<\/a><\/p>\n<p>\n&#8220;Technologically, centralized systems are a single point of failure&#8211;<br \/>\nany problems with the central server are problems for all people using<br \/>\nit.&#8221; &#8212; <a href=\"http:\/\/bazaar-vcs.org\/WhyUseBzr\">http:\/\/bazaar-vcs.org\/WhyUseBzr<\/a>\n<\/p>\n<p>Mercurial supports access control, email notify, line-ending conversion,<br \/>\netc.:<br \/>\n<a href=\"http:\/\/www.selenic.com\/mercurial\/wiki\/index.cgi\/UsingExtensions\">http:\/\/www.selenic.com\/mercurial\/wiki\/index.cgi\/UsingExtensions<\/a><\/p>\n<p>\n<b>SVK<\/b>\n<\/p>\n<p>SVK is built on top of Subversion, so it should, in theory, integrate<br \/>\nwell with an existing Subversion repository, allowing developers to use<br \/>\na distributed tool even if the master server remains a Subversion<br \/>\nserver. Community adoption is high enough to have some confidence<br \/>\nin the future of the project, although adoption isn&#8217;t nearly as high as with Git, Mercurial or Bazaar-NG.\n<\/p>\n<p>\nIt used to be difficult to install, but you can now get a prebuilt<br \/>\ninstaller for Windows and probably for Linux as well. Working copies<br \/>\n(sandboxes) have no extra meta data (no .svn directory which interfere<br \/>\nwith find, etc.) The repository format is significantly smaller than<br \/>\nwith Subversion. I&#8217;ve found that SVK is much faster than Subversion,<br \/>\nalthough I haven&#8217;t used it much. There is not yet a graphical<br \/>\nuser interface &#8212; a must for many organizations\/communities.\n<\/p>\n<p>\nThe good, the bad and the ugly about SVK (Sept 2006):<br \/>\n<a href=\"http:\/\/kitenet.net\/~joey\/blog\/entry\/svk.html\">http:\/\/kitenet.net\/~joey\/blog\/entry\/svk.html<\/a><\/p>\n<p>\n<b>Darcs<\/b>\n<\/p>\n<p>\nUsers of darcs, including myself, appreciate its simplicity and<br \/>\nease-of-use (note: Cogito, Mercurial and Bazaar-NG are also easy to<br \/>\nuse). Downsides of darcs are that 1. Darcs is implemented in Haskel,<br \/>\nwhich limits the contributing developer community (perhaps it will inspire<br \/>\npeople to learn Haskel), 2.  depends on having Haskel libraries installed and<br \/>\n3. there&#8217;s no graphical user interface, unless you consider <a href=\"http:\/\/auriga.wearlab.de\/~alb\/darcsweb\/\"\n>darcsweb<\/a>. Still, I like darcs, and I use it on my<br \/>\nhome linux box. Like Perforce and SVK, darcs doesn&#8217;t clutter up directories<br \/>\nwith .darcs metadata. It used to be that Darcs wasn&#8217;t very scalable, but<br \/>\nI hear that it&#8217;s become much more scalable as of mid-2006. I&#8217;ve read that<br \/>\nMercurial and Darcs feel somewhat similiar in their command-line user<br \/>\ninterface.\n<\/p>\n<p>\nMirroring Subversion with Darcs and Tailor (Sept 2006):<br \/>\n<a href=\"http:\/\/fiatdev.com\/articles\/2006\/09\/10\/mirroring-subversion-with-darcs-and-tailor\">http:\/\/fiatdev.com\/articles\/2006\/09\/10\/mirroring-subversion-with-darcs-and-tailor<\/a><\/p>\n<\/p>\n<p>\n<span style=\"font-weight: bold;\">Subversion<\/span><\/p>\n<p>\nSubversion has a bright future, I think, and we may yet see some of the<br \/>\nadvantages of distributed systems appear. For those who need merge<br \/>\nhistory tracking, which makes future merges from the same branch<br \/>\neasier, there&#8217;s <a href=\"http:\/\/www.orcaware.com\/svn\/wiki\/Svnmerge.py\">svnmerge.py<\/a>. In a future release, Subversion will have this feature built-in.\n<\/p>\n<p>\nThe Subversion 1.4 release brought impressive speedups for working copy operations.<\/p>\n<p>\n<b>Control\/Power<\/b>\n<\/p>\n<p>\nChanging information flow by switching from a centralized system to a<br \/>\ndistributed system will empower or disempower different sets of people.<br \/>\nI wouldn&#8217;t be surprised if one encounters resistance in switching. <\/p>\n<p>\nIn the centralized model, developers are empowered to make any change<br \/>\nthey want, which may affect everyone, without consulting others. Of course,<br \/>\nif they abuse that power, they may lose commit access. With a distributed system, an integrator <span style=\"font-style: italic;\">pulls<\/span> in people&#8217;s changes based on what and whom they trust. If<br \/>\nyou&#8217;re aiming for quality code that doesn&#8217;t destabilize a system, it<br \/>\nsounds like a good approach, and it works well for Linux kernel development. Most distributed systems can be used similiar to a<br \/>\ncentralized system, so that no integrator is required &#8212; individuals can <span style=\"font-style: italic;\">push<\/span> their changes to the master repository.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;ve long had an interest in version control systems (VCS), also known as source code management (SCM) systems &#8212; beginning with RCS, SCCS and CVS. CVS was already showing it&#8217;s age when I started using it in 1998. When the company I worked for, Axent, was acquired by Symantec in 2000, we switched to using &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/jaredrobinson.com\/blog\/whats-happening-with-version-control-systems\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;What&#8217;s happening with Version Control Systems?&#8221;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,17],"tags":[],"class_list":["post-62","post","type-post","status-publish","format-standard","hentry","category-programming","category-tech"],"_links":{"self":[{"href":"https:\/\/jaredrobinson.com\/blog\/wp-json\/wp\/v2\/posts\/62","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jaredrobinson.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jaredrobinson.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jaredrobinson.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jaredrobinson.com\/blog\/wp-json\/wp\/v2\/comments?post=62"}],"version-history":[{"count":0,"href":"https:\/\/jaredrobinson.com\/blog\/wp-json\/wp\/v2\/posts\/62\/revisions"}],"wp:attachment":[{"href":"https:\/\/jaredrobinson.com\/blog\/wp-json\/wp\/v2\/media?parent=62"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jaredrobinson.com\/blog\/wp-json\/wp\/v2\/categories?post=62"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jaredrobinson.com\/blog\/wp-json\/wp\/v2\/tags?post=62"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}