[svnbook commit] r2444 - trunk/src/zh/book

rocksun noreply at red-bean.com
Tue Sep 26 09:08:45 CDT 2006


Author: rocksun
Date: Tue Sep 26 09:08:44 2006
New Revision: 2444

Modified:
   trunk/src/zh/book/book.xml
   trunk/src/zh/book/ch02.xml
   trunk/src/zh/book/ch03.xml
   trunk/src/zh/book/ch05.xml
   trunk/src/zh/book/ch06.xml
   trunk/src/zh/book/ch07.xml
   trunk/src/zh/book/ch08.xml
   trunk/src/zh/book/foreword.xml

Log:
* book.xml: same to 1.2
* ch02.xml: same to 1.2
* ch03.xml: same to 1.2
* ch05.xml: same to 1.2
* ch06.xml: same to 1.2
* ch07.xml: same to 1.2
* ch08.xml: same to 1.2

Modified: trunk/src/zh/book/book.xml
==============================================================================
--- trunk/src/zh/book/book.xml	(original)
+++ trunk/src/zh/book/book.xml	Tue Sep 26 09:08:44 2006
@@ -71,6 +71,7 @@
       <year>2003</year>
       <year>2004</year>
       <year>2005</year>
+      <year>2006</year>
       <holder>Ben Collins-Sussman</holder>
       <holder>Brian W. Fitzpatrick</holder>
       <holder>C. Michael Pilato</holder>

Modified: trunk/src/zh/book/ch02.xml
==============================================================================
--- trunk/src/zh/book/ch02.xml	(original)
+++ trunk/src/zh/book/ch02.xml	Tue Sep 26 09:08:44 2006
@@ -63,7 +63,7 @@
       <title>锁定-修改-解锁 方案</title>
       
       <para>
-      许多版本控制系统使用<firstterm>锁定-修改-解锁</firstterm>这种机制解决这种问题,在这样的系统里,在一个时间段里版本库的一个文件只允许被一个人修改。首先在修改之前,Harry要<quote>锁定</quote>住这个文件,锁定很像是从图书馆借一本书,如果Harry锁住这个文件,Sally不能做任何修改,如果Sally想请求得到一个锁,版本库会拒绝这个请求。在Harry结束编辑并且放开这个锁之前,她只可以阅读文件。Harry解锁后,就要换班了,Sally得到自己的轮换位置,锁定并且开始编辑这个文件。<xref
+      许多版本控制系统使用<firstterm>锁定-修改-解锁</firstterm>这种机制解决这种问题,在这样的模型里,在一个时间段里版本库的一个文件只允许被一个人修改。首先在修改之前,Harry要<quote>锁定</quote>住这个文件,锁定很像是从图书馆借一本书,如果Harry锁住这个文件,Sally不能做任何修改,如果Sally想请求得到一个锁,版本库会拒绝这个请求。在Harry结束编辑并且放开这个锁之前,她只可以阅读文件。Harry解锁后,就要换班了,Sally得到自己的轮换位置,锁定并且开始编辑这个文件。<xref
         linkend="svn.basic.vsn-models.lock-unlock.dia-1"/>描述了这样的解决方案。</para>
       
       <figure id="svn.basic.vsn-models.lock-unlock.dia-1">

Modified: trunk/src/zh/book/ch03.xml
==============================================================================
--- trunk/src/zh/book/ch03.xml	(original)
+++ trunk/src/zh/book/ch03.xml	Tue Sep 26 09:08:44 2006
@@ -74,14 +74,14 @@
         <varlistentry>
           <term>HEAD</term>
           <listitem>
-            <para>版本库中最新的版本。</para>
+            <para>版本库中最新的(或者是<quote>最年轻的</quote>)版本。</para>
           </listitem>
         </varlistentry>
         
         <varlistentry>
           <term>BASE</term>
           <listitem>
-            <para>工作拷贝中的<quote>原始</quote>修订版本。</para>
+            <para>工作拷贝中一个条目的修订版本号,如果这个版本在本地修改了,则<quote>BASE版本</quote>就是这个条目在本地未修改的版本。</para>
           </listitem>
         </varlistentry>
         
@@ -222,7 +222,7 @@
       linkend="svn.advanced.props.special.mime-type"/>给Subversion提示以说明对于特定文件<quote>文本化的</quote>操作是没有意义的,也有一些地方,Subversion对存放信息的有限制。
       </para>
 
