﻿<preface id="svn-ch-0">
  <title>序言</title>
  
  <simplesect>
    
    <blockquote>
      <para><quote>如果C是一条上吊绳，那么用Subversion来封存它吧。</quote>
        &mdash;Brian W. Fitzpatrick</para>
    </blockquote>

    <para>在开源软件世界，长久以来，并行版本系统（CVS）一直是版本控制工具的唯一选择。事实证明，这个选择不错。CVS的自由软件身份，无约束的<foreignphrase>处事态度</foreignphrase>，和对网络化操作的支持（网络使众多身处不同地方的程序员可以共享他们的工作成果），正符合了开源世界协作的精神。CVS和它半混乱状态的开发模式已成为开源文化的基石。</para>


    <para>但是，和其它许多工具一样，CVS逐渐显露出衰老的迹象。而Subversion，则是以CVS继任者的面目出现的新型版本控制系统。Subversion的设计者们力图通过两方面的努力赢得CVS用户的青睐：保持构建开源软件版本控制系统的方式（以及视觉和感觉上）与CVS尽可能类似，同时尽力弥补CVS许多显著的缺陷。这些努力的结果使得从CVS迁移到Subversion不需要作出重大的变革，Subversion确实是非常强大、非常有用和非常灵活的工具。</para>

    <para>本书是为Subversion 1.2系列撰写的。在书中，我们尽力涵盖Subversion的所有内容。但是，Subversion有一个兴盛和充满活力的开发社区，已有许多新的特性和改进措施计划在新版本的Subversion中实现，本书中讲述的命令和特性可能会有所变化。
    </para>

  </simplesect>


  <!-- ================================================================= -->
  <!-- ======================== SECTION 1 ============================== -->
  <!-- ================================================================= -->
  <sect1 id="svn.preface.audience">

    <title>读者</title>
    
    <para>本书是为了那些在计算机领域有丰富知识，并且希望使用Subversion管理数据的人士准备的。尽管Subversion可以在多种不同的操作系统上运行，但其基本用户操作界面是工作于命令行界面下的，也就是我们将要在本书中讲述和使用的命令行工具（<command>svn</command>）。出于一致性的考虑，本书的例子假定读者使用的是类Unix的操作系统，并且熟悉Unix和命令行界面。</para>

    <para>同样，<command>svn</command>程序也可以在入Microsoft Windows这样的非Unix平台上运行。除了一些微小的不同，如使用反斜线（<literal>\</literal>）代替正斜线（<literal>/</literal>）作为路径分隔符，在Windows上运行svn程序的输入和输出与在Unix平台上运行完全一致。不过在Cygwin（Windows下的模拟Unix的环境）运行本书的例子可能更容易成功。</para>

    <para>大多数读者可能是那些需要跟踪代码变化的程序员或者系统管理员。这是Subversion最普遍的用途，因此这个场景贯穿于整本书的例子中。但是Subversion是可以用来管理任何类型的数据：图像、音乐、数据库、文档，等等。对于Subversion，数据不过是数据而已。</para>
    
    <para>本书假定读者从来没有使用过任何版本控制工具，同时，我们也努力使CVS用户能够轻而易举的跃入Subversion中。有时某些条目可能会涉及到CVS，此外，在附录的一个章节中总结了Subversion和CVS的区别。</para>

  </sect1>

  <!-- ================================================================= -->
  <!-- ======================== SECTION 2 ============================== -->
  <!-- ================================================================= -->
  <sect1 id="svn.preface.howread">
    <title>怎样阅读本书</title>

    <para>本书适用于具有不同背景知识的各个层次的读者&mdash;从未使用过版本控制的新手到经验丰富的系统管理员都能够从本书中获益。根据基础的不同，某些的章节可能对某些读者更有价值。下面的内容可以看作是为不同类型的读者提供的<quote>推荐阅读清单</quote>：</para>

    <variablelist>
      <varlistentry>
        <term>资深系统管理员</term>
        <listitem>
          <para>假设你从前使用过CVS，并且迫切需要建立起Subversion服务器并尽快运行起来，<xref linkend="svn.reposadmin"/>和<xref  linkend="svn.serverconfig"/>将会告诉你如何建立起一个版本库，并使之加入网络大家庭。此后，依靠你的CVS使用经验，<xref linkend="svn.tour"/>和<xref linkend="svn.forcvs"/>将向你展示怎样使用Subversion客户端软件。</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term>新用户</term>
        <listitem>
          <para>如果管理员已经为你准备好了Subversion服务，你所需要的是学习如何使用客户端。如果你没有使用版本控制系统（像CVS）的经验，那么<xref linkend="svn.basic"/>和<xref linkend="svn.tour"/>是重要的入门教程。如果你已经是CVS的老手，第3章和附录A将是不错的开始。</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term>高级用户</term>
        <listitem>
          <para>无论是用户还是管理员，项目终将会壮大起来。那时，就需要学习更多Subversion的高级功能，像如何使用分支和执行合并（<xref linkend="svn.branchmerge"/>）、怎样使用Subversion的属性支持、怎样配制运行参数（<xref linkend="svn.advanced"/>）等等。这两章在学习的初期并不重要，但熟悉了基本操作之后还是非常有必要了解一下的。</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term>开发者</term>
        <listitem>
          <para>你应该已经很熟悉Subversion了，并且想扩展它并使用它的API开发新软件。<xref linkend="svn.developer"/>将最适合你。</para>
        </listitem>
      </varlistentry>
    </variablelist>

    <para>本书以参考材料作为结束&mdash;<xref linkend="svn.ref"/>是一部Subversion全部命令的详细指南，此外，在附录中还有许多很有意义的主题。阅读完本书后，这些章节将会是你经常查阅的内容。</para>

  </sect1>

  <!-- ================================================================= -->
  <!-- ================================================================= -->
  <sect1 id="svn.preface.conventions">
    <title>本书约定</title>
    
    <para>本节描述了本书中使用的各种约定。</para>
    
    <!-- ***************************************************************** -->
    <sect2 id="svn.preface.conventions.typo">
      <title>排版习惯</title>
      
      <variablelist>
        
        <varlistentry>
          <term><command>等宽字体</command></term>
          <listitem>
            <para>用于命令，命令输出和开关</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><replaceable>等宽斜体</replaceable></term>
          <listitem>
            <para>用于代码和文本中的可替换部分</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><filename>斜体</filename></term>
          <listitem>
            <para>用于文件和路径名</para>
          </listitem>
        </varlistentry>
        
      </variablelist>

    </sect2>

    <!-- ***************************************************************** -->
    <sect2 id="svn.preface.conventions.icons">
      <title>图标</title>

      <note>
        <para>此图标表示旁边的文本内容需特别注意。</para>
      </note>

      <tip>
        <para>此图标表示旁边的文本描述了一个有用的小技巧。</para>
      </tip>

      <warning>
        <para>此图标表示旁边的文本是警告信息。</para>
      </warning>
    </sect2>

    <para>需要说明的是，所有源代码示例仅仅是例子而已。这些例子需要通过正确编译参数进行编译，在这里列举它们只是为了说明眼前的问题，并非为了展示优秀的编码风格。</para>

  </sect1>

  <!-- ================================================================= -->
  <!-- ================================================================= -->
  <sect1 id="svn.preface.organization">
    <title>本书的组织结构</title>

    <para>以下是各个章节的内容介绍：</para>

      <variablelist>
        
        <varlistentry>
          <term><xref linkend="svn.intro"/></term>
          <listitem>
            <para>回顾了Subversion的历史，描述了Subversion的特性、架构、组件和安装方法。还包含了一个快速入门指南。</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><xref linkend="svn.basic"/></term>
          <listitem>
            <para>介绍了版本控制的基础知识及不同的版本模型，同时讲述了Subversion的版本库，工作拷贝和修订版本的概念。</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><xref linkend="svn.tour"/></term>
          <listitem>
            <para>引领你开始一个Subversion用户的工作。示范怎样使用Subversion获得、修改和提交数据。</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><xref linkend="svn.branchmerge"/></term>
          <listitem>
            <para>讨论分支、合并与标签，包括最佳实践的介绍，常见用例的描述，以及怎样取消修改，和怎样从一个分支转到另一个分支。</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><xref linkend="svn.reposadmin"/></term>
          <listitem>
            <para>讲述Subversion版本库的基本概念，怎样建立、配置和维护版本库，以及哪些工具可以完成上述的工作。</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><xref linkend="svn.serverconfig"/></term>
          <listitem>
            <para>描述了如何配置Subversion服务器，以及三种访问版本库的方式，<literal>HTTP</literal>、<literal>svn</literal>协议和本地访问。这里也介绍了认证的细节，以及授权与匿名访问方式。</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><xref linkend="svn.advanced"/></term>
          <listitem>
            <para>探索Subversion客户端配置文件、文件和目录的属性，以及怎样<literal>忽略</literal>工作拷贝中的文件、怎样引入外部版本树到工作拷贝，最后介绍了如何处理发售分支。</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><xref linkend="svn.developer"/></term>
          <listitem>
            <para>介绍了Subversion的核心部件、Subversion的文件系统，以及程序员眼中的工作拷贝管理区域，展示了如何使用公共API编写Subversion应用程序。最重要的内容是，如何为Subversion的开发贡献力量。
           </para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><xref linkend="svn.ref"/></term>
          <listitem>
            <para>以大量的实例，详细描述了<command>svn</command>、<command>svnadmin</command>和<command>svnlook</command>的所有子命令。</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><xref linkend="svn.forcvs"/></term>
          <listitem>
            <para>详细比较了Subversion与CVS的异同，并针对如何消除多年使用CVS养成的坏习惯提出建议。内容包括subversion版本号、目录的版本化、离线操作、<command>update</command>与<command>status</command>的对比、分支、标签、元数据、冲突处理和认证。
           </para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><xref linkend="svn.webdav"/></term>
          <listitem>
            <para>描述了WebDAV与DeltaV的细节内容，并介绍了如何将Subversion版本库作为可读/写的DAV共享装载。</para>
          </listitem>
        </varlistentry>

        <varlistentry>
          <term><xref linkend="svn.3rdparty"/></term>
          <listitem>
            <para>讨论一些支持和使用Subversion的工具，包括其它客户端工具，版本库浏览工具等等。</para>
          </listitem>
        </varlistentry>

    </variablelist>

  </sect1>


  <!-- ================================================================= -->
  <!-- ======================== SECTION 5 ============================== -->
  <!-- ================================================================= -->
  <sect1 id="svn.preface.free">
    <title>本书是免费的</title>

    <para>本书最初是作为Subversion项目的文档由Subversion的开发者开始撰写的，后来成为一个独立的项目并进行了重写。与Subversion相同，它始终按免费许可证（见<xref linkend="svn.copyright"/>）发布。事实上，本书是在公众的关注中写作出来，并作为Subversion的一部分。这有两种含义：</para>

    <itemizedlist>
      <listitem>
        <para>总可以在Subversion的版本库里找到本书的最新版本。</para>
      </listitem>

      <listitem>
        <para>可以任意分发或修改本书&mdash;它在免费许可证的控制之下。当然，与其独自发布私有版本，不如向Subversion开发社区提供反馈和修正信息。参见<xref linkend="svn.developer.contrib"/>了解如何加入社区。</para>
      </listitem>
    </itemizedlist>
    <!-- O'Reilly Hardcopy Only
    <para>你可以向O'Reilly发布评论和问题：###insert boilerplate.</para>
    -->
    <para>可以在<ulink url="http://svnbook.red-bean.com"/>找到本书的一个较新的在线版本。</para>

  </sect1>

  <!-- ================================================================= -->
  <!-- ======================== SECTION 6 ============================== -->
  <!-- ================================================================= -->
  <sect1 id="svn.preface.acks">
    <title>致谢</title>

    <para>
    没有Subversion就不可能有（即使有也没什么价值）这本书。所以作者衷心感谢Brian Behlendorf和CollabNet，他们独到的眼光开创了这个冒险但雄心勃勃的开源项目；Jim Blandy贡献了Subversion这个名字和最初的设计&mdash;我们爱你，Jim。还有Karl Fogel，一个好朋友和伟大的社区领袖。<footnote><para>噢，还要感谢Karl为了本书所付出的辛勤工作。</para>
      </footnote></para>

    <para>感谢O'Reilly和我们的编辑Linda Mui和Tatiana对我们的耐心和支持。</para>

    <para>最后，我们要感谢数不清的曾经为本书作出贡献的人们，他们进行了非正式的审阅，并给出了大量建议和修改意见。虽然无法列出一个完整的列表，但本书的完整和正确离不开：Jani Averbach,
      Ryan Barrett, Francois Beausoleil, Jennifer Bevan, Matt Blais,
      Zack Brown, Martin Buchholz, Brane Cibej, John R. Daily, Peter
      Davis, Olivier Davy, Robert P. J. Day, Mo DeJong, Brian Denny,
      Joe Drew, Nick Duffek, Ben Elliston, Justin Erenkrantz, Shlomi
      Fish, Julian Foad, Chris Foote, Martin Furter, Dave Gilbert,
      Eric Gillespie, Matthew Gregan, Art Haas, Greg Hudson, Alexis
      Huxley, Jens B. Jorgensen, Tez Kamihira, David Kimdon, Mark
      Benedetto King, Andreas J. Koenig, Nuutti Kotivuori, Matt Kraai,
      Scott Lamb, Vincent Lefevre, Morten Ludvigsen, Paul Lussier,
      Bruce A. Mah, Philip Martin, Feliciano Matias, Patrick Mayweg,
      Gareth McCaughan, Jon Middleton, Tim Moloney, Mats Nilsson, Joe
      Orton, Amy Lyn Pilato, Kevin Pilch-Bisson, Dmitriy Popkov,
      Michael Price, Mark Proctor, Steffen Prohaska, Daniel Rall,
      Tobias Ringstrom, Garrett Rooney, Joel Rosdahl, Christian Sauer,
      Larry Shatzer, Russell Steicke, Sander Striker, Erik Sjoelund,
      Johan Sundstroem, John Szakmeister, Mason Thomas, Eric
      Wadsworth, Colin Watson, Alex Waugh, Chad Whitacre, Josef Wolf,
      Blair Zajac, 以及整个Subversion社区。</para>

    <!-- ***************************************************************** -->
    <sect2 id="svn.preface.acks.sussman">
      <title>来自Ben Collins-Sussman</title>

      <para>感谢我的妻子Frances，在好几个月里，我一直在对你说：<quote>但是亲爱的，我还在为这本书工作</quote>，此外还有，<quote>但是亲爱的，我还在处理邮件</quote>。我不知道她为什么会如此耐心！她是我完美的平衡点。</para>
      
      <para>感谢我的家人对我的鼓励，无论他们是否真的对我的课题感兴趣。（你知道的，一个人说 <quote>哇，你正在写一本书？</quote>，然后当他知道你是写一本计算机书时，那种惊讶就变得没有那么多了。）</para>

      <para>感谢我身边让我富有的朋友，不要那样看我&mdash;你们知道你们是谁。</para>

    </sect2>

    <!-- ***************************************************************** -->
    <sect2 id="svn.preface.acks.fitz">
      <title>来自Brian W. Fitzpatrick</title>

      <para>非常非常感谢我的妻子Marie的理解，支持和最重要的耐心。感谢引导我学会UNIX编程的兄弟Eric，感谢我的母亲和外祖母的支持，对我在圣诞夜里埋头工作的理解。</para>

      <para>Mike和Ben：与你们一起工作非常快乐，Heck，我们在一起工作很愉快！</para>

      <para>感谢所有在Subversion和Apache软件基金会的人们给我机会与你们在一起，没有一天我不从你们那里学到知识。
      </para>

      <para>最后，感谢我的祖父，他一直跟我说<quote>自由等于责任</quote>，我深信不疑。</para>

    </sect2>

    <!-- ***************************************************************** -->
    <sect2 id="svn.preface.acks.cmpilato">
      <title>来自C. Michael Pilato</title>

      <para>特别感谢我的妻子Amy，因为她的耐心照顾，因为她对我熬夜的容忍，因为她用难以想象的优雅方式修订我的每一个章节&mdash;你总能先行一步。Gavin，你已经大到可以阅读了，我希望你能为我这样一个爸爸感到骄傲，像我为你骄傲一样。爸爸妈妈（还有家里的其他人），感谢你们恒久不变的支持和鼓励。</para>

      <para>向你们致敬，Shep Kendall，为我打开了通向计算机世界的大门；Ben Collins Sussman，我在开源世界的导师；Karl Fogel&mdash;你<emphasis>是</emphasis>我的<filename>.emacs</filename>；Greg Stain，让我在困境中知道怎样编程；Brain Fitzpatrick&mdash;同我分享他的写作经验。所有我曾经从你们那里获得知识的人&mdash;尽管又不断忘记。</para>

      <para>最后，对所有为我展现完美卓越创造力的人们&mdash;感谢。</para>

    </sect2>

  </sect1>

</preface>

<!--
local variables: 
sgml-parent-document: ("book.xml" "chapter")
end:
-->