-      <para>Subversion内部处理文本是UTF-8编码的,结果就是有些条目天生是<quote>文本的</quote>,例如属性名称、路径名称和日志信息只能存放合法的UTF-8字符。它也提供了使用<literal>svn:mime-type</literal>属性的最小需求—如果一个文件的内容不符合UTF-8,你一定要把它标记为二进制文件,否则,Subversion会尝试使用UTF-8合并区别,这很可能在文件中留下垃圾。
+      <para>Subversion内部使用二进制处理数据—例如,属性名称,路径名和日志信息—UTF-8编码的Unicode,这并不意味着与Subversion的交互必须完全使用UTF-8。作为一个惯例,Subversion的客户端能够透明的转化UTF-8和你所使用系统的编码,前提是可以进行有意义的转换(当然是大多数目前常见的编码)。
       </para>
 
       <para>此外,路径名称在WebDAV交换中会作为XML属性值,就像Subversion的管理文件。这意味着路径名称只能包含合法的XML(1.0)字符,Subversion也会禁止路径名称中出现TAB、CR或LF字符,所以它们才不会在区别程序或如<xref
@@ -668,7 +668,7 @@
           switch</command>)。</para>
         
         <para>第六列显示了锁定的信息,将会在<xref
-          linkend="svn.advanced.locking"/>详细说明。
+          linkend="svn.advanced.locking"/>详细说明。(这与第三列中的<computeroutput>L</computeroutput>并不是同一个东西,见<xref linkend="svn.advanced.locking.meanings"/>。)
         </para>
           
         <para>如果你传递一个路径给<command>svn
@@ -1438,9 +1438,9 @@
     <sect2 id="svn.tour.other.cleanup">
       <title><command>svn cleanup</command></title>
 
-      <para>当Subversion改变你的工作拷贝(或是<filename>.svn</filename>中的任何信息),它会尽可能的小心,在修改任何事情之前,它把意图写到日志文件中去,然后执行log文件中的命令,然后删掉日志文件,这与分类帐的文件系统架构类似。如果Subversion的操作中断了(举个例子:进程被杀死了,机器死掉了),日志文件会保存在硬盘上,通过重新执行日志文件,Subversion可以完成上一次开始的操作,你的工作拷贝可以回到一致的状态。</para>
+      <para>当Subversion改变你的工作拷贝(或是<filename>.svn</filename>中的任何信息),它会尽可能的小心,在修改任何事情之前,它把意图写到日志文件中去,然后执行log文件中的命令,并且执行过程中在工作拷贝的相关部分保存一个锁— 防止Subversion客户端在变更过程中访问工作拷贝。然后删掉日志文件,这与记帐试的文件系统架构类似。如果Subversion的操作中断了(举个例子:进程被杀死了,机器死掉了),日志文件会保存在硬盘上,通过重新执行日志文件,Subversion可以完成上一次开始的操作,你的工作拷贝可以回到一致的状态。</para>
 
-      <para>这就是<command>svn cleanup</command>所作的:它查找工作拷贝中的所有遗留的日志文件,删除进程中的锁。如果Subversion告诉你工作拷贝中的一部分已经<quote>锁定</quote>了,你就需要运行这个命令了。同样,<command>svn status</command>将会使用<literal>L</literal> 显示锁定的项目:</para>
+      <para>这就是<command>svn cleanup</command>所作的:它查找工作拷贝中的所有遗留的日志文件,删除进程中工作拷贝的锁。如果Subversion告诉你工作拷贝中的一部分已经<quote>锁定</quote>了,你就需要运行这个命令了。同样,<command>svn status</command>将会使用<literal>L</literal> 显示锁定的项目:</para>
 
       <screen>
 $ svn status
@@ -1484,6 +1484,8 @@
 
       <para>注意,在导入之后,原来的目录树并<emphasis>没有</emphasis>转化成工作拷贝,为了开始工作,你还是需要运行<command>svn
         checkout</command>导出一个工作拷贝。</para>
+        
+        <para>不要将工作拷贝中的锁与并行版本控制的<quote>锁定-修改-解锁</quote>模型中用户使用的锁混淆;为了清楚的认识可以看一下<xref linkend="svn.advanced.locking.meanings"/>。</para>
 
     </sect2>
 

Modified: trunk/src/zh/book/ch05.xml
==============================================================================
--- trunk/src/zh/book/ch05.xml	(original)
+++ trunk/src/zh/book/ch05.xml	Tue Sep 26 09:08:44 2006
@@ -50,7 +50,7 @@
     <sect2 id="svn.reposadmin.basics.backends">
       <title>版本库数据存储</title>
 
-      <para>在Subversion1.1中,版本库中存储数据有两种方式。一种是在Berkeley DB数据库中存储数据;另一种是使用普通的文件,使用自定义格式。因为Subversion的开发者称版本库为(版本化的)文件系统,他们接受了称后一种存储方式为FSFS<footnote>
+      <para>在Subversion1.2中,版本库中存储数据有两种方式。一种是在Berkeley DB数据库中存储数据;另一种是使用普通的文件,使用自定义格式。因为Subversion的开发者称版本库为(版本化的)文件系统,他们接受了称后一种存储方式为FSFS<footnote>
           <para>读作<quote>fuzz-fuzz</quote>, 如果Jack
             Repenning说起这个问题。</para>
         </footnote>的习惯,也就是说,使用本地操作系统文件系统来存储数据的版本化文件的系统。</para>
@@ -434,7 +434,7 @@
     <sect2 id="svn.reposadmin.create.bdb">
       <title>Berkeley DB配置</title>
 
-      <para>Berkeley DB环境是对一个或多个数据库、日志文件、区域文件和配置文件的封装。Berkeley DB环境对许多参数有自己的缺省值,例如任何时间里可用的锁定数目、日志文件的最大值等。Subversion文件系统会使用Berkeley DB的默认值。 不过,有时候你的特定版本库与它独特的数据集合和访问类型,可能需要不同的配置选项。</para>
+      <para>Berkeley DB环境是对一个或多个数据库、日志文件、区域文件和配置文件的封装。Berkeley DB环境对许多参数有自己的缺省值,例如任何时间里可用的数据库锁定数目、日志文件的最大值等。Subversion文件系统会使用Berkeley DB的默认值。 不过,有时候你的特定版本库与它独特的数据集合和访问类型,可能需要不同的配置选项。</para>
 
       <para>Sleepycat(Berkeley DB的制造厂商)的人们清楚不同的数据库有不同的需求,所以他们提供了在运行中覆盖Berkeley DB环境配置参数的机制。Berkeley在每一个环境目录中检查是否存在一个名叫<filename>DB_CONFIG</filename>的文件,然后解析其中的参数成为Berkeley环境所用的选项。</para>
 

Modified: trunk/src/zh/book/ch06.xml
==============================================================================
--- trunk/src/zh/book/ch06.xml	(original)
+++ trunk/src/zh/book/ch06.xml	Tue Sep 26 09:08:44 2006
@@ -81,9 +81,9 @@
           <row>
             <entry>Web浏览能力</entry>
             
-            <entry>有限的内置支持,或者通过第三方工具,如ViewCVS</entry>
+            <entry>有限的内置支持,或者通过第三方工具,如ViewVC</entry>
 
-            <entry>通过第三方工具,如ViewCVS</entry>
+            <entry>通过第三方工具,如ViewVC</entry>
           </row>
 
           <row>
@@ -139,10 +139,10 @@
 
       <para>许多服务器配置为在每次请求时要求认证,这对一次次输入用户名和密码的用户来说是非常恼人的事情。</para>
 
-      <para>令人高兴的是,Subversion客户端对此有一个修补:存在一个在磁盘上保存认证凭证缓存的系统,缺省情况下,当一个命令行客户端成功的在服务器上得到认证,它会保存一个认证文件到用户的私有运行配置区—类Unix系统下会在<filename>~/.subversion/auth/</filename>,Windows下在<filename>%APPDATA%/Subversion/auth/</filename>(运行区在<xref
+      <para>令人高兴的是,Subversion客户端对此有一个修补:存在一个在磁盘上保存认证凭证缓存的系统,缺省情况下,当一个命令行客户端成功的响应了服务器的认证请求,它会保存一个认证文件到用户的私有运行配置区—类Unix系统下会在<filename>~/.subversion/auth/</filename>,Windows下在<filename>%APPDATA%/Subversion/auth/</filename>(运行区在<xref
         linkend="svn.advanced.confarea"/>会有更多细节描述)。成功的凭证会缓存在磁盘,以主机名、端口和认证域的组合作为唯一性区别。</para>  
 
-      <para>当客户端接收到一个认证请求,它会首先查找磁盘中的认证凭证缓存,如果没有发现,或者是缓存的凭证认证失败,客户端会提示用户需要这些信息。</para>
+      <para>当客户端接收到一个认证请求,它会首先查找用户磁盘中的认证凭证缓存,如果没有发现,或者是缓存的凭证认证失败,客户端会提示用户需要这些信息。</para>
 
       <para>十分关心安全的人们一定会想<quote>把密码缓存在磁盘?太可怕了,永远不要这样做!</quote>但是请保持冷静,并没有你想象得那么可怕。</para>
      
@@ -153,7 +153,7 @@
         </listitem>
 
         <listitem>
-          <para>在Windows 2000或更新的系统上,Subversion客户端使用标准Windows加密服务来加密磁盘上的密码。因为加密密钥是Windows管理的,与用户的登陆凭证相关,只有用户可以解密密码。(注意:如果用户的Windows账户密码修改了,所有的缓存密码就不可以解密了,此时Subversion客户端就会当它们根本不存在,在需要时继续询问密码。)</para>
+          <para>在Windows 2000或更新的系统上,Subversion客户端使用标准Windows加密服务来加密磁盘上的密码。因为加密密钥是Windows管理的,与用户的登陆凭证相关,只有用户可以解密密码。(注意:如果用户的Windows账户密码被管理员重置,所有的缓存密码就不可以解密了,此时Subversion客户端就会当它们根本不存在,在需要时继续询问密码。)</para>
         </listitem>
 
         <listitem>
@@ -1105,7 +1105,9 @@
           <para>你的Web浏览器只会说普通的HTTP,也就是说它只会GET公共的URL,这个URL代表了最新版本的文件和目录,根据WebDAV/DeltaV规范,每种服务器定义了一种私有的URL语法来代表老的资源的版本,这个语法对客户端是不透明的,为了得到老的版本,一个客户端必须通过一种规范过程来<quote>发现</quote>正确的URL;这个过程包括执行一系列WebDAV PROPFIND请求和理解DeltaV概念,这些事情一般是你的web浏览器做不了的。</para>
 
           <para>为了回答这些问题,一个明显的看老版本文件和目录的方式是带<option>--revision</option>参数的<command>svn
-            list</command>和<command>svn cat</command>命令,为了在浏览器里察看老版本,你可以使用第三方的软件,一个好的例子是ViewCVS(<ulink url="http://viewvc.tigris.org/"/>),ViewCVS最初写出来是为了在web显示CVS版本库,最新的带血的(此时正在编写)版本也已经可以理解Subversion版本库了。</para>
+            list</command>和<command>svn cat</command>命令,为了在浏览器里察看老版本,你可以使用第三方的软件,一个好的例子是ViewVC(<ulink url="http://viewvc.tigris.org/"/>),ViewVC最初写出来是为了在web显示CVS版本库,<footnote>
+              <para>之前叫做<quote>ViewCVS</quote>。</para>
+            </footnote>最新的带血的(此时正在编写)版本也已经可以理解Subversion版本库了。</para>
         </sidebar>
 
       </sect3>

Modified: trunk/src/zh/book/ch07.xml
==============================================================================
--- trunk/src/zh/book/ch07.xml	(original)
+++ trunk/src/zh/book/ch07.xml	Tue Sep 26 09:08:44 2006
@@ -248,7 +248,31 @@
           <varlistentry>
             <term><literal>editor-cmd</literal></term>
             <listitem>
-              <para>Subversion在提交操作时用来询问用户日志信息的程序,例如使用<command>svn commit</command>而没有指定<option>--message</option>(<option>-m</option>)或者<option>--file</option>(<option>-F</option>)选项。这个程序也会与<command>svn propedit</command>一起使用—一个临时文件跳出来包含已经存在的用户希望编辑的属性,然后用户可以对这个属性进行编辑(见<xref linkend="svn.advanced.props" />),这个选项的缺省值为空,如果这个选项没有设置,Subversion会依次检查环境变量<literal>SVN_EDITOR</literal>、<literal>VISUAL</literal>和<literal>EDITOR</literal>(这个顺序)来找到一个编辑器命令。</para>
+              <para>Subversion在提交操作时用来询问用户日志信息的程序,例如使用<command>svn commit</command>而没有指定<option>--message</option>(<option>-m</option>)或者<option>--file</option>(<option>-F</option>)选项。这个程序也会与<command>svn propedit</command>一起使用—一个临时文件跳出来包含已经存在的用户希望编辑的属性,然后用户可以对这个属性进行编辑(见<xref linkend="svn.advanced.props" />),这个选项的缺省值为空,检测编辑器的顺序如下:
+              </para>
+              <orderedlist>
+                <listitem>
+                  <para>命令行选项<literal>--editor-cmd</literal></para>
+                </listitem>
+                <listitem>
+                  <para>环境变量<literal>SVN_EDITOR</literal></para>
+                </listitem>
+                <listitem>
+                  <para>配置选项<literal>editor-cmd</literal></para>
+                </listitem>
+                <listitem>
+                  <para>环境变量<literal>VISUAL</literal></para>
+                </listitem>
+                <listitem>
+                  <para>环境变量<literal>EDITOR</literal></para>
+                </listitem>
+                <listitem>
+                  <para>也有可能Subversion会有一个内置的缺省值(官方编译版本不是如此)
+                  </para>
+                </listitem>
+              </orderedlist>
+              <para>所有这些选项和变量(不像<literal>diff-cmd</literal>)的值的开头都是shell中要执行的命令行,Subversion会追加一个空格和一个需要编辑的临时文件,编辑器必须修改临时文件,并且返回一个0来表明成功。
+              </para>
             </listitem>
           </varlistentry>
           <varlistentry>
@@ -301,7 +325,7 @@
           <varlistentry>
             <term><literal>log-encoding</literal></term>
             <listitem>
-              <para>这个变量设置提交日志缺省的字符集,是<option>--encoding</option>选项(见<xref linkend="svn.ref.svn.sw"/>)的永久形式,Subversion版本库保存了一些UTF8的日志信息,并且假定你的日志信息是用操作系统的本地编码,如果你提交的信息使用别的编码方式,你一定要指定不同的编码。</para>
+              <para>这个变量设置提交日志缺省的字符集,是<option>--encoding</option>选项(见<xref linkend="svn.ref.svn.sw"/>)的永久形式,Subversion版本库保存了一些UTF-8的日志信息,并且假定你的日志信息是用操作系统的本地编码,如果你提交的信息使用别的编码方式,你一定要指定不同的编码。</para>
             </listitem>
           </varlistentry>
 
@@ -448,7 +472,7 @@
 
       <screen>
 $ svn propdel license calc/button.c
-property 'license' deleted from ''.
+property 'license' deleted from 'calc/button.c'.
 $ svn proplist --verbose calc/button.c
 Properties on 'calc/button.c':
   copyright : (c) 2003 Red-Bean Software
@@ -761,7 +785,100 @@
         
         <para>如果有其他人提交了<filename>weather.txt</filename>的修改,你的此文件的拷贝还会显示同样的替换关键字值—直到你更新你的工作拷贝,此时你的<filename>weather.txt</filename>重的关键字将会被替换来反映最新的提交信息。
        </para>
+<para>Subversion 1.2 introduced a new variant of the keyword
+          syntax which brought additional, useful—though perhaps
+          atypical—functionality.  You can now tell Subversion
+          to maintain a fixed length (in terms of the number of bytes
+          consumed) for the substituted keyword.  By using a
+          double-colon (<literal>::</literal>) after the keyword name,
+          followed by a number of space characters, you define that
+          fixed width.  When Subversion goes to substitute your
+          keyword for the keyword and its value, it will essentially
+          replace only those space characters, leaving the overall
+          width of the keyword field unchanged.  If the substituted
+          value is shorter than the defined field width, there will be
+          extra padding characters (spaces) at the end of the
+          substituted field; if it is too long, it is truncated with a
+          special hash (<literal>#</literal>) character just before
+          the final dollar sign terminator.</para>
+
+        <para>For example, say you have a document in which you have
+          some section of tabular data reflecting the document's
+          Subversion keywords.  Using the original Subversion keyword
+          substitution syntax, your file might look something
+          like:</para>
+
+        <screen>
+$Rev$:     Revision of last commit
+$Author$:  Author of last commit
+$Date$:    Date of last commit
+</screen>
+
+        <para>Now, that looks nice and tabular at the start of things.
+          But when you then commit that file (with keyword substitution
+          enabled, of course), you see:</para>
+
+        <screen>
+$Rev: 12 $:     Revision of last commit
+$Author: harry $:  Author of last commit
+$Date: 2006-03-15 02:33:03 -0500 (Wed, 15 Mar 2006) $:    Date of last commit
+</screen>
+
+        <para>The result is not so beautiful.  And you might be
+          tempted to then adjust the file after the substitution so
+          that it again looks tabular.  But that only holds as long as
+          the keyword values are the same width.  If the last
+          committed revision rolls into a new place value (say, from
+          99 to 100), or if another person with a longer username
+          commits the file, stuff gets all crooked again.  However, if
+          you are using Subversion 1.2 or better, you can use the new
+          fixed-length keyword syntax, define some field widths that
+          seem sane, and now your file might look like this:</para>
+
+        <screen>
+$Rev::               $:  Revision of last commit
+$Author::            $:  Author of last commit
+$Date::              $:  Date of last commit
+</screen>
+
+        <para>You commit this change to your file.  This time,
+          Subversion notices the new fixed-length keyword syntax, and
+          maintains the width of the fields as defined by the padding
+          you placed between the double-colon and the trailing dollar
+          sign.  After substitution, the width of the fields is
+          completely unchanged—the short values for
+          <literal>Rev</literal> and <literal>Author</literal> are
+          padded with spaces, and the long <literal>Date</literal>
+          field is truncated by a hash character:</para>
 
+        <screen>
+$Rev:: 13            $:  Revision of last commit
+$Author:: harry      $:  Author of last commit
+$Date:: 2006-03-15 0#$:  Date of last commit
+</screen>
+       
+        <para>The use of fixed-length keywords is especially handy
+          when performing substitutions into complex file formats that
+          themselves use fixed-length fields for data, or for which
+          the stored size of a given data field is overbearingly
+          difficult to modify from outside the format's native
+          application (such as for Microsoft Office documents).</para>
+
+        <warning>
+          <para>Be aware that because the width of a keyword field is
+            measured in bytes, the potential for corruption of
+            multi-byte values exists.  For example, a username which
+            contains some multi-byte UTF-8 characters might suffer
+            truncation in the middle of the string of bytes which make
+            up one of those characters.  The result will be a mere
+            truncation when viewed at the byte level, but will likely
+            appear as a string with an incorrect or garbled final
+            character when viewed as UTF-8 text.  It is conceivable
+            that certain applications, when asked to load the file,
+            would notice the broken UTF-8 text and deem the entire
+            file corrupt, refusing to operate on the file
+            altogether.</para> 
+        </warning>
       </sect3>
 
       <sect3 id="svn.advanced.props.special.eol-style">
@@ -885,6 +1002,45 @@
 
     <para>Subversion的锁定特性当前限制到文件—还没有可能限制整个目录树的访问。</para>
 
+<sidebar id="svn.advanced.locking.meanings">
+      <title>Three meanings of <quote>lock</quote></title>
+
+      <para>In this section, and almost everywhere in this book, the
+        words <quote>lock</quote> and <quote>locking</quote> describe
+        a mechanism for mutual exclusion between users to avoid
+        clashing commits. Unfortunately, there are two other sorts
+        of <quote>lock</quote> with which Subversion, and therefore
+        this book, sometimes needs to be concerned.</para>
+
+      <itemizedlist>
+
+        <listitem><para><firstterm>Working copy locks</firstterm>,
+          used internally by Subversion to prevent clashes between
+          multiple Subversion clients operating on the same working
+          copy. This is the sort of lock indicated by
+          an <computeroutput>L</computeroutput> in the third column
+          of <command>svn status</command> output, and removed by
+          the <command>svn cleanup</command> command, as described in
+          <xref linkend="svn.tour.other.cleanup"/>.</para>
+        </listitem>
+
+        <listitem><para><firstterm>Database locks</firstterm>, used
+          internally by the Berkeley DB backend to prevent clashes
+          between multiple programs trying to access the
+          database. This is the sort of lock whose unwanted
+          persistence after an error can cause a repository to
+          be <quote>wedged</quote>, as described in
+          <xref linkend="svn.reposadmin.maint.recovery"/>.</para>
+        </listitem>
+
+      </itemizedlist>
+
+      <para>You can generally forget about these other sorts of lock,
+        until something goes wrong that requires you to care about
+        them. In this book, <quote>lock</quote> means the first sort
+        unless the contrary is either clear from context or explicitly
+        stated.</para>
+    </sidebar>
     <!-- =============================================================== -->
     <sect2 id="svn.advanced.locking.creation">
       <title>创建锁定</title>
@@ -1235,7 +1391,14 @@
   <sect1 id="svn.advanced.pegrevs">
     <title>Peg和实施修订版本</title>
 
-    <para>文件和目录的拷贝、移动和改名能力可以让我们可以删除一个对象,然后在同样的路径添加一个新的—这是我们在电脑上对文件和目录经常作的操作,我们认为这些操作都是理所当然的。Subversion很乐意你认为这些操作已经赋予给你,Subversion的文件管理操作是这样的解放,提供了几乎和普通文件一样的操作版本化文件的灵活性,但是灵活意味着在整个版本库的生命周期中,一个给定的版本化的资源可能会出现在许多不同的路径,一个给定的路径会展示给我们许多完全不同的版本化资源。</para>
+    <para>The ability to copy, move, and rename files and directories;
+      to be able to create an object, then delete it and then add a
+      new one at the same path—those are operations which we
+      perform on files and directories on our computers all the time,
+      and operations we tend to take for granted.  And Subversion
+      would like you to think they are granted. ,Subversion的文件管理操作是这样的开放,提供了几乎和普通文件一样的操作版本化文件的灵活性,但是灵活意味着在整个版本库的生命周期中,一个给定的版本化的资源可能会出现在许多不同的路径,一个给定的路径会展示给我们许多完全不同的版本化资源。And this
+      introduces a certain level of complexity to your interactions
+      with those paths and resources.</para>
 
     <para>Subversion可以非常聪明的注意到一个对象的版本历史变化包括一个<quote>地址改变</quote>,举个例子,如果你询问一个曾经上周改过名的文件的所有的日志信息,Subversion会很高兴提供所有的日志—重命名发生的修订版本,外加相关版本之前和之后的修订版本日志,所以大多数时间里,你不需要考虑这些事情,但是偶尔,Subversion会需要你的帮助来清除混淆。</para>
 

Modified: trunk/src/zh/book/ch08.xml
==============================================================================
--- trunk/src/zh/book/ch08.xml	(original)
+++ trunk/src/zh/book/ch08.xml	Tue Sep 26 09:08:44 2006
@@ -98,7 +98,7 @@
     <para>模块化的另一个好处是我们有能力去构造一个全新的,能够完全实现相同API功能的库,以替换整个给定的模块,而又不会影响基础代码。在某种意义上,Subversion已经这样做了。libsvn_ra_dav、libsvn_ra_local和libsvn_ra_svn all都实现了相同的接口,三者均与版本库层进行通讯—libsvn_ra_dav和libsvn_ra_svn通过网络,而libsvn_ra_local则是直接连接,libsvn_fs_base和libsvn_fs_fs是另外两个例子。
    </para>
 
-    <para>客户端设计本身就给模块化设计理念增色不少,Subversion目前只是附带了一个命令行方式的客户端,但已经出现了一些由第三方开发的GUI客户端程序,这些GUI客户端程序全都使用了与原装命令行客户端程序相同的API。为了开发一个实用的Subversion客户端程序,对于绝大部分功能,仅使用Subversion的libsvn_client库就够了(见<xref
+    <para>客户端设计本身就给模块化设计理念增色不少,Subversion本身只是附带了一个命令行方式的客户端,但已经出现了一些由第三方开发的不同GUI的客户端,这些GUI客户端程序全都使用了与原装命令行客户端程序相同的API。为了开发一个实用的Subversion客户端程序,对于绝大部分功能,仅使用Subversion的libsvn_client库就够了(见<xref
       linkend="svn.developer.layerlib.client"/>)。</para>
 
     <!-- =============================================================== -->
@@ -333,7 +333,7 @@
   
         <para>Subversion的主要网络服务器是Apache HTTP服务器,Apache是久经考验的用来认真使用的开源服务器,它可以支撑很大的网络压力并且可以运行在多种平台。Apache服务器支持多种认证协议,而且可以通过模块扩展使用其它协议。它也支持流水线和缓存之类的网络优化。通过将Apache作为服务器,Subversion轻易得到这些特性。而且因为许多防火墙已经允许HTTP通过,系统管理员通常不会改变防火墙设置来允许Subversion工作。</para>
   
-        <para>Subversion使用HTTP和WebDAV(和DeltaV)来与Apache服务器通讯,你可以在本章的WebDAV读到更多信息,但简而言之,WebDAV和DeltaV是标准HTTP 1.1协议的扩展,允许在web上对文件进行分享和版本操作。Apache 2.0版随着一个mod_dav,一个Apache理解HTTP DAV扩展的模块,Subversion本身提供了mod_dav_svn,尽管,这是另一个Apache模块,它与mod_dav结合(实际上mod_dav_svn是作为后端支持)使用来提供Subversion对WebDAV和DeltaV的实现。</para>
+        <para>Subversion使用HTTP和WebDAV(和DeltaV)来与Apache服务器通讯,你可以在本章的WebDAV读到更多信息,但简而言之,WebDAV和DeltaV是标准HTTP 1.1协议的扩展,允许在web上对文件进行分享和版本操作。Apache的2.0及以后的版本都包含一个mod_dav,一个Apache理解HTTP DAV扩展的模块,Subversion本身提供了mod_dav_svn,尽管,这是另一个Apache模块,它与mod_dav结合(实际上mod_dav_svn是作为后端支持)使用来提供Subversion对WebDAV和DeltaV的实现。</para>
 
         <para>当与版本库通过HTTP通讯时,RA加载器库选择libsvn_ra_dav作为正确的访问模块,Subversion客户端调用原始的RA接口,libsvn_ra_dav把这些调用(包含了大量Subversion操作)影射为一系列HTTP/WebDAV请求。使用Neon库,libsvn_ra_dav把这些请求传递到Apache服务器,Apache接受到这些请求(就像平时web服务器常做的那样处理原始的HTTP请求),注意到这些请求的URL已经配置为DAV的位置(使用<filename>httpd.conf</filename>的<literal><Location></literal>指示),并且会使用自己的mod_dav模块来处理。当正确的配置了mod_dav使之知道了使用mod_dav_svn来处理所有文件系统相关的要求,而不是使用默认的Apache自带的原始mod_dav_fs来处理。所以最终客户端是与mod_dav_svn通讯,直接与Subversion版本库层绑定。</para>
   
@@ -545,10 +545,15 @@
         sys.stderr.write("Usage: %s REPOS_PATH\n"
                          % (os.path.basename(sys.argv[0])))
         sys.exit(1)
+        
+    # Canonicalize (enough for Subversion, at least) the repository path.
+    repos_path = os.path.normpath(sys.argv[1])
+    if repos_path == '.': 
+        repos_path = ''
 
     # Call the app-wrapper, which takes care of APR initialization/shutdown
     # and the creation and cleanup of our top-level memory pool.
-    svn.core.run_app(crawl_youngest, os.path.normpath(sys.argv[1]))
+    svn.core.run_app(crawl_youngest, repos_path)
 
 </programlisting>
       </example>
@@ -665,10 +670,15 @@
             verbose = 1
     if len(args) != 1:
         usage_and_exit(2)
+        
+    # Canonicalize (enough for Subversion, at least) the working copy path.
+    wc_path = os.path.normpath(args[0])
+    if wc_path == '.': 
+        wc_path = ''
             
     # Call the app-wrapper, which takes care of APR initialization/shutdown
     # and the creation and cleanup of our top-level memory pool.
-    svn.core.run_app(do_status, os.path.normpath(args[0]), verbose)
+    svn.core.run_app(do_status, wc_path, verbose)
 </programlisting>
       </example>
 

Modified: trunk/src/zh/book/foreword.xml
==============================================================================
--- trunk/src/zh/book/foreword.xml	(original)
+++ trunk/src/zh/book/foreword.xml	Tue Sep 26 09:08:44 2006
@@ -26,7 +26,7 @@
 
     <para>新书的三位合著者因而面临着一个不寻常的机会。从职责上讲,他们的任务是从一个目录和一些草稿为基础,自上而下的写一部专著。但事实上,他们的灵感源泉则来自一些具体的内容,稳定却难以组织。Subversion被数以千计的早期用户采用,这些用户提供了大量的反馈,不仅仅针对Subversion,还包括业已存在的文档。</para>
 
-<para>在写这本书的过程里,Ben,Mike 和 Brian一直像鬼魂一样游荡在Subversion邮件列表和聊天室中,仔细的研究用户实际遇到的问题。监视这些反馈是他们在CollabNet工作的一部分,这给他们撰写Subversion文档提供了巨大的便利。这本书建立在丰富的使用经验,而非在流沙般脆弱的想象之上,它结合了用户手册和FAQ的优点。初次阅读时,这种二元性的优势并不明显,按照顺序,从前到后,这本书只是简单的从头到尾描述了软件的细节。书中的内容包括一章概述,一章必不可少的快速指南,一章关于管理配置,一些高级主题,当然还包括命令参考手册和故障排除指南。而当你过一段时间之后,再次翻开本书查找一些特定问题的解决方案时,这种优势才得以显现:这些生动的细节一定来自不可预测的实际用例的提炼,大多是源于用户的需要和视点。</para>
+<para>在写这本书的过程里,Ben,Mike 和 Brian一直像鬼魂一样游荡在Subversion邮件列表和聊天室中,仔细的研究用户实际遇到的问题。监视这些反馈是他们在CollabNet工作的一部分,这给他们撰写Subversion文档提供了巨大的便利。这本书建立在丰富的使用经验,而非在流沙般脆弱的想象之上,它结合了用户手册和FAQ的优点。初次阅读时,这种二元性的优势并不明显,按照顺序,从前到后,这本书只是简单的从头到尾描述了软件的细节。书中的内容包括一章概述,一章必不可少的快速指南,一章关于管理配置,一些高级主题,当然还包括命令参考手册和故障排除指南。而当你过一段时间之后,再次翻开本书查找一些特定问题的解决方案时,这种二元性才得以显现:这些生动的细节一定来自不可预测的实际用例的提炼,大多是源于用户的需要和视点。</para>
 
     <para>当然,没人可以承诺这本书可以回答所有问题。尽管有时候一些前人提问的惊人一致性让你感觉是心灵感应;你仍有可能在社区的知识库里摔跤,空手而归。如果有这种情况,最好的办法是写明问题发送email到<email>users at subversion.tigris.org</email>,作者还在那里关注着社区,不仅仅封面提到的三位,还包括许多曾经作出修正与提供原始材料的人。从社区的视角,帮你解决问题只是逐步的调整这本书,进一步调整Subversion本身以更合理的适合用户使用这样一个大工程的一个有趣的额外效用。他们渴望你的信息,不仅仅可以帮助你,也因为可以帮助他们。与Subversion这样活跃的自由软件项目一起,<emphasis>你并不孤单</emphasis>。</para>
 




More information about the svnbook-dev mailing list