<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rock Sun's Blog &#187; subversion</title>
	<atom:link href="http://rocksun.cn/category/subversion/feed/" rel="self" type="application/rss+xml" />
	<link>http://rocksun.cn</link>
	<description>Blogger's Blog</description>
	<lastBuildDate>Sun, 05 Feb 2012 18:50:11 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>当QQ群开始技术讨论</title>
		<link>http://rocksun.cn/when-qq-group-become-discussion-forum/</link>
		<comments>http://rocksun.cn/when-qq-group-become-discussion-forum/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 15:39:38 +0000</pubDate>
		<dc:creator>rocksun</dc:creator>
				<category><![CDATA[subversion]]></category>
		<category><![CDATA[qq]]></category>
		<category><![CDATA[讨论]]></category>

		<guid isPermaLink="false">http://rocksun.cn/?p=518</guid>
		<description><![CDATA[


我曾经希望使用IRC来代替Subversion中文站的一些QQ群，不过受到了QQ群友的一致反对。当我提出Subversion项目也使用IRC讨论时，好多群友提出邀请Subversion的开发人员加入我们的群，让他们感受一下QQ群的魅力，所以我知道，大家需要QQ群.
不过，无论采用什么平台，所有的参与者都应该学会一些技巧，让我们的交流能更加简单一点。
我看到一条系统信息“SVN求助”，好的，加你入群，然后就出现了这么一句：
有人在吗？
谁答应啊？对此，我常常犹豫不决，没人理，他一定很伤心，可是我接上话，可就要回答了，万一我不会怎么办？
有人会用某某吗？
考别人阿？我会用，不过我不一定帮上你，让我回答吗？
有人用过某某吗？ 
同上，但我很怀疑自己。
 有人熟悉某某吗？
即使我会也不好意思回答是，因为真的很容易面对难以解决的问题。
打扰一下，请教一个问题可以吗？
太有礼貌了，继续吧，既然没经过允许已经问了&#8230;
这样的开场白都是失败的，它们的主人如果足够礼貌，一般都会面对一段长时间的等待。其实最简单的做法还是直接说明自己问题，说清楚自己的目标、出现问题的环境、自己所做的各种尝试、以及准确的输出信息。我想，没有人会觉得这是不礼貌，最不礼貌的是自己没有做过任何努力和分析，就把问题没头没脑的抛到群里。另外一种常见的错误是经过太多个人加工的问题，例如“我想解决啥就能解决这个问题”，实际上呢，他只是提出了一个他自己以为的问题，实际的问题被隐藏在了背后，可能很简单。
最后，当我们聊了好长时间后，我最怕看到下面的结果：
虽然你说的和我说的不是一会儿事，但是还是谢谢你？
这让我很伤心。所有努力都已经白费，为什么，是不是我太笨啊？
最后说一下我们的群号码11097243、21860927（近似满）。
更新：在互联网上有一份更全面的“提问的智慧”，希望大家获益，感谢Pan Wenmin。


No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<p>我曾经希望使用IRC来代替<a href="http://www.subversion.org.cn">Subversion中文站</a>的一些QQ群，不过受到了QQ群友的一致反对。当我提出Subversion项目也使用IRC讨论时，好多群友提出邀请Subversion的开发人员加入我们的群，让他们感受一下QQ群的魅力，所以我知道，大家需要QQ群.</p>
<p>不过，无论采用什么平台，所有的参与者都应该学会一些技巧，让我们的交流能更加简单一点。</p>
<p>我看到一条系统信息“SVN求助”，好的，加你入群，然后就出现了这么一句：</p>
<p><span style="color: #ffcc99;"><strong>有人在吗？</strong></span></p>
<blockquote><p>谁答应啊？对此，我常常犹豫不决，没人理，他一定很伤心，可是我接上话，可就要回答了，万一我不会怎么办？</p></blockquote>
<p><span style="color: #ffff99;">有人会用某某吗？</span></p>
<blockquote><p>考别人阿？我会用，不过我不一定帮上你，让我回答吗？</p></blockquote>
<p><span style="color: #ccffcc;">有人用过某某吗？ </span></p>
<blockquote><p>同上，但我很怀疑自己。</p></blockquote>
<p><span style="color: #ccffff;"> 有人熟悉某某吗？</span></p>
<blockquote><p>即使我会也不好意思回答是，因为真的很容易面对难以解决的问题。</p></blockquote>
<p><span style="color: #99ccff;">打扰一下，请教一个问题可以吗？</span></p>
<blockquote><p>太有礼貌了，继续吧，既然没经过允许已经问了&#8230;</p></blockquote>
<p>这样的开场白都是失败的，它们的主人如果足够礼貌，一般都会面对一段长时间的等待。其实最简单的做法还是直接说明自己问题，说清楚自己的目标、出现问题的环境、自己所做的各种尝试、以及准确的输出信息。我想，没有人会觉得这是不礼貌，最不礼貌的是自己没有做过任何努力和分析，就把问题没头没脑的抛到群里。另外一种常见的错误是经过太多个人加工的问题，例如“<span style="color: #ffcc00;">我想解决啥就能解决这个问题</span>”，实际上呢，他只是提出了一个他自己以为的问题，实际的问题被隐藏在了背后，可能很简单。</p>
<p>最后，当我们聊了好长时间后，我最怕看到下面的结果：</p>
<p><span style="color: #cc99ff;">虽然你说的和我说的不是一会儿事，但是还是谢谢你？</span></p>
<blockquote><p>这让我很伤心。所有努力都已经白费，为什么，是不是我太笨啊？</p></blockquote>
<p>最后说一下我们的群号码11097243、21860927（近似满）。</p>
<p>更新：在互联网上有一份更全面的“<a href="http://www.beiww.com/doc/oss/smart-questions.html">提问的智慧</a>”，希望大家获益，感谢Pan Wenmin。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://rocksun.cn/when-qq-group-become-discussion-forum/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>一个管理密码的小工具</title>
		<link>http://rocksun.cn/a-password-tools/</link>
		<comments>http://rocksun.cn/a-password-tools/#comments</comments>
		<pubDate>Wed, 21 Jan 2009 16:50:59 +0000</pubDate>
		<dc:creator>rocksun</dc:creator>
				<category><![CDATA[subversion]]></category>
		<category><![CDATA[password]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://rocksun.cn/?p=450</guid>
		<description><![CDATA[好多Subversion用户总要寻找用户自己修改密码的方法，今天发现一个工具passwd，支持 Poppassd, LDAP, Unix expect scripts, the Unix smbpasswd command for SMB/CIFS passwords, Kolab, ADSI, Pine, Serv-U FTP, VMailMgr, vpopmail,以及SQL passwords，看来你无论用什么认证方式，这个工具都能给你一个Web界面管理密码。
对了，这个工具是PHP写的，所以需要一个PHP运行环境。


Related posts:贫民窟的百万富翁分支模式-软件配置管理（SCM）模式介绍疯狂的赛车



Related posts:<ol><li><a href='http://rocksun.cn/slumdog-millionaire/' rel='bookmark' title='Permanent Link: 贫民窟的百万富翁'>贫民窟的百万富翁</a></li><li><a href='http://rocksun.cn/scm-pattern-intros/' rel='bookmark' title='Permanent Link: 分支模式-软件配置管理（SCM）模式介绍'>分支模式-软件配置管理（SCM）模式介绍</a></li><li><a href='http://rocksun.cn/crazy-racer/' rel='bookmark' title='Permanent Link: 疯狂的赛车'>疯狂的赛车</a></li></ol>

]]></description>
			<content:encoded><![CDATA[<p>好多Subversion用户总要寻找用户自己修改密码的方法，今天发现一个工具<a href="http://www.horde.org/passwd/">passwd</a>，支持 Poppassd, LDAP, Unix expect scripts, the Unix smbpasswd command for SMB/CIFS passwords, Kolab, ADSI, Pine, Serv-U FTP, VMailMgr, vpopmail,以及SQL passwords，看来你无论用什么认证方式，这个工具都能给你一个Web界面管理密码。</p>
<div class="wp-caption alignnone" style="width: 412px"><a href="http://www.horde.org/passwd/screenshots/passwd.png"><img title="passwd" src="http://www.horde.org/passwd/screenshots/passwd.png" alt="passwd" width="402" height="301" /></a><p class="wp-caption-text">passwd</p></div>
<p>对了，这个工具是PHP写的，所以需要一个PHP运行环境。</p>


<p>Related posts:<ol><li><a href='http://rocksun.cn/slumdog-millionaire/' rel='bookmark' title='Permanent Link: 贫民窟的百万富翁'>贫民窟的百万富翁</a></li><li><a href='http://rocksun.cn/scm-pattern-intros/' rel='bookmark' title='Permanent Link: 分支模式-软件配置管理（SCM）模式介绍'>分支模式-软件配置管理（SCM）模式介绍</a></li><li><a href='http://rocksun.cn/crazy-racer/' rel='bookmark' title='Permanent Link: 疯狂的赛车'>疯狂的赛车</a></li></ol></p>
<p></p>]]></content:encoded>
			<wfw:commentRss>http://rocksun.cn/a-password-tools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dreamhost上编译Subversion</title>
		<link>http://rocksun.cn/install-subversion-on-dreamhost/</link>
		<comments>http://rocksun.cn/install-subversion-on-dreamhost/#comments</comments>
		<pubDate>Fri, 16 Jan 2009 09:15:57 +0000</pubDate>
		<dc:creator>rocksun</dc:creator>
				<category><![CDATA[subversion]]></category>
		<category><![CDATA[dreamhost]]></category>
		<category><![CDATA[install]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://rocksun.cn/?p=425</guid>
		<description><![CDATA[因为Dreamhost主机上的Subversion不是最新的1.5，所以决定自己编译一个。
SSH登录到Dreamhost主机，下载最新的Subversion源代码包以及dep包：
mkdir soft
cd soft
wget http://subversion.tigris.org/downloads/subversion-1.5.5.tar.gz
wget http://subversion.tigris.org/downloads/subversion-deps-1.5.5.tar.gz
解压缩：
tar xzvf subversion-1.5.5.tar.gz
tar xzvf subversion-deps-1.5.5.tar.gz
进入目录：
cd subversion-1.5.5
设定环境变量
export RUN=${HOME}
因为我的python是自己重新安装的，安装在${home}/opt/bin中，所以还要执行下面这一步：

# ${PYVERS} Python version
export PYVERS=`${RUN}/opt/bin/python -V 2&#62;&#38;1 &#124; cut -d ' ' -f 2`
# ${PYLIBPKG} Python library site packages directory
export PYLIBPKG=`${RUN}/opt/bin/python &#60;&#60;EOF
import sys
print sys.path[-1]
EOF`

然后为了生成python绑定，还要输入如下内容：

SVNPYTHON=" PYTHON=${RUN}/opt/bin/python"

然后运行：
./configure ${SVNPYTHON} ${SVNRUBY} &#8211;prefix=${RUN} \          &#8211;without-berkeley-db &#8211;with-ssl &#8211;enable-shared \    [...]


Related posts:<ol><li><a href='http://rocksun.cn/svnchanged-export/' rel='bookmark' title='Permanent Link: Subversion: Export changed Files in a revision range'>Subversion: Export changed Files in a revision range</a></li><li><a href='http://rocksun.cn/export-subversion-files-in-a-range/' rel='bookmark' title='Permanent Link: Subversion导出修订版本范围中修改过的文件'>Subversion导出修订版本范围中修改过的文件</a></li><li><a href='http://rocksun.cn/upload-file-changed/' rel='bookmark' title='Permanent Link: 上传工作拷贝中改变的文件'>上传工作拷贝中改变的文件</a></li></ol>

]]></description>
			<content:encoded><![CDATA[<p>因为Dreamhost主机上的Subversion不是最新的1.5，所以决定自己编译一个。</p>
<p>SSH登录到Dreamhost主机，下载最新的Subversion源代码包以及dep包：</p>
<blockquote><p>mkdir soft</p>
<p>cd soft</p>
<p>wget http://subversion.tigris.org/downloads/subversion-1.5.5.tar.gz</p>
<p>wget http://subversion.tigris.org/downloads/subversion-deps-1.5.5.tar.gz</p></blockquote>
<p>解压缩：</p>
<blockquote><p>tar xzvf subversion-1.5.5.tar.gz</p>
<p>tar xzvf subversion-deps-1.5.5.tar.gz</p></blockquote>
<p>进入目录：</p>
<blockquote><p>cd subversion-1.5.5</p></blockquote>
<p>设定环境变量</p>
<blockquote><p>export RUN=${HOME}</p></blockquote>
<p>因为我的python是自己重新安装的，安装在${home}/opt/bin中，所以还要执行下面这一步：</p>
<blockquote>
<pre># ${PYVERS} Python version
export PYVERS=`${RUN}/opt/bin/python -V 2&gt;&amp;1 | cut -d ' ' -f 2`
# ${PYLIBPKG} Python library site packages directory
export PYLIBPKG=`${RUN}/opt/bin/python &lt;&lt;EOF
import sys
print sys.path[-1]
EOF`</pre>
</blockquote>
<p>然后为了生成python绑定，还要输入如下内容：</p>
<blockquote>
<pre>SVNPYTHON=" PYTHON=${RUN}/opt/bin/python"</pre>
</blockquote>
<p>然后运行：</p>
<blockquote><p>./configure ${SVNPYTHON} ${SVNRUBY} &#8211;prefix=${RUN} \          &#8211;without-berkeley-db &#8211;with-ssl &#8211;enable-shared \          ${SVNSWIG}</p></blockquote>
<p>然后就是漫长的等待，如果没有发现error，下面</p>
<blockquote><p>make</p>
<p>make install</p></blockquote>
<p>然后在$HOME/.bash_profile下增加</p>
<blockquote><p>export PATH=$HOME/bin:$PATH</p>
<p>source $HOME/.bash_profile</p></blockquote>
<p>最后看结果：</p>
<blockquote><p>[coke]$ svn &#8211;version<br />
svn, version 1.5.5 (r34862)<br />
compiled Jan 16 2009, 00:48:07</p>
<p>Copyright (C) 2000-2008 CollabNet.<br />
Subversion is open source software, see http://subversion.tigris.org/<br />
This product includes software developed by CollabNet (http://www.Collab.Net/).</p>
<p>The following repository access (RA) modules are available:</p>
<p>* ra_neon : Module for accessing a repository via WebDAV protocol using Neon.<br />
- handles &#8216;http&#8217; scheme<br />
- handles &#8216;https&#8217; scheme<br />
* ra_svn : Module for accessing a repository using the svn network protocol.<br />
- handles &#8217;svn&#8217; scheme<br />
* ra_local : Module for accessing a repository on local disk.<br />
- handles &#8216;file&#8217; scheme<br />
* ra_serf : Module for accessing a repository via WebDAV protocol using serf.<br />
- handles &#8216;http&#8217; scheme<br />
- handles &#8216;https&#8217; scheme</p></blockquote>
<p>安装完成。</p>
<p>参考文档：</p>
<p><a href="http://wiki.dreamhost.com/Subversion_Installation">http://wiki.dreamhost.com/Subversion_Installation</a></p>


<p>Related posts:<ol><li><a href='http://rocksun.cn/svnchanged-export/' rel='bookmark' title='Permanent Link: Subversion: Export changed Files in a revision range'>Subversion: Export changed Files in a revision range</a></li><li><a href='http://rocksun.cn/export-subversion-files-in-a-range/' rel='bookmark' title='Permanent Link: Subversion导出修订版本范围中修改过的文件'>Subversion导出修订版本范围中修改过的文件</a></li><li><a href='http://rocksun.cn/upload-file-changed/' rel='bookmark' title='Permanent Link: 上传工作拷贝中改变的文件'>上传工作拷贝中改变的文件</a></li></ol></p>
<p></p>]]></content:encoded>
			<wfw:commentRss>http://rocksun.cn/install-subversion-on-dreamhost/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>上传工作拷贝中改变的文件</title>
		<link>http://rocksun.cn/upload-file-changed/</link>
		<comments>http://rocksun.cn/upload-file-changed/#comments</comments>
		<pubDate>Fri, 09 Jan 2009 18:30:25 +0000</pubDate>
		<dc:creator>rocksun</dc:creator>
				<category><![CDATA[subversion]]></category>
		<category><![CDATA[ftp]]></category>
		<category><![CDATA[pysvn]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[upload]]></category>

		<guid isPermaLink="false">http://rocksun.cn/?p=391</guid>
		<description><![CDATA[使用Subversion管理网站代码是一个好习惯，修改一点，可以上传直接调试，如果出了错，可以回到以前的版本。不过如果要反复修改，而且同时提交不同目录的文件，使用ftp工具会很别扭。需要跳到各个目录去上传文件，还要小心不要将subversion的.svn目录也上传了上去。
所以根据上一个导出Subversion指定范围的pythong的脚本，我又写了一个脚本，可以将工作拷贝中修改的文件上传到ftp服务器的对应目录，和上一个脚本一样，这个脚本需要安装pysvn，而我的脚本在http://svn-script.googlecode.com/svn/trunk/tools/svnchanged_ftp.py。
使用方式很简单，将上面的脚本存放到一个位置，在工作拷贝的根目录写一个批处理，内容如下：
python.exe F:\rocksun\svn-script\tools\svnchanged_ftp.py &#8211;ftphost 192.168.0.121 &#8211;ftpuser username &#8211;ftppassword userpassword &#8211;ftppath www  F:\websites\rocksun.cn\www
分别通过&#8211;ftphost、&#8211;ftpuser、&#8211;ftppassword、&#8211;ftppath分别指定ftp主机的ip、用户、密码和ftp服务器上和工作拷贝对应的根路径，最后的一个参数是本地工作拷贝根的路径，和ftppath对应。
运行这个bat，就可以检查工作拷贝F:\websites\rocksun.cn\www已经修改得文件，然后ftp到对应的服务器目录上。现在只能上传改变的，还不能上传最近修改过但已经提交的文件，一个缺陷，不过这个缺陷可以通过我上一个脚本弥补，要是谁有这个需求，可以告诉我，我将这个缺憾弥补起来。
我用这个脚本帮助我修改本站的模板，很舒服啊，修改了好几个目录的文件，一个批处理就把所有的修改提交了。只是这blog是越来越难看了，技术不行啊。


Related posts:Subversion: Export changed Files in a revision rangeSubversion导出修订版本范围中修改过的文件Resize Image In Context Menu



Related posts:<ol><li><a href='http://rocksun.cn/svnchanged-export/' rel='bookmark' title='Permanent Link: Subversion: Export changed Files in a revision range'>Subversion: Export changed Files in a revision range</a></li><li><a href='http://rocksun.cn/export-subversion-files-in-a-range/' rel='bookmark' title='Permanent Link: Subversion导出修订版本范围中修改过的文件'>Subversion导出修订版本范围中修改过的文件</a></li><li><a href='http://rocksun.cn/resize-image-in-context-menu/' rel='bookmark' title='Permanent Link: Resize Image In Context Menu'>Resize Image In Context Menu</a></li></ol>

]]></description>
			<content:encoded><![CDATA[<p>使用Subversion管理网站代码是一个好习惯，修改一点，可以上传直接调试，如果出了错，可以回到以前的版本。不过如果要反复修改，而且同时提交不同目录的文件，使用ftp工具会很别扭。需要跳到各个目录去上传文件，还要小心不要将subversion的.svn目录也上传了上去。</p>
<p>所以根据上一个<a href="http://rocksun.cn/export-subversion-files-in-a-range/">导出Subversion指定范围的pythong的脚本</a>，我又写了一个脚本，可以将工作拷贝中修改的文件上传到ftp服务器的对应目录，和上一个脚本一样，这个脚本需要安装<a href="http://pysvn.tigris.org/">pysvn</a>，而我的脚本在<a href="http://svn-script.googlecode.com/svn/trunk/tools/svnchanged_ftp.py">http://svn-script.googlecode.com/svn/trunk/tools/svnchanged_ftp.py</a>。</p>
<p>使用方式很简单，将上面的脚本存放到一个位置，在工作拷贝的根目录写一个批处理，内容如下：</p>
<blockquote><p>python.exe F:\rocksun\svn-script\tools\svnchanged_ftp.py &#8211;ftphost 192.168.0.121 &#8211;ftpuser username &#8211;ftppassword userpassword &#8211;ftppath www  F:\websites\rocksun.cn\www</p></blockquote>
<p>分别通过&#8211;ftphost、&#8211;ftpuser、&#8211;ftppassword、&#8211;ftppath分别指定ftp主机的ip、用户、密码和ftp服务器上和工作拷贝对应的根路径，最后的一个参数是本地工作拷贝根的路径，和ftppath对应。</p>
<p>运行这个bat，就可以检查工作拷贝F:\websites\rocksun.cn\www已经修改得文件，然后ftp到对应的服务器目录上。现在只能上传改变的，还不能上传最近修改过但已经提交的文件，一个缺陷，不过这个缺陷可以通过我上一个脚本弥补，要是谁有这个需求，可以告诉我，我将这个缺憾弥补起来。</p>
<p>我用这个脚本帮助我修改本站的模板，很舒服啊，修改了好几个目录的文件，一个批处理就把所有的修改提交了。只是这blog是越来越难看了，技术不行啊。</p>


<p>Related posts:<ol><li><a href='http://rocksun.cn/svnchanged-export/' rel='bookmark' title='Permanent Link: Subversion: Export changed Files in a revision range'>Subversion: Export changed Files in a revision range</a></li><li><a href='http://rocksun.cn/export-subversion-files-in-a-range/' rel='bookmark' title='Permanent Link: Subversion导出修订版本范围中修改过的文件'>Subversion导出修订版本范围中修改过的文件</a></li><li><a href='http://rocksun.cn/resize-image-in-context-menu/' rel='bookmark' title='Permanent Link: Resize Image In Context Menu'>Resize Image In Context Menu</a></li></ol></p>
<p></p>]]></content:encoded>
			<wfw:commentRss>http://rocksun.cn/upload-file-changed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subversion: Export changed Files in a revision range</title>
		<link>http://rocksun.cn/svnchanged-export/</link>
		<comments>http://rocksun.cn/svnchanged-export/#comments</comments>
		<pubDate>Tue, 06 Jan 2009 11:58:33 +0000</pubDate>
		<dc:creator>rocksun</dc:creator>
				<category><![CDATA[recommend]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[changed]]></category>
		<category><![CDATA[export]]></category>
		<category><![CDATA[pysvn]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[revision]]></category>

		<guid isPermaLink="false">http://rocksun.cn/?p=360</guid>
		<description><![CDATA[A friend of mine asked  me if  subversion has a function to export changed Files in a revision range, because she want to send the zipped exported directory to customer to overwrite the old version. After googled, I find a Windows BAT(with linux tools) , a java and a TortoiseSVN solution.  I think the solutions [...]


Related posts:<ol><li><a href='http://rocksun.cn/export-subversion-files-in-a-range/' rel='bookmark' title='Permanent Link: Subversion导出修订版本范围中修改过的文件'>Subversion导出修订版本范围中修改过的文件</a></li><li><a href='http://rocksun.cn/upload-file-changed/' rel='bookmark' title='Permanent Link: 上传工作拷贝中改变的文件'>上传工作拷贝中改变的文件</a></li><li><a href='http://rocksun.cn/subversion-15-releasenotes/' rel='bookmark' title='Permanent Link: Subversion 1.5发布说明'>Subversion 1.5发布说明</a></li></ol>

]]></description>
			<content:encoded><![CDATA[<p>A friend of mine asked  me if  subversion has a function to export changed Files in a revision range, because she want to send the zipped exported directory to customer to overwrite the old version. After googled, I find a <a href="http://svn.haxx.se/users/archive-2007-06/0977.shtml">Windows BAT(with linux tools)</a> , a<a href="http://orangepips.instantspot.com/blog/2008/03/06/Export-Subversion-Files-Changed-between-Two-Revision-Numbers"> java</a> and a TortoiseSVN solution.  I think the solutions above all have its own defect, So I decided to write a cross platform script with python.</p>
<p>The script is  here: <a onclick="javascript:pageTracker._trackPageview('/outbound/article/svn-script.googlecode.com');" href="http://svn-script.googlecode.com/svn/trunk/tools/svnchanged_export.py">http://svn-script.googlecode.com/svn/trunk/tools/svnchanged_export.py</a>. This script needs python 2.5 or greater and <a href="http://pysvn.tigris.org/">pysvn</a>. To export files changed between 20 and HEAD(newest) at URL svn://192.168.101.1/lynx/trunk/ to directory dist, we can input:</p>
<blockquote><p>python svnchanged_export.py -u username -p password -r 20:HEAD svn://192.168.101.1/lynx/trunk/ dist</p></blockquote>
<p>The exported files will organized as the original structure, and the revision is HEAD. The -u(&#8211;username) and (-p)(&#8211;password) is optional. If omited, the script may use the cached authentication information.  The files will export to directory dist. The -r(&#8211;revision) also accept integer value like &#8220;-r 10:20&#8243;, then the exported file&#8217;s revision would be 20.</p>
<p>Any problems can comment here.</p>


<p>Related posts:<ol><li><a href='http://rocksun.cn/export-subversion-files-in-a-range/' rel='bookmark' title='Permanent Link: Subversion导出修订版本范围中修改过的文件'>Subversion导出修订版本范围中修改过的文件</a></li><li><a href='http://rocksun.cn/upload-file-changed/' rel='bookmark' title='Permanent Link: 上传工作拷贝中改变的文件'>上传工作拷贝中改变的文件</a></li><li><a href='http://rocksun.cn/subversion-15-releasenotes/' rel='bookmark' title='Permanent Link: Subversion 1.5发布说明'>Subversion 1.5发布说明</a></li></ol></p>
<p></p>]]></content:encoded>
			<wfw:commentRss>http://rocksun.cn/svnchanged-export/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Subversion导出修订版本范围中修改过的文件</title>
		<link>http://rocksun.cn/export-subversion-files-in-a-range/</link>
		<comments>http://rocksun.cn/export-subversion-files-in-a-range/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 20:16:20 +0000</pubDate>
		<dc:creator>rocksun</dc:creator>
				<category><![CDATA[subversion]]></category>
		<category><![CDATA[export]]></category>
		<category><![CDATA[pysvn]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[range]]></category>
		<category><![CDATA[TortoiseSVN]]></category>

		<guid isPermaLink="false">http://rocksun.cn/?p=354</guid>
		<description><![CDATA[今天在QQ群中聊到一个问题，就是导出一个修订版本范围中修改过的文件。其实这是一个常见的需求，例如向客户发布一个补丁。如果是程序员，可以运用diff和patch的方法，但是对于没有编程经验的人来说，最好是直接找到需要提交的文件，并覆盖掉原来的文件。
虽然svn本身没有支持这个功能，但是TortoiseSVN却提供了这个支持，台湾一位朋友写了一个图形教程，我整理了一下转载到了Subversion中文站。另外还有一套Java的解决方案，可以看老外的这个介绍。
不过，我觉得上面两个都还不够好，一个不是脚本，另一个则有点麻烦，于是我自己写了一个类似的脚本，使用python编写，现在做一些简要的说明。脚本可以在http://svn-script.googlecode.com/svn/trunk/tools/svnchanged_export.py下载，运行这个脚本需要python的pysvn包，可以从http://pysvn.tigris.org/servlets/ProjectDocumentList?folderID=1768下载合适的Windows版本，下载后直接安装即可。
使用这个脚本的方式也非常简单，我们就可以直接运行：
python svnchanged_export.py -u username -p password -r 20:HEAD svn://192.168.101.1/lynx/trunk/ xx\yyy
例如上面的命令，用户是username，密码是password，这两个参数可以省略，那样会使用密码缓存或不需要认证。指定的修订版本范围是20到HEAD，对应的URL是 svn://192.168.101.1/lynx/trunk/。导出的文件存放到xx\yyy，默认是当前目录“.”。上面的命令执行后，xx\yy目录下就会出现修订版本HEAD（最新）和修订版本20之间发生过修改的文件，这些文件都存放在原来的相对目录中，修订版本都是最新的。这个命令还可以写为：
python svnchanged_export.py -u username -p password -r 20:90 svn://192.168.101.1/lynx/trunk/ xx\yyy
这时，比较的修订版本变成了90，而对应的输出的文件都是修订版本90的文件。
这个脚本还没有经过实践的检验，只在我的windows下验证过，所以请大家小心使用，如果有问题，可以告诉我，我会尽快解决。你也可以直接加入我建立的这个项目，自己去修改这个脚本。说实话，pysvn的接口虽好，但文档奇缺，我用到一个接口，google没有任何结果。


Related posts:Subversion: Export changed Files in a revision range上传工作拷贝中改变的文件Dreamhost上编译Subversion



Related posts:<ol><li><a href='http://rocksun.cn/svnchanged-export/' rel='bookmark' title='Permanent Link: Subversion: Export changed Files in a revision range'>Subversion: Export changed Files in a revision range</a></li><li><a href='http://rocksun.cn/upload-file-changed/' rel='bookmark' title='Permanent Link: 上传工作拷贝中改变的文件'>上传工作拷贝中改变的文件</a></li><li><a href='http://rocksun.cn/install-subversion-on-dreamhost/' rel='bookmark' title='Permanent Link: Dreamhost上编译Subversion'>Dreamhost上编译Subversion</a></li></ol>

]]></description>
			<content:encoded><![CDATA[<p>今天在QQ群中聊到一个问题，就是导出一个修订版本范围中修改过的文件。其实这是一个常见的需求，例如向客户发布一个补丁。如果是程序员，可以运用diff和patch的方法，但是对于没有编程经验的人来说，最好是直接找到需要提交的文件，并覆盖掉原来的文件。</p>
<p>虽然svn本身没有支持这个功能，但是TortoiseSVN却提供了这个支持，台湾一位朋友写了一个图形教程，我整理了一下<a href="http://www.subversion.org.cn/?action-viewnews-itemid-90">转载到了Subversion中文站</a>。另外还有一套Java的解决方案，可以看老外的<a href="http://orangepips.instantspot.com/blog/2008/03/06/Export-Subversion-Files-Changed-between-Two-Revision-Numbers">这个介绍</a>。</p>
<p>不过，我觉得上面两个都还不够好，一个不是脚本，另一个则有点麻烦，于是我自己写了一个类似的脚本，使用python编写，现在做一些简要的说明。脚本可以在<a href="http://svn-script.googlecode.com/svn/trunk/tools/svnchanged_export.py">http://svn-script.googlecode.com/svn/trunk/tools/svnchanged_export.py</a>下载，运行这个脚本需要python的pysvn包，可以从<a href="http://pysvn.tigris.org/servlets/ProjectDocumentList?folderID=1768">http://pysvn.tigris.org/servlets/ProjectDocumentList?folderID=1768</a>下载合适的Windows版本，下载后直接安装即可。</p>
<p>使用这个脚本的方式也非常简单，我们就可以直接运行：</p>
<blockquote><p>python svnchanged_export.py -u username -p password -r 20:HEAD svn://192.168.101.1/lynx/trunk/ xx\yyy</p></blockquote>
<p>例如上面的命令，用户是username，密码是password，这两个参数可以省略，那样会使用密码缓存或不需要认证。指定的修订版本范围是20到HEAD，对应的URL是 svn://192.168.101.1/lynx/trunk/。导出的文件存放到xx\yyy，默认是当前目录“.”。上面的命令执行后，xx\yy目录下就会出现修订版本HEAD（最新）和修订版本20之间发生过修改的文件，这些文件都存放在原来的相对目录中，修订版本都是最新的。这个命令还可以写为：</p>
<blockquote><p>python svnchanged_export.py -u username -p password -r 20:90 svn://192.168.101.1/lynx/trunk/ xx\yyy</p></blockquote>
<p>这时，比较的修订版本变成了90，而对应的输出的文件都是修订版本90的文件。</p>
<p>这个脚本还没有经过实践的检验，只在我的windows下验证过，所以请大家小心使用，如果有问题，可以告诉我，我会尽快解决。你也可以直接加入我建立的这个项目，自己去修改这个脚本。说实话，pysvn的接口虽好，但文档奇缺，我用到一个接口，google没有任何结果。</p>


<p>Related posts:<ol><li><a href='http://rocksun.cn/svnchanged-export/' rel='bookmark' title='Permanent Link: Subversion: Export changed Files in a revision range'>Subversion: Export changed Files in a revision range</a></li><li><a href='http://rocksun.cn/upload-file-changed/' rel='bookmark' title='Permanent Link: 上传工作拷贝中改变的文件'>上传工作拷贝中改变的文件</a></li><li><a href='http://rocksun.cn/install-subversion-on-dreamhost/' rel='bookmark' title='Permanent Link: Dreamhost上编译Subversion'>Dreamhost上编译Subversion</a></li></ol></p>
<p></p>]]></content:encoded>
			<wfw:commentRss>http://rocksun.cn/export-subversion-files-in-a-range/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>使用FreeMind</title>
		<link>http://rocksun.cn/use-freemind/</link>
		<comments>http://rocksun.cn/use-freemind/#comments</comments>
		<pubDate>Sun, 14 Dec 2008 18:16:37 +0000</pubDate>
		<dc:creator>rocksun</dc:creator>
				<category><![CDATA[subversion]]></category>
		<category><![CDATA[FreeMind]]></category>
		<category><![CDATA[gtk]]></category>
		<category><![CDATA[jre]]></category>
		<category><![CDATA[XMind]]></category>

		<guid isPermaLink="false">http://rocksun.cn/?p=223</guid>
		<description><![CDATA[准备用思维导图写一个Subversion的路线图，开始想用XMind，因为它很漂亮，但是用了一会儿才发现似乎不能导出为可点击的HTML，所以放弃。还是去寻找传统一点的FreeMind，但是竟然无法保存，无论是Ctrl+s还是菜单里的Save都没有任何反应。在google里搜了一下“FreeMind 无法保存”，没找到结果，于是跑到官方网站去看FAQ，才发现有一个明确的答复，如下：
The most obvious indication is that you click on open/save/save as and nothing happens. What is happening is that the file browser window is failing to open. There are two fixes; Either change JAVA_HOME to point to a JRE rather than a JDK or edit the Freemind.bat file to use the absolute path to [...]


Related posts:<ol><li><a href='http://rocksun.cn/install-subversion-on-dreamhost/' rel='bookmark' title='Permanent Link: Dreamhost上编译Subversion'>Dreamhost上编译Subversion</a></li><li><a href='http://rocksun.cn/fest-%e4%b8%80%e4%b8%aagui%e6%b5%8b%e8%af%95%e6%a1%86%e6%9e%b6/' rel='bookmark' title='Permanent Link: FEST &#8212; 一个GUI测试框架'>FEST &#8212; 一个GUI测试框架</a></li><li><a href='http://rocksun.cn/svnchanged-export/' rel='bookmark' title='Permanent Link: Subversion: Export changed Files in a revision range'>Subversion: Export changed Files in a revision range</a></li></ol>

]]></description>
			<content:encoded><![CDATA[<p>准备用思维导图写一个Subversion的路线图，开始想用<a title="XMind" href="http://www.xmind.net/">XMind</a>，因为它很漂亮，但是用了一会儿才发现似乎不能导出为可点击的HTML，所以放弃。还是去寻找传统一点的<a title="FreeMind" href="http://freemind.sourceforge.net/">FreeMind</a>，但是竟然无法保存，无论是Ctrl+s还是菜单里的Save都没有任何反应。在google里搜了一下“<a href="http://www.google.cn/search?q=FreeMind+无法保存&amp;hl=zh-CN&amp;sourceid=gd&amp;rlz=1Q1GPMG_zh-CNCN304CN304&amp;aq=t">FreeMind 无法保存</a>”，没找到结果，于是跑到官方网站去看FAQ，才发现有一个明确的答复，如下：</p>
<blockquote><p>The most obvious indication is that you click on open/save/save as and nothing happens. What is happening is that the file browser window is failing to open. There are two fixes; Either change JAVA_HOME to point to a JRE rather than a JDK or edit the Freemind.bat file to use the absolute path to the correct java and start Freemind with the bat file. It will be something like &#8220;C:\Program Files\Java\jre1.6.0_05\bin\java&#8221; instead of just java. Note the use of quote marks and that your java path may not be the same as the example.</p></blockquote>
<p>照着做了，可是还是没有效果，不过提示我运行Freemind.bat，结果发现保存时的错误为：</p>
<pre lang="java">Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at javax.swing.ImageIcon.(ImageIcon.java:161)
        at javax.swing.ImageIcon.(ImageIcon.java:147)</pre>
<p>原来如此，可能是AWT的问题，于是我尝试修改LookAndFeel，在Tools-&gt;Preference-&gt;Appearance-&gt; LookAndFeel中，我设置为Gtk，结果重启后就好了，样子很难看，想去试一下别的，发现都不行，只好留着Gtk了。但是总算能用了。为什么我的JRE只在Gtk下工作正常？下次装一个新的JDK再看看。</p>


<p>Related posts:<ol><li><a href='http://rocksun.cn/install-subversion-on-dreamhost/' rel='bookmark' title='Permanent Link: Dreamhost上编译Subversion'>Dreamhost上编译Subversion</a></li><li><a href='http://rocksun.cn/fest-%e4%b8%80%e4%b8%aagui%e6%b5%8b%e8%af%95%e6%a1%86%e6%9e%b6/' rel='bookmark' title='Permanent Link: FEST &#8212; 一个GUI测试框架'>FEST &#8212; 一个GUI测试框架</a></li><li><a href='http://rocksun.cn/svnchanged-export/' rel='bookmark' title='Permanent Link: Subversion: Export changed Files in a revision range'>Subversion: Export changed Files in a revision range</a></li></ol></p>
<p></p>]]></content:encoded>
			<wfw:commentRss>http://rocksun.cn/use-freemind/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>《使用Subversion进行版本控制》中文版1.4发布</title>
		<link>http://rocksun.cn/svnbook-release-chinese-14/</link>
		<comments>http://rocksun.cn/svnbook-release-chinese-14/#comments</comments>
		<pubDate>Mon, 23 Jun 2008 17:30:30 +0000</pubDate>
		<dc:creator>rocksun</dc:creator>
				<category><![CDATA[book]]></category>
		<category><![CDATA[recommend]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[1.4]]></category>
		<category><![CDATA[svnbook]]></category>
		<category><![CDATA[translation]]></category>

		<guid isPermaLink="false">http://rocksun.cn/?p=117</guid>
		<description><![CDATA[其实已经出来一段时间了，可能有些人已经看到了。本书是Subversion开发团队成员编写，纸版由O&#8217;Reilly出版，官方网站为http://svnbook.red-bean.com/。中文翻译由Subversion中文站的rocksun组织，中文1.4版本以及最新的文档可以参看如下镜像：

http://www.subversion.org.cn/svnbook/
http://process2.cn/svnbook/

另外，提供最新的TortoiseSVN文档浏览和下载：
TortoiseSVN文档
TortoiseSVN是一Windows下优秀的客户端软件，多数成员在i18n-zh中开发，最新文档可以如下：

文档浏览
PDF下载

TortoiseMerge文档
TortoiseMerge是TortoiseSVN配套的比较合并工具：

文档浏览
PDF下载

不过最近这些文档翻译的进度不是很好，例如TortoiseSVN，以前有一段时间大家突击翻译了许多，但是最新的还是差的挺多的，所以这里也想征集一下志愿者，主要有如下一些内容的翻译：
翻译项目
Subversion FAQ翻译（急）
Subversion的官方FAQ是一个很不错的资源，现在征集翻译，欢迎您的参与。项目源代码在：http://svncndoc.googlecode.com/svn/trunk/faq，最好你有一个google帐号，可以访问google的源代码库。如果你有兴趣，可以给我发信息 daijun@gmail.com。
Submerged中文版翻译（急）
Submerged是Subversion开发者的一个很好的Blog，通过这个Blog你能够及时获取最新的Subversion各个方面的知识，Submerged中文版在http://rocksun.cn/svn，欢迎您的加盟。如果你有兴趣，可以给我发信息 daijun@gmail.com。
TortoiseSVN和TortoiseMerge文档翻译（急）
http://tortoisesvn.net/translation是官方网站，部分成员在http://code.google.com/p/i18n-zh/，本站有最新文档：http://www.subversion.org.cn/tsvndoc和http://www.subversion.org.cn/tmedoc现在进展较慢，如果你有兴趣，可以联系我。要求是了解docbook，并能通过我们的指导使用ant编译文档。如果你有兴趣，可以给我发信息 daijun@gmail.com。


Related posts:About Me分布式版本控制工具Bazaar我家的大水坑



Related posts:<ol><li><a href='http://rocksun.cn/about/' rel='bookmark' title='Permanent Link: About Me'>About Me</a></li><li><a href='http://rocksun.cn/%e5%88%86%e5%b8%83%e5%bc%8f%e7%89%88%e6%9c%ac%e6%8e%a7%e5%88%b6%e5%b7%a5%e5%85%b7bazaar/' rel='bookmark' title='Permanent Link: 分布式版本控制工具Bazaar'>分布式版本控制工具Bazaar</a></li><li><a href='http://rocksun.cn/%e6%88%91%e5%ae%b6%e7%9a%84%e5%a4%a7%e6%b0%b4%e5%9d%91/' rel='bookmark' title='Permanent Link: 我家的大水坑'>我家的大水坑</a></li></ol>

]]></description>
			<content:encoded><![CDATA[<p>其实已经出来一段时间了，可能有些人已经看到了。本书是Subversion开发团队成员编写，纸版由O&#8217;Reilly出版，官方网站为<a href="http://svnbook.red-bean.com/">http://svnbook.red-bean.com/</a>。中文翻译由Subversion中文站的rocksun组织，中文1.4版本以及最新的文档可以参看如下镜像：</p>
<ul>
<li><a href="http://www.subversion.org.cn/svnbook/">http://www.subversion.org.cn/svnbook/</a></li>
<li><a href="http://process2.cn/svnbook/">http://process2.cn/svnbook/</a></li>
</ul>
<p>另外，提供最新的TortoiseSVN文档浏览和下载：</p>
<h4>TortoiseSVN文档</h4>
<p>TortoiseSVN是一Windows下优秀的客户端软件，多数成员在i18n-zh中开发，最新文档可以如下：</p>
<ul>
<li><a href="http://www.subversion.org.cn/tsvndoc/">文档浏览</a></li>
<li><a href="http://www.subversion.org.cn/tsvndoc/TortoiseSVN.pdf">PDF下载</a></li>
</ul>
<h4>TortoiseMerge文档</h4>
<p>TortoiseMerge是TortoiseSVN配套的比较合并工具：</p>
<ul>
<li><a href="http://www.subversion.org.cn/tmedoc/">文档浏览</a></li>
<li><a href="http://www.subversion.org.cn/tmedoc/TortoiseMerge.pdf">PDF下载</a></li>
</ul>
<p>不过最近这些文档翻译的进度不是很好，例如TortoiseSVN，以前有一段时间大家突击翻译了许多，但是最新的还是差的挺多的，所以这里也想征集一下志愿者，主要有如下一些内容的翻译：</p>
<h4>翻译项目</h4>
<h5>Subversion FAQ翻译（急）</h5>
<p>Subversion的官方FAQ是一个很不错的资源，现在征集翻译，欢迎您的参与。项目源代码在：<a href="http://svncndoc.googlecode.com/svn/trunk/faq">http://svncndoc.googlecode.com/svn/trunk/faq</a>，最好你有一个google帐号，可以访问google的源代码库。如果你有兴趣，可以给我发信息 daijun@gmail.com。</p>
<h5>Submerged中文版翻译（急）</h5>
<p>Submerged是Subversion开发者的一个很好的Blog，通过这个Blog你能够及时获取最新的Subversion各个方面的知识，Submerged中文版在<a href="http://rocksun.cn/svn">http://rocksun.cn/svn</a>，欢迎您的加盟。如果你有兴趣，可以给我发信息 daijun@gmail.com。</p>
<h5>TortoiseSVN和TortoiseMerge文档翻译（急）</h5>
<p><a href="http://tortoisesvn.net/translation">http://tortoisesvn.net/translation</a>是官方网站，部分成员在<a href="http://code.google.com/p/i18n-zh/">http://code.google.com/p/i18n-zh/</a>，本站有最新文档：<a href="http://www.subversion.org.cn/tsvndoc">http://www.subversion.org.cn/tsvndoc</a>和<a href="http://www.subversion.org.cn/tmedoc">http://www.subversion.org.cn/tmedoc</a>现在进展较慢，如果你有兴趣，可以联系我。要求是了解docbook，并能通过我们的指导使用ant编译文档。如果你有兴趣，可以给我发信息 daijun@gmail.com。</p>


<p>Related posts:<ol><li><a href='http://rocksun.cn/about/' rel='bookmark' title='Permanent Link: About Me'>About Me</a></li><li><a href='http://rocksun.cn/%e5%88%86%e5%b8%83%e5%bc%8f%e7%89%88%e6%9c%ac%e6%8e%a7%e5%88%b6%e5%b7%a5%e5%85%b7bazaar/' rel='bookmark' title='Permanent Link: 分布式版本控制工具Bazaar'>分布式版本控制工具Bazaar</a></li><li><a href='http://rocksun.cn/%e6%88%91%e5%ae%b6%e7%9a%84%e5%a4%a7%e6%b0%b4%e5%9d%91/' rel='bookmark' title='Permanent Link: 我家的大水坑'>我家的大水坑</a></li></ol></p>
<p></p>]]></content:encoded>
			<wfw:commentRss>http://rocksun.cn/svnbook-release-chinese-14/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subversion 1.5发布说明</title>
		<link>http://rocksun.cn/subversion-15-releasenotes/</link>
		<comments>http://rocksun.cn/subversion-15-releasenotes/#comments</comments>
		<pubDate>Thu, 19 Jun 2008 17:27:11 +0000</pubDate>
		<dc:creator>rocksun</dc:creator>
				<category><![CDATA[recommend]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[1.5]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://rocksun.cn/?p=115</guid>
		<description><![CDATA[Subversion 1.5的新东西

合并跟踪（基础）
稀疏检出（通过新的&#8211;depth选项）
交互式的冲突解决
变更列表支持
svn:externals的相对URL和peg修订版本
对于ra_svn和svnserve的Cyrus SASL支持
通过sharding对于FSFS的大规模开发的支持
FSFS优化，通过不变的文件隔离
WebDAV的透明通过代理写
copy 和move的改进
速度改进，取消响应改进
更简单的使用试验ra_serf DAV访问模块
API改变、改进以及语言绑定
超过150的bug修正，改进

Subversion 1.5是以前Subversion发布版本的超集，可以认为是当前“最好的”版本。包含所有1.0.x到1.4.x的，以及以前版本没有的修正和特性。所有的新特性将会写入Subversion book，见svnbook.red-bean.com。
兼容性问题
以前的客户端和服务器可以直接与1.5的服务器和客户端交互，然而，如果服务器和客户端不全是1.5时，一些新的1.5特性（例如合并跟踪）将会不可用，而另外一些特性如稀疏检出，在服务器是旧的，客户端是新的时，可以运行但是效率比较低。
没有必要转储并重新加载版本库，subversion1.5可以读取以前创建的版本，升级只需用最新的库和二进制程序覆盖原来的程序。
Subversion 1.5 maintains API/ABI compatibility with earlier releases, by only adding new functions, never removing old ones. A program written to the 1.0, 1.1, 1.2, 1.3, or 1.4 API can both compile and run using 1.5 libraries. However, a program written for 1.5 cannot necessarily compile or run against [...]


Related posts:<ol><li><a href='http://rocksun.cn/svnchanged-export/' rel='bookmark' title='Permanent Link: Subversion: Export changed Files in a revision range'>Subversion: Export changed Files in a revision range</a></li><li><a href='http://rocksun.cn/authenticate-svnserve-with-sasl/' rel='bookmark' title='Permanent Link: 使用svnserve的SASL认证'>使用svnserve的SASL认证</a></li><li><a href='http://rocksun.cn/ftp-image-with-conext-menu/' rel='bookmark' title='Permanent Link: FTP image with Conext Menu'>FTP image with Conext Menu</a></li></ol>

]]></description>
			<content:encoded><![CDATA[<h4>Subversion 1.5的新东西</h4>
<ul>
<li><a href="#merge-tracking">合并跟踪（基础）</a></li>
<li><a href="#sparse-checkouts">稀疏检出（通过新的&#8211;depth选项）</a></li>
<li><a href="#interactive-conflict-resolution">交互式的冲突解决</a></li>
<li><a href="#changelists">变更列表支持</a></li>
<li><tt></tt><a href="#externals">svn:externals的相对URL和peg修订版本</a></li>
<li><tt><a href="#cyrus-sasl">对于ra_svn和svnserve的Cyrus SASL支持</a></tt></li>
<li><a href="#fsfs-sharding">通过sharding对于FSFS的大规模开发的支持</a></li>
<li><a href="#fsfs-isolate-immutable">FSFS优化，通过不变的文件隔离</a></li>
<li><a href="#webdav-proxy">WebDAV的透明通过代理写</a></li>
<li><tt></tt><tt><a href="#copy-move-improvements">copy 和move的改进</a></tt></li>
<li><a href="#cancellation-improvements">速度改进，取消响应改进</a></li>
<li><a href="#dav-modules">更简单的使用试验ra_serf DAV访问模块</a></li>
<li><a href="#apis">API改变、改进以及语言绑定</a></li>
<li><a href="#bug-fixes">超过150的bug修正，改进</a></li>
</ul>
<p>Subversion 1.5是以前Subversion发布版本的超集，可以认为是当前“最好的”版本。包含所有1.0.x到1.4.x的，以及以前版本没有的修正和特性。所有的新特性将会写入Subversion book，见<a href="http://svnbook.red-bean.com">svnbook.red-bean.com</a>。</p>
<h4>兼容性问题</h4>
<p>以前的客户端和服务器可以直接与1.5的服务器和客户端交互，然而，如果服务器和客户端不全是1.5时，一些新的1.5特性（例如<a href="#merge-tracking">合并跟踪</a>）将会不可用，而另外一些特性如<a href="#sparse-checkouts">稀疏检出</a>，在服务器是旧的，客户端是新的时，可以运行但是效率比较低。</p>
<p>没有必要转储并重新加载版本库，subversion1.5可以读取以前创建的版本，升级只需用最新的库和二进制程序覆盖原来的程序。</p>
<p>Subversion 1.5 maintains API/ABI compatibility with earlier releases, by only adding new functions, never removing old ones. A program written to the 1.0, 1.1, 1.2, 1.3, or 1.4 API can both compile and run using 1.5 libraries. However, a program written for 1.5 cannot necessarily compile or run against older libraries.</p>
<p>Subversion会维护与先前版本API/ABI的兼容，只会增加新的特性，而不会删除旧的特性。根据1.0, 1.1, 1.2, 1.3或1.4 的API编写的程序，可以使用1.5的库编译，为1.5编写的程序不必为旧库编译或运行。</p>
<h5>新特性的兼容性表格</h5>
<table border="0" cellspacing="0" cellpadding="0" width="682">
<tbody>
<tr>
<th width="270">新特性</th>
<th width="59">Minimum Client</th>
<th width="74">Minimum Server</th>
<th width="99">Minimum Repository</th>
<th width="178">Notes</th>
</tr>
<tr>
<td width="270"><a href="#merge-tracking">合并跟踪（基础）</a></td>
<td width="60">1.5</td>
<td>1.5</td>
<td>1.5</td>
<td width="178"></td>
</tr>
<tr>
<td width="270"><a href="#sparse-checkouts">稀疏检出（通过新的&#8211;depth选项）</a></td>
<td width="61">1.5</td>
<td>any</td>
<td>any</td>
<td width="178"></td>
</tr>
<tr>
<td width="270"><a href="#interactive-conflict-resolution">交互式的冲突解决</a></td>
<td width="62">1.5</td>
<td>any</td>
<td>any</td>
<td width="178"></td>
</tr>
<tr>
<td width="270"><a href="#changelists">变更列表支持</a></td>
<td width="63">1.5</td>
<td>any</td>
<td>any</td>
<td width="178"></td>
</tr>
<tr>
<td width="270"><tt></tt><a href="#externals">svn:externals的相对URL和peg修订版本</a></td>
<td width="64">1.5</td>
<td>any</td>
<td>any</td>
<td width="178"></td>
</tr>
<tr>
<td width="270"><tt><a href="#cyrus-sasl">对于ra_svn和svnserve的Cyrus SASL支持</a></tt></td>
<td width="65">any*, 1.5</td>
<td>any*, 1.5</td>
<td>any</td>
<td width="178">*受限，见 <a href="#sasl-compatibility">SASL 和svn:// 兼容性</a></td>
</tr>
<tr>
<td width="270"><a href="#fsfs-sharding">通过sharding对于FSFS的大规模开发的支持</a></td>
<td width="66">any*, 1.5</td>
<td>1.5</td>
<td>1.5</td>
<td width="178">*1.5 file:// 兼容性需要</td>
</tr>
<tr>
<td width="270"><a href="#fsfs-isolate-immutable">FSFS优化，通过不变的文件隔离</a></td>
<td width="67">any*, 1.5</td>
<td>1.5</td>
<td>1.5</td>
<td width="178">*1.5 file:// 兼容性需要</td>
</tr>
<tr>
<td width="270"><a href="#webdav-proxy">WebDAV的透明通过代理写</a></td>
<td width="68">any</td>
<td>1.5*</td>
<td>any</td>
<td width="178">*需要Apache 2.2服务器</td>
</tr>
<tr>
<td width="270"><tt></tt><tt><a href="#copy-move-improvements">copy 和move的改进</a></tt></td>
<td width="69">1.5</td>
<td>any*, 1.5</td>
<td>any</td>
<td width="178">*受限，见<tt><a href="#copy-move-improvements">copy 和move的改进</a></tt></td>
</tr>
<tr>
<td width="270"><a href="#cancellation-improvements">速度改进，取消响应改进</a></td>
<td width="70">1.5</td>
<td>any</td>
<td>any</td>
<td width="178"></td>
</tr>
<tr>
<td width="270"><a href="#dav-modules">更简单的使用试验ra_serf DAV访问模块</a></td>
<td width="71">1.5</td>
<td>any</td>
<td>any</td>
<td width="178"></td>
</tr>
</tbody>
</table>
<h5>工作拷贝和版本库格式更改</h5>
<p>工作拷贝格式已经升级，这意味着1.4和更老的Subversion客户端不能与Subversion1.5的工作拷贝上工作，工作拷贝是<a href="#wc-upgrades">自动升级的</a>。</p>
<p>类似的，版本库格式也已经改变，意味着直接访问库的1.4以及旧的版本的程序如svnserve，mod_dav_svn，svnadmin等不能读取Subversion1.5的版本库，但是版本库是<a href="#repos-upgrades">不能自动升级的</a>。</p>
<h6>工作拷贝升级</h6>
<p><strong>警告：</strong>如果一个Subversion1.5客户端遇到了一个1.5以前的工作拷贝，它会在接触到工作拷贝时自动升级工作拷贝格式，并使旧的Subversion客户端不能再读这些工作拷贝了。如果你在机器上使用多个版本的Subversion，请确认你对工作拷贝是用的subversion版本，防止意外升级工作拷贝。（但是这种自动升级行为不会发生在<a href="#repos-upgrades">版本库上</a>，只发生在工作拷贝。）</p>
<p>如果你意外的将工作拷贝从1.4升级到1.5，并希望降级到1.4，可以使用<a href="http://svn.collab.net/repos/svn/trunk/tools/client-side/change-svn-wc-format.py"><tt>change-svn-wc-format.py</tt></a> ，详情看这篇<a href="http://subversion.tigris.org/faq.html#working-copy-format-change">文章</a>，也可以以&#8211;help运行来查看使用指导。</p>
<h6>版本库升级</h6>
<p>Subversion 1.5服务器可以与1.4和以前的版本库工作，如果不使用svnadmin upgrade命令，版本库不会自动升级到1.5。这意味仅仅升级服务器不能直接得到某些特性，你也需要升级版本库。（我们决定不使用自动升级版本库是因为我们不希望subversion1.5偷偷的升级成1.4不可用的版本库。）</p>
<p>在运行<strong><code>svnadmin upgrade</code></strong>之后，你或许希望对版本库运行<a href="http://svn.collab.net/repos/svn/trunk/tools/server-side/svn-populate-node-origins-index.c">svn-populate-node-origins-index</a> 程序。Subversion1.5为每个版本库维护了一个节点起源的索引，为了得到一些信息，偶尔构建这个索引。但是对于包含许多修订的老版本库，最好一次创建这个索引，使用前面说道的工具，而不会因为自己构建这个索引而影响查询的性能，更多细节见<a href="http://subversion.tigris.org/issues/show_bug.cgi?id=3024">issue #3024</a>。</p>
<h5>命令行输出的变更</h5>
<p>尽管我们希望尽可能让命令行程序的的输出与以前版本保持兼容，但是还是要添加一些信息，这会破坏一些精确依赖输出的脚本。不幸的是，我们不能列出1.5输出的所有改变，但有一条可以确定的是冲突标记的行结束符号会和文件的eol-style匹配。</p>
<h5>SASL和<code>svn://</code>的兼容性</h5>
<p>所有1.x的客户端，包含或不包含Cyrus SASL支持的，都可以通过在Cyrus SASL没有开启时认证正常。注意<tt>CRAM-MD5</tt>和<tt>ANONYMOUS机制是Subversion内置的，所以即使Cyrus SASL插件不在，我们也可以使用。</tt></p>
<p>没有Cyrus SASL支持的1.x客户端不能通过开启Cyrus SASL，允许<tt>CRAM-MD5</tt> 和<tt>ANONYMOUS机制的</tt>1.5+的subversion服务器认证，</p>
<p>包含Cyrus SASL支持的1.5+客户端可以通过开启SASL功能的1.5+服务器认证，只要保证服务器支持的某个机制客户端也支持。</p>
<p>关于Cyrus SASL的更多信息可以看<a href="#cyrus-sasl">这个部分</a>。</p>
<h5>自定义revprops现在需要通过<tt>pre-commit</tt>钩子的检验</h5>
<p>Subversion每个修订版本都有一组关联的修订版本属性；除了标准的日志信息，作者和日志，可以设置任意的用户定义的属性。这些属性本身不是版本化的，所以不能恢复修改的内容。因此，如果我们没有设置<tt>pre-revprop-change，我们就不能修改提交修订版本的revprops。在Subversion1.5之前，我们只能在提交时提供这三个标准的revprops；管理员使用钩子来控制这三个标准修订版本属性的内容，需要在<tt>pre-commit和</tt><tt>pre-revprop-change检查，但是对于自定义的属性，只有<tt>pre-revprop-change是相关的。</tt></tt></tt></p>
<p>Subversion1.5添加了<a href="http://subversion.tigris.org/svn_1.5_releasenotes.html#commit-revprops"><tt>svn commit包含</tt></a><tt><a href="#commit-revprops">--with-revprop</a></tt>选项，允许用户在提交时为修订版本指定属性，因此在Subversion 1.5允许在没有<tt>pre-revprop-change</tt>钩子时设置修订版本属性，<tt>pre-commit</tt>可以在提交之前检查事务修订版本属性（就像许多服务器已经使用<tt>pre-commit</tt>来检查正确格式化的log）。</p>
<p>这意味着如果你以前依赖<tt>pre-revprop-change</tt> to 钩子控制对于修订版本属性的修改（不仅仅你是跟踪它们的历史），那你先现在也需要在<tt>pre-commit</tt>添加类似的控制。</p>
<h4>新特性</h4>
<h5>合并跟踪（基础）（客户端和服务器）</h5>
<p>合并跟踪的意思是Subversion保持哪些变更从哪里合并过来，这减轻了维护分支的负担，也给了用户一个方式来查询合并的变更—或需要合并的内容—在不同的开发线上。</p>
<p>Subversion1.5支持的合并跟踪是“基础的”：最重要的部分已经实现，但是在我们<a href="http://subversion.tigris.org/merge-tracking/">最初的规格</a>中还有一部分需要去实现（特别是对于<a href="http://subversion.tigris.org/issues/show_bug.cgi?id=2897">reflective merges</a>的正确支持，更好的<a href="http://subversion.tigris.org/issues/show_bug.cgi?id=3126">change-availability reporting</a>和更好的<a href="http://subversion.tigris.org/issues/show_bug.cgi?id=3128">tracking of renamed files</a>），虽然在1.5还要加入一些主要的特性，但我们不希望为等待某个特性延迟我们的发布。更多的合并跟踪改进希望在Subversion1.6或以后的版本出现。</p>
<h6>概述</h6>
<p>Subversion的合并跟踪设计为：</p>
<ul>
<li>减少分支维护的记录负担</li>
<li>防止常见的“重复合并”问题</li>
<li>允许对于变更的cherry-picking</li>
</ul>
<p>每个变更集都可以通过修订版本号识别，通过新的<strong><code>svn:mergeinfo</code></strong>属性在合并的目标存放在合并变更集的信息（通俗来说就是“合并信息（mergeinfo）”），Subversion会自动保持合并信息的为最新，但是也有办法<a href="http://subversion.tigris.org/svn_1.5_releasenotes.html#mt-record-only">手工记录/消除合并信息</a>，这是因为总会有些时候人们知道一些Subversion不知道的事情。</p>
<h6>用户界面</h6>
<p>从主干合并分支不再需要指明修订版本范围，每当你希望与trunk同步，你可以这样做：</p>
<pre>   $ cd BRANCH_WORKING_COPY
   $ svn merge URL_TO_TRUNK</pre>
<p>Subversion能够计算出从URL_TO_TRUNK有哪些变更没有合并，并只处理这些变更，当将分支合并回主干，我们只需要：</p>
<pre>   $ cd TRUNK_WORKING_COPY
   $ svn merge --reintegrate URL_TO_BRANCH</pre>
<p>下面是所有合并跟踪相关接口变更的正式描述。</p>
<p><strong><code>svn merge</code></strong>命令使用两个新的选项：<strong><code>--record-only</code></strong> 和<strong><code>--reintegrate。</code></strong></p>
<p>&#8211;record-only选项至于-r结合工作，并且和你所想的一样：它只是用来将修订版本标记为已合并（或未合并的，使用“-”作为否定语法），而实际上除了合并信息（mergeinfo），什么也没有做。例如，当因为效率某个人手工修改了这个文件而合并了这个其他地方修改的变更时，这非常有效，与其让让变更在下次合并时加入进来，从而引起文本冲突，我们不如记录这个变更已经合并。（细节见Subversion书的<a href="http://subversion.tigris.org/merge-tracking/requirements.html#manual-merge">merge-tracking requirements</a>, and <a href="http://svnbook.red-bean.com/nightly/en/svn.branchmerge.advanced.html#svn.branchmerge.advanced.blockchanges">Blocking Changes</a> 。）</p>
<p>&#8211;reintegrate选项在将分支合并回主干时使用；它会检查一些防护措施条件并快速有效的进行合并，更多内容见Subversion book的<a href="http://svnbook.red-bean.com/nightly/en/svn.branchmerge.basicmerging.html#svn.branchemerge.basicmerging.stayinsync">Keeping a branch in sync</a>。</p>
<p>新的<strong><code>svn mergeinfo</code></strong>命令可以显示一个目录已经接收的变更集，以及哪些变更集还适合接收，Subversion手册的<a href="http://svnbook.red-bean.com/nightly/en/svn.branchmerge.basicmerging.html#svn.branchmerge.basicmerging.mergeinfo">Mergeinfo and Previews</a>有更多信息。</p>
<p><strong><code>svn log</code></strong> 和<strong><code>svn blame</code></strong> 命令有了新的<strong><code>-g</code></strong> (<strong><code>--use-merge-history</code></strong>) 选项，使之将mergeinfo纳入考虑，如果没有提供这个选项，它们就会参考合并信息。</p>
<p>使用-g选项的原因是有时候忽略合并历史会更好，在blame输出中，有时候你希望看到合并变更的人物B，而有些时候你希望看到最初作出这些修改人物A；使用-g可以得到后者的信息。在日志输出中，你有时候希望看到某一行提交的修订版本，而有时你希望看到最初的修改做合并修订版本转移走了；再次，-g显示后者的信息（使用&#8221;<tt>Merged via: </tt>&#8220;标识，后面是合并发生的修订版本号码），见Subversion手册的<a href="http://www.subversion.org.cn/svnbook/nightly/svn.branchmerge.advanced.html#svn.branchmerge.advanced.logblame">Merge-Sensitive Logs and Annotations</a>。</p>
<h6>合并跟踪和兼容性</h6>
<p>前面已经说了，在随server<a href="#repos-upgrades">升级版本库以前</a>不支持合并跟踪。</p>
<p>如果你正在使用<a href="https://svn.collab.net/repos/svn/trunk/contrib/client-side/svnmerge/">svnmerge</a>包裹程序来进行合并，而现在希望使用Subversion1.5本身的合并跟踪功能功能，你一定要使用<a href="https://svn.collab.net/repos/svn/trunk/contrib/client-side/svnmerge/svnmerge-migrate-history.py">svnmerge-migrate-history.py</a> 脚本来转化svnmerge的自定义属性为Subversion使用的<tt>svn:mergeinfo</tt>属性。</p>
<h6>已知问题</h6>
<p>1.5.0的合并跟踪还有许多已知的问题，我们首先解决了最重要的，下面是：</p>
<ul>
<li><a href="http://subversion.tigris.org/issues/show_bug.cgi?id=3128">issue #3128</a>: <code>merge --reintegrate</code> 应该更好的处理重命名</li>
<li><a href="http://subversion.tigris.org/issues/show_bug.cgi?id=2897">issue #2897</a>: 对反向合并的更好支持</li>
<li><a href="http://subversion.tigris.org/issues/show_bug.cgi?id=3126">issue #3126</a>: 更好已知变更报告（<code>svn mergeinfo</code>显示了太少或太多的合适修订版本）</li>
<li><a href="http://subversion.tigris.org/issues/show_bug.cgi?id=2837">issue #2837</a>: 当执行循环合并时合并跟踪能起效果</li>
<li><a href="http://subversion.tigris.org/issues/show_bug.cgi?id=3056">issue #3056</a>: 防止以智能方式重复合并</li>
<li><a href="http://subversion.tigris.org/issues/show_bug.cgi?id=2898">issue #2898</a>: 当删除/添加子时无需处理合并信息</li>
<li><a href="http://subversion.tigris.org/issues/show_bug.cgi?id=3067">issue #3067</a>: 在合并范围内不存在的树不应该破坏合并</li>
<li><a href="http://subversion.tigris.org/issues/show_bug.cgi?id=3157">issue #3157</a>: 从路径的自然历史合并变更会创建引用自己的合并信息</li>
<li><a href="http://subversion.tigris.org/issues/show_bug.cgi?id=3174">issue #3174</a>: 合并算法需要对重命名的子树特别关注</li>
</ul>
<p>（可以看<a href="http://subversion.tigris.org/issues/buglist.cgi?component=subversion&amp;issue_status=UNCONFIRMED&amp;issue_status=NEW&amp;issue_status=STARTED&amp;issue_status=REOPENED&amp;short_desc=merg&amp;short_desc_type=substring&amp;field0-0-0=noop&amp;type0-0-0=noop&amp;value0-0-0=&amp;cmdtype=doit&amp;newqueryname=&amp;order=Issue+Number&amp;Submit+query=Submit+query">list of all merge-related open issues</a>，尽管很多不是关于合并跟踪）</p>
<p><a href="http://subversion.tigris.org/issues/show_bug.cgi?id=3157">Issue #3157</a>可能是会很容易遇到的，所以下面是如何解决这个问题的详细描述：</p>
<p>合并跟踪信息现在可以保存在路径的“本身历史”中，当从trunk的特定修订版本x创建了一个分支，然后将分支的所有变更合并回trunk时，如果没有明确的限制合并范围并且没有使用<code>--reintegrate</code> 选项时，后果是，trunk的合并跟踪信息将会列出x之前的信息。这对以后的合并操作没有坏处，但是对于trunk上的<code>svn log -g</code>会使用以前修订版本的合并跟踪信息（而不只是HEAD）。</p>
<p>注意，这一定不会是一个发布分支（也叫做“维护分支”）的问题，因为一个人通常不会将其合并回主干，相反，推荐的时间是对于进入trunk的新变更使用特性分支，可以在分支的生命周期结尾一次合并到主干。</p>
<p>一个办法是在提交合并修订之前修正合并跟踪信息，通过恢复“本身历史”信息：<code>svn merge --record-only -rX:1</code>。另一个方案是完全防止这种情形，通过在第一次就明确的指定合并范围，例如<tt>-rX:HEAD</tt>，更多信息可以看这个<a href="http://subversion.tigris.org/servlets/ReadMsg?listName=dev&amp;msgNo=139379">邮件</a> 。</p>
<p>当合并一个特性分支，最佳方案是<a href="http://subversion.tigris.org/svn_1.5_releasenotes.html#mt-reintegrate">使用<code>--reintegrate选项</code></a></p>
<h6>深入阅读</h6>
<p>Subversion 1.5合并跟踪的更多内容可以看：</p>
<ul>
<li><a href="http://www.subversion.org.cn/svnbook/nightly/svn.branchmerge.html">Chapter 4: Branching and Merging</a> in the Subversion book</li>
<li><a href="http://blog.red-bean.com/sussman/?p=92">Subversion 1.5 merge-tracking in a nutshell</a> (blog post by Ben Collins-Sussman)</li>
<li><a href="http://subversion.tigris.org/merge-tracking/">The merge tracking design documents</a> (requirements, use cases, functional spec, design)</li>
</ul>
<h5>稀疏检出（Sparse checkouts）（客户端和服务器）</h5>
<p>许多用户都有很大的目录树，但他们只希望检出特定的部分。在Subversion以前的版本，checkout -N没有真的完成这个任务。Subversion 1.5引入了<strong><code>checkout、</code></strong><strong><code>switch</code></strong>和<code><strong>update</strong>子命令的<strong>--depth</strong>选项，这个选项替代了-N，允许用户构建只包含他们需要内容的工作拷贝，而不管其他的东西。</code></p>
<h6>Depth概述</h6>
<p>每个目录现在理解了<em>depth</em>的概念，可以有四种值：<tt>empty</tt>、<tt>files</tt>、<tt>immediates</tt>、<tt>infinity，值的定义如下：</tt></p>
<ul>
<li>–depth=empty: 更新不会拉出任何不存在的文件或目录</li>
<li>–depth=files: 更新会拉出所有的文件，但不包括子目录</li>
<li>–depth=immediates: 更新会拉入所有不存在的文件或子目录；但子目录的设置为depth=empty。</li>
<li>–depth=infinity: 更新会拉入所有不存在的文件和目录，子目录的设置为depth=infinity，与目前的缺省更新行为方式相同。</li>
</ul>
<p><code>--depth</code> 选项设置depth的值在更新工作拷贝时按照上面说的方式更新</p>
<h6>用户界面</h6>
<p>影响的命令：</p>
<ul>
<li><code>checkout</code></li>
<li><code>switch</code></li>
<li><code>update</code></li>
<li><code>status</code></li>
<li><code>info</code></li>
</ul>
<p>-N选项开始成为这些子命令的<code>--depth=files选项</code>的一个别名，这改变了现存的-N行为方式，但是以一种很琐碎的方式（见下面）。</p>
<p>现在对于不使用<code>--depth</code>或<code>-N</code> 的checkout来说和以前一样。没有<code>--depth或</code><code>-N</code> 的switch和update命令现在只和工作拷贝完全的depth-infinity相同，没有<code>--depth或</code><code>-N</code> 的switch或update不会改变depth值（例外：在命令行中指定的不存在的目录会拉入）。</p>
<p>结果是，checkout与<code>checkout --depth=infinity相同，但是<code>switch和</code><code>update</code>与<code>switch --depth=infinity和</code><code>update --depth=infinity不同，前者根据现存的depth值更新，而后者获取所有的内容。</code></code></p>
<p>作为开始，可以使用<code>--depth=empty</code>或<code>--depth=files选项checkout文件，如果需要额外的文件或目录，可以使用合适的<code>--depth选项的update命令来获取。除了其他的状态信息，svn status必须列出目录周围的depths。当调用的目录的depth不是缺省值（depth-infinity）时svn info命令也会列出其depth。</code></code></p>
<p><strong>注意：</strong> 当前对于稀疏检出没有反选的接口—也就是说，在引入到工作拷贝后（尽管有一些相对简单的方法可以获取此目标），没有命令可以取消选择或“折叠”子目录，详细信息见<a href="http://subversion.tigris.org/issues/show_bug.cgi?id=2843">issue #2843</a>。</p>
<h6>与以前服务器的兼容性</h6>
<p><tt>--depth</tt>特性显然需要客户端是1.5以上的，也需要1.5以上的服务器才能最有效的工作，然而，客户端仍然需要在1.4.x服务器时工作正常；只是有较差的效率。</p>
<p>这是因为以前的服务器不会理解—因而会忽略—不会清楚客户端说的“depth”的含义。所以当客户端请求比depth-infinity更浅的depth，以前的服务器会返回比客户端需要更多的数据，然而Subversion1.5+的客户端知道是与旧的服务器通话，并会过滤这些多余的数据，因此，操作会更长一些，因为服务器发送了许多客户端忽略的数据，但是最终在客户端产生的数据相同。（注意旧的服务器理解网络协议的<tt>recurse，而1.5+客户端根据depth发送标记；这减轻了额外的网络惩罚。</tt>）</p>
<h6>进一步阅读</h6>
<ul>
<li>The <a href="http://www.subversion.org.cn/svnbook/nightly/svn.advanced.sparsedirs.html">Sparse Directories</a> section in the Subversion book.</li>
<li>The <a href="http://svn.collab.net/repos/svn/trunk/notes/sparse-directories.txt">design/implementation document</a> in the repository.</li>
</ul>
<h5>交互式冲突解决（客户端）</h5>
<p>在<code>update</code>/<code>switch</code>/<code>merge</code> 子命令的操作中，现在冲突解决是使用交互式的命令行客户端完成，客户端库提供了一个callback函数，所以其他客户端也能以同样的方式工作。</p>
<p>下面是使用命令行客户端例子：</p>
<pre>   $ svn up
   U    contrib/client-side/svnmerge/svnmerge_test.py
   Conflict discovered in 'contrib/client-side/svnmerge/svnmerge.py'.
   Select: (p) postpone, (df) diff-full, (e) edit,
           (s) show all options: s
     (p)  postpone    - mark the conflict to be resolved later
     (df) diff-full   - show all changes made to merged file
     (e)  edit        - change merged file in an editor
     (r)  resolved    - accept merged version of file
     (mf) mine-full   - accept my version of entire file (ignore their changes)
     (tf) theirs-full - accept their version of entire file (lose my changes)
     (l)  launch      - launch external tool to resolve conflict
     (s)  show all    - show this list

   Select: (p) postpone, (df) diff-full, (e) edit,
           (s) show all options: tf
   G    contrib/client-side/svnmerge/svnmerge.py
   Updated to revision 25685.
   $</pre>
<p>这个特性可以使用&#8211;non-interactive选择关闭，或者通过设置运行配置文件中的“[miscellany] interactive-conflicts = no”永久关闭。</p>
<p>交互式冲突解决的API通过一个callback函数公开，并有如下数据类型：</p>
<ul>
<li><code>svn_wc_conflict_resolver_func_t</code>,  callback API本身</li>
<li><code>svn_wc_conflict_description_t</code>,  传递给callback的冲突描述</li>
<li><code>svn_wc_conflict_action_t</code>,  冲突描述中尝试工作内容的部分</li>
<li><code>svn_wc_conflict_reason_t</code>,  冲突描述中冲突类型部分</li>
<li><code>svn_wc_conflict_result_t</code>,  返回的冲突解决尝试结果</li>
<li><code>svn_wc_conflict_choice_t</code>,  用户选择动作的列表</li>
</ul>
<p>客户端通过设置他们的<code>svn_client_ctx_t</code>的<code>conflict_func</code>字段提供了他们的callback函数，并可以通过对应的<code>conflict_baton</code>字段提供额外的callback状态。</p>
<h5>变更列表支持(<em>changelist)</em>（客户端）</h5>
<p>Subversion客户端现在包含了变更列表（<em>changelist）</em>的改变，一组与选定名称关联的文件，当工作在同一个工作拷贝的不同集合的文件时这样非常有效，Subversion1.5允许你为每组文件关联一个变更列表，大多数可以将一组文件作为目标的命令现在也接受<code><strong>--changelist</strong>选项，会根据changelist的成员过滤目标，变更列表的成员可以使用<code><strong>changelist</strong>子命令编辑。</code></code></p>
<p>变更列表完全是客户端控制的。他们不会发送到服务器，对同一个版本库其他用户都不可见。另外，<code>--changelist</code> 选项不是添加剂；如果一个文件在没有<code>--changelist</code>的时候加入到目标的列表，它也不会加入进去，它不会管changelist的成员。当前，一个文件一次只能属于一个变更列表，目录不能作为变更列表的成员。</p>
<p>下面的子命令支持<code>--changelist选项：</code></p>
<ul>
<li><code>changelist</code></li>
<li><code>commit</code></li>
<li><code>diff</code> (only wc-wc and wc-repos cases)</li>
<li><code>info</code></li>
<li><code>propget</code></li>
<li><code>proplist</code></li>
<li><code>propset</code></li>
<li><code>propdel</code></li>
<li><code>revert</code></li>
<li><code>status</code></li>
<li><code>update</code></li>
</ul>
<h6>进一步阅读</h6>
<ul>
<li>The <a href="http://www.subversion.org.cn/svnbook/nightly/svn.advanced.changelists.html">Changelists</a> section in the Subversion book.</li>
<li>The <a href="http://svn.collab.net/repos/svn/trunk/notes/changelist-design.txt">design/implementation document</a> in the repository.</li>
</ul>
<h5><tt>svn:externals</tt>中的相对URL，peg revisions（客户端）</h5>
<p>对<tt>svn:externals</tt> 特性的两个增强</p>
<h6>对于URL的Peg revision语法</h6>
<p>兼容性和新的语法：由于兼容性原因，1.5以前的svn:externals语法继续不理解peg revisions，引入了一种支持URL中peg revisions的新语法。</p>
<p>以前的格式是：</p>
<pre>   foo             http://example.com/repos/zig
   foo/bar -r 1234 http://example.com/repos/zag</pre>
<p>不支持peg revisions，如下的外部定义不能工作（除非目录名就是<tt>zig@HEAD</tt> and <tt>zag@HEAD</tt>）：</p>
<pre>   foo             http://example.com/repos/zig@HEAD
   foo/bar -r 1234 http://example.com/repos/zag@HEAD</pre>
<p>新格式将跟在外部定义后面的路径URL移动到第一位；如果有一个操作（-r）修订版本，则在URL之前，下面是四个外部定义行：</p>
<pre>   http://example.com/repos/zig foo1
   -r 1234 http://example.com/repos/zag foo/bar1
   http://example.com/repos/zig@HEAD foo2
   -r 1234 http://example.com/repos/zag@HEAD foo/bar2</pre>
<p>换句话说，操作（“r”）和peg（“@”）都是允许，但都不是必须的。</p>
<h6>对相对URL的支持</h6>
<p>在Subversion1.5之前，<tt>svn:externals</tt>中的URL必须是绝对路径，现在他们可以是相对的。现在支持四种相对外部引用。（在下面的例子里，假设我们有两种版本库：一个是在<tt><a href="http://example.com/svn/repos-1">http://example.com/svn/repos-1</a></tt> ，另一个在<tt><a href="http://example.com/svn/repos-2">http://example.com/svn/repos-2</a></tt>，我们检出<tt><a href="http://example.com/svn/repos-1/project1/trunk">http://example.com/svn/repos-1/project1/trunk</a></tt>，而<tt>svn:externals</tt> 设置为trunk。）</p>
<dl>
<dt><strong>../</strong></p>
</dt>
<dd><tt>svn:externals</tt>属性设置目录的相对路径，则URL是以<tt>../</tt>开始，例如：</p>
</dd>
<dd>
<pre>   ../../project2/trunk common/project2/trunk</pre>
<p>这就是将<tt><a href="http://example.com/svn/repos-1/project2/trunk">http://example.com/svn/repos-1/project2/trunk</a></tt> 加入到<tt>common/project2/trunk</tt>。外部URL相对于设置<tt>svn:externals</tt>属性的目录的URL，而不是写到磁盘的外部的目录。</p>
</dd>
<dt><strong>^/</strong></p>
</dt>
<dd>相对于库的根。</p>
</dd>
<dd>
<pre>   ^/project2/trunk common/project2/trunk</pre>
<p>这就是将<tt><a href="http://example.com/svn/repos-1/project2/trunk">http://example.com/svn/repos-1/project2/trunk</a></tt>加入到<tt>common/project2/trunk</tt>。</p>
</dd>
<dd>你可以容易使用相对URL来引用其他的版本库：</p>
</dd>
<dd>
<pre>   ^/../repos-2/foo/trunk common/foo/trunk</pre>
<p>就是<tt><a href="http://example.com/svn/repos-2/foo/trunk">http://example.com/svn/repos-2/foo/trunk加入到</a><tt>common/foo/trunk</tt>。</tt></p>
</dd>
<dt><strong>//</strong></p>
</dt>
<dd>相对于模式，这就是拷贝了检出或导出URL的模式到<tt>svn:externals</tt>，当同一个主机必须依赖于网络位置按照不同的模式访问；例如局域网的客户端使用<tt>http://</tt>，而外部客户使用<tt>svn+ssh://</tt>。</p>
</dd>
<dd>
<pre>   //example.com/svn/repos-1/project2/trunk common/project2/trunk</pre>
<p>这将会把<tt><a href="http://example.com/svn/repos-1/project2/trunk">http://example.com/svn/repos-1/project2/trunk</a></tt>提取到<tt>common/project2/trunk，如果工作拷贝是通过<tt>svn+ssh://example.com/svn/repos-1/project1/trunk</tt> 检出的，那么URL将会是<tt>svn+ssh://example.com/svn/repos-1/project1/trunk</tt>。</tt></p>
</dd>
<dt><strong>/</strong></p>
</dt>
<dd>服务器root的相对URL，这是检出或导出的模式和主机名的URL拷贝到<tt>svn:externals。</tt></p>
</dd>
<dd>
<pre>   /svn/repos-1/project2/trunk common/project2/trunk</pre>
<p>这会提取<tt><a href="http://example.com/svn/repos-1/project2/trunk">http://example.com/svn/repos-1/project2/trunk</a>到<tt>common/project2/trunk</tt>。如果工作拷贝是从<tt>svn+ssh://example.com/svn/repos-1/project1/trunk</tt> 检出，那么URL将会是<tt>svn+ssh://example.com/svn/repos-1/project1/trunk</tt>。</tt></p>
</dd>
</dl>
<p>旧的<tt>svn:externals</tt>格式依然支持相对URL（不会支持peg revisions）。</p>
<p>当Subversion见到不使用绝对URL的<tt>externals</tt> ，会将第一个参数作为相对URL，第二个作为目标目录。</p>
<h6>进一步阅读</h6>
<p>See The <a href="http://www.subversion.org.cn/svnbook/nightly/svn.advanced.externals.html">svn:externals</a> section of the Subversion Book.</p>
<h5>ra_svn和<tt>svnserve</tt>的Cyrus SASL支持（服务器和客户端）</h5>
<p>来自<a href="http://en.wikipedia.org/wiki/Simple_Authentication_and_Security_Layer">Wikipedia</a>：“SASL是网络协议的认证和数据安全框架，它将认证机制与应用协议解耦，从理论上讲，允许任何SASL支持的认证机制应用到使用SASL的应用协议上”</p>
<p>在实践中，服务器发送会发送一组它支持的认证机制，客户端会根据客户端的支持选择一种认证机制，并通知服务器这个决定。之后，会有一些信息交换，直到成功或者失败发生，在后一种情况，允许客户端重新认证。</p>
<p><tt>svn://</tt> 协议会一直支持这种类型的协商，然而只是实现了<tt>CRAM-MD5和</tt><tt>ANONYMOUS。<a href="http://asg.web.cmu.edu/sasl/">Cyrus SASL</a>支持所有这些，此外，提供了其它如<tt>DIGEST-MD5</tt>, OTP (One-Time Passwords), GSSAPI (used for Kerberos authentication), NTLM (NT LAN Manager), SRP (Secure Remote Password)以及其他机制的支持。支持机制的准确列表依赖于SASL是如何编译的，有一些还有外置依赖，或不是缺省编译。另外，因为每种机制实际上是一个共享库，会在运行中加载，有许多分布的包位于核心库外单独存放。</tt></p>
<p>关于使用1.5并开启SASL与1.5前的客户端工作的更多信息请看<a href="#sasl-compatibility">兼容性部分</a>，关于Subversion的SASL支持可以看<a href="http://svn.collab.net/repos/svn/trunk/notes/sasl.txt">sasl.txt</a>。</p>
<h5>对于FSFS大规模开发的改进支持，通过sharding （服务器）</h5>
<p>FSFS文件系统后端在各自的文件存放每个修订版本，在Subversion1.5之前，所有的文件都存放在版本库一个普通的目录里，现在新创建的FSFS库会使用二级的目录树，每个目录最多1000个文件。这种版本库只能与Subversion1.5客户端兼容，但是当然，Subversion1.5仍然可以使用以前格式的版本库，而没有问题。</p>
<p>这样做的主要原因是允许修订数量能够超越文件系统的目录树的限制，当现代文件系统能够成支持每个目录有百万条目，它会变得很慢，而且管理工具会变得笨拙或失败。</p>
<p>关于FSFS sharding的更多信息可以看这个<a href="http://www.farside.org.uk/200704/tree_structured_fsfs">blog entry</a>。</p>
<p><code>svnadmin create</code>创建后，使用版本库之前，shard大小可以通过编辑“db/format”中的“<code>layout sharded</code>”来调整。</p>
<h5>改进的FSFS优化，通过不可变的文件隔离（服务器）</h5>
<p>FSFS版本库永远不会在写入修订版本后进行修改，尽管最好让操作系统永远缓存所有的文件，某些文件系统（例如NFS）缺省可以通过这种缓存获益，现在FSFS版本库为此将不变的文件存放在子目录“db/revs”和“db/txn-protorevs”，这允许这些目录加载到开启缓存（在Linux可以看nfs部分的“nocto”）的挂接点上。</p>
<p>因为提交事务存放在db/txn-protorevs&#8221; 而不是&#8221;db/transactions&#8221;，后者的目录不必在同一个挂接点，如果版本库存放在较慢的文件系统（例如NFS），提交效率可以通过将目录移动到本地磁盘（使用符号链）改进。如果你在一个网络负载平衡器之后使用多个svn服务器，你必须配置负载平衡器在一个事务中转向到同一个服务器，这通常叫做“客户端喜好”。</p>
<h5>WebDAV透明通过代理写（服务器）</h5>
<p>Subversion1.5引入了<a href="http://subversion.tigris.org/svn_1.4_releasenotes.html#svnsync"><tt>svnsync</tt></a> — 一提供从一个版本库复制内容到另一个版本库的工具。尽管很有用，但svnsync只能从一个版本库拖入修订版本，但是不能将额外的提交返回给master。Subversion1.5为<tt>mod_dav_svn</tt>添加了WebDAV代理支持，有效的使用<tt>mod_dav_svn</tt>允许双向的修订版本历史复制。</p>
<p>所有的客户端与slave服务器交互，但是slave会透明的将所有的写活动传递给master（根据需要重写数据），slave实质上是只读的，但是它们本地都有一个完整的版本库，服务器分流master服务器的读压力，某些情况下非常可观。</p>
<p>如果使用支持HTTP DAV的缓存代理，这个模型非常有好处，在这个情况下，每个slave可以对应所有对应的只读请求，而无需传递给master后端。</p>
<h6>要求</h6>
<ul>
<li>Subversion 1.5或更新的。</li>
<li>Apache HTTP Server 2.2.0或更高，并开启mod_proxy （许多mod_proxy 修正的bug没有回到httpd的2.0版本）</li>
</ul>
<h6>实例配置</h6>
<p>参与者：</p>
<ul>
<li>Slave → <tt>slave.example.com</tt> （可以很多）</li>
<li>Master → <tt>master.example.com</tt> （可能只有一个）</li>
<li>A WebDAV client (<tt>ra_neon</tt>, <tt>ra_serf</tt>其他WebDAV客户端)</li>
</ul>
<p>客户端做：</p>
<pre><code>
    % svn co http://slave.example.com/repos/slave/
    ...
    % svn ci
    % ...etc...
</code></pre>
<p>（客户端可以操作如常）</p>
<p>每个slave配置：</p>
<pre><code>
    &lt;Location /repos/slave&gt;
      DAV svn
      SVNPath /my/local/copy/of/repos
      SVNMasterURI http://master.example.com/repos/master/
    &lt;/Location&gt;
</code></pre>
<p>master必须有一个post-commit钩子可以更新所有的slave，一个例子使用<code>svnadmin dump</code>/<code>svnadmin load</code> ，ssh作为支持。<tt>svnsync可以完成同样的事情。</tt></p>
<p>此外，如果master版本库支持锁定，锁定数据库需要通过post-lock和post-unlock保持同步，将master状态传递到slave。（用户名保留作为读者的练习），如果不传递锁定信息，用户需要能够精确的检测是否有一个锁定-但是锁定会一直工作。</p>
<p>一个实例的同步脚本可能如下：</p>
<pre><code>
   #!/bin/sh
   REPOS="$1"
   REV="$2"
   SLAVE_HOST=slave.example.com
   SLAVE_PATH=/my/local/copy/of/repos

   # Ensure svnadmin is in $PATH on both this machine and the remote server!
   svnadmin dump --incremental -r$2 $1 &gt; /tmp/$2.dump
   scp /tmp/$2.dump $SLAVE_HOST:$SLAVE_PATH
   ssh $SLAVE_HOST "svnadmin load $SLAVE_PATH &lt; $SLAVE_PATH/$2.dump"
   ssh $SLAVE_HOST "rm $SLAVE_PATH/$2.dump"
   rm /tmp/$2.dump
</code></pre>
<h6>进一步阅读</h6>
<p>关于WebDAV代理的更多信息可以看<a href="http://svn.collab.net/repos/svn/trunk/notes/webdav-proxy">in the repository</a>。</p>
<h4>改进和bug修正</h4>
<h5>Copy/move-related improvements (<em>client and server</em>)</h5>
<p>The abilities and behavior of <code>copy</code> and <code>move</code> operations are significantly improved in 1.5+.</p>
<h6>Improved copy-handling during updates (<em>client and server</em>)</h6>
<p>A common problem in older versions of Subversion was the way in which <code>svn update</code> handled incoming copies and moves.</p>
<p>Consider this scenario: Harry runs <code>svn move foo bar; svn commit</code>, and meanwhile Sally makes local changes to &#8216;foo&#8217;, and then runs <code>svn update</code>. In earlier versions of Subversion, the server would send down a completely new file &#8216;bar&#8217;, and unversion the file &#8216;foo&#8217; (if it had no uncommitted changes, Subversion would remove it entirely.) From Sally&#8217;s point of view, her changes seem to be lost; the newly added &#8216;bar&#8217; file has the older content, and the file &#8216;foo&#8217; has been taken out of version control.</p>
<p>In Subversion 1.5, the client and server both attempt to be smarter about this. The server doesn&#8217;t send a whole new file during the update, but rather instructions to copy something that likely already exists in the working copy. So Sally&#8217;s &#8216;foo&#8217; file is copied to &#8216;bar&#8217; (with local edits intact!).</p>
<p>In theory, this is the best-case scenario. There are a few caveats: this &#8220;proper copying&#8221; of existing working-copy resources only works on files, not (yet) on directories. Also, if an incoming move-operation deletes &#8216;foo&#8217; before it attempts to copy it to &#8216;bar&#8217;, then the copy will fail, and the client reverts to the old behavior of fetching a pristine copy of the file from the repository. We hope to address this in svn 1.6.</p>
<p>See <a href="http://subversion.tigris.org/issues/show_bug.cgi?id=503">issue #503</a> for more.</p>
<h6>Peg revisions (<em>client</em>)</h6>
<p>Copy and move operations now accept sources with peg (&#8220;@&#8221;) revisions.</p>
<p>See <a href="http://subversion.tigris.org/issues/show_bug.cgi?id=2546">issue #2546</a> for more.</p>
<h6>Multiple working copy copy/move operations (<em>client</em>)</h6>
<p>Clients may now perform chained copy/move operations locally on a single object in a working copy:</p>
<pre>   svn mv path1 path2
   svn mv path2 path3</pre>
<p>See <a href="http://subversion.tigris.org/issues/show_bug.cgi?id=756">issue #756</a> for more.</p>
<h6>Improved handling multiple copy/move sources (<em>client</em>)</h6>
<p>Clients now accept multiple sources for copy and move operations, with the ability to copy/move each of the sources to the specified directory. This mirrors the behavior of standard command-line copy and move tools, such as <code>cp</code> and <code>mv</code>. For example:</p>
<pre>   svn mkdir new_subdir
   svn mv foo.txt bar.txt baz.txt new_subdir</pre>
<p>In practice, this means users can take advantage of shell globbing when doing a local copy or move:</p>
<pre>   svn cp *.c dir</pre>
<p>Multiple source copy/move also works for all previously defined copy/move working copy and repository combinations.</p>
<p>See <a href="http://subversion.tigris.org/issues/show_bug.cgi?id=747">issue #747</a> for more.</p>
<h6>Copy takes -rBASE (<em>client</em>)</h6>
<p>Copy now understands the special revision &#8220;BASE&#8221; in a working copy (as in: &#8220;<tt>-rBASE</tt>&#8220;).</p>
<p>See <a href="http://subversion.tigris.org/issues/show_bug.cgi?id=1643">issue #1643</a> for more.</p>
<h6>Creation of intermediate directories with copy/move (<em>client and server</em>)</h6>
<p>See the section on the new <a href="http://subversion.tigris.org/svn_1.5_releasenotes.html#intermediate-directories">&#8211;parents option</a> for more about this.</p>
<h5>Cancellation improvements (<em>client</em>)</h5>
<p>Clients operations are now significantly more responsive to cancellation (e.g. via <tt>control-c</tt>). In pre-1.5 releases, after directing an operation to stop, one sometimes had to wait for some time (e.g. while I/O occurred) before the operation would actually stop.</p>
<h5>Command-line client improvements (<em>client</em>)</h5>
<p>There are far too many enhancements and new options to the command-line client to list them all here. Aside from all the ones mentioned already in these release notes, below are a few more that we consider important, but please see the 1.5.0 section in the <a href="http://svn.collab.net/repos/svn/trunk/CHANGES">CHANGES</a> file for a complete list.</p>
<h6>New &#8220;resolve&#8221; subcommand replaces &#8220;resolved&#8221;</h6>
<p>A new <strong><tt>resolve</tt></strong> subcommand replaces the &#8220;<tt>resolved</tt>&#8221; subcommand (the latter is deprecated, but still present for compatibility). The new subcommand takes a <strong><tt>--accept=orig|mine|repo</tt></strong> option to select which version of a file to retain (which means Subversion now supports batch-style conflict resolution).</p>
<p>See <a href="http://subversion.tigris.org/issues/show_bug.cgi?id=2784">issue #2784</a> for more.</p>
<h6>Create intermediate directories if asked</h6>
<p>Add, mkdir, copy, and move take a new <strong><tt>--parents</tt></strong> option, which makes intermediate directories as necessary to create the destination path.</p>
<p>See <a href="http://subversion.tigris.org/issues/show_bug.cgi?id=1776">issue #1776</a> for more</p>
<h6>New &#8211;keep-local option retains path after delete.</h6>
<p>Delete (remove) now takes a <strong><code>--keep-local</code></strong> option to retain its targets locally, so paths will not be removed even if unmodified.</p>
<h6>Commit now takes a &#8211;with-revprop option.</h6>
<p>Commit now takes a <strong><tt>--with-revprop</tt></strong> option allowing one to set revision properties</p>
<p>See <a href="http://subversion.tigris.org/issues/show_bug.cgi?id=1976">issue #1976</a> for more.</p>
<h5>Easier to try out experimental <tt>ra_serf</tt> DAV access module (<em>client</em>)</h5>
<p>Subversion 1.4 introduced the experimental <tt>ra_serf</tt> repository access module for accessing HTTP[S] DAV Subversion servers. This uses the <a href="http://code.google.com/p/serf/">serf</a> library instead of the Neon library which the original DAV support uses. serf supports pipelined requests which may lead to better performance. However, Subversion 1.4 required you to choose which module to use for accessing DAV servers at build time, which made it difficult to find out which module performs better for your usage patterns.</p>
<p>Subversion 1.5 allows you to build both modules at the same time; you can choose which library to use on a global or host-by-host basis by setting the <tt>http-library</tt> variable in your run-time server configuration file (<tt>~/.subversion/servers</tt>). In recognition of the fact that both libraries are DAV clients, we have renamed <tt>ra_dav</tt> to <tt>ra_neon</tt>.</p>
<h5>API changes, improvements and language bindings (<em>client and server</em>)</h5>
<p>There are too many new and revised APIs in Subversion 1.5.0 to even begin to list them all here. See the <a href="http://svn.collab.net/svn-doxygen/">Subversion API Documentation</a> page for general API information. If you develop a 3rd-party client application that uses Subversion APIs, you should probably look at the header files for the interfaces you use and see what&#8217;s changed.</p>
<p>One general change is that most APIs that formerly took a <tt>recurse</tt> parameter have been upgraded to accept a <tt>depth</tt> parameter instead, to enable the new <a href="http://subversion.tigris.org/svn_1.5_releasenotes.html#sparse-checkouts">sparse checkouts</a> feature.</p>
<p>Language bindings have mostly been updated for the new APIs, though some may lag more than others.</p>
<h5>Bug fixes (<em>client and server</em>)</h5>
<p>A great many bugs have been fixed. See the 1.5.0 section in the <a href="http://svn.collab.net/repos/svn/trunk/CHANGES">CHANGES</a> file for details.</p>
<h4>Subversion 1.3.x series no longer supported</h4>
<p>The Subversion 1.3.x line is no longer supported. This doesn&#8217;t mean that your 1.3 installation is doomed; if it works well and is all you need, that&#8217;s fine. &#8220;No longer supported&#8221; just means we&#8217;ve stopped accepting bug reports against 1.3.x versions, and will not make any more 1.3.x bugfix releases, except perhaps for absolutely critical security or data-loss bugs.</p>
<h4>Subversion Dependencies Distribution: Binary Compatibility Issues</h4>
<h5>Background</h5>
<p>APR 0.9.x and 1.x are binary-incompatible. This means if you are already using Subversion with APR 0.9.x, and then upgrade your libapr to 1.X <em>without rebuilding Subversion</em>, things will break. Things will also break if your Subversion server libraries are linked to one version of APR but your Apache HTTPD server is linked to a different version.</p>
<p>For a long time, Subversion&#8217;s main source distribution included APR 0.9.x, which was the latest available at the time, along with a few other things (e.g., Neon, zlib) that weren&#8217;t yet widespread on installation systems.</p>
<h5>Subversion 1.5.0 Dependencies Distribution</h5>
<p>Today, these dependencies are no longer exotic, so our source distribution contains just Subversion itself. Those building Subversion are expected to have the necessary libraries already installed, or to be able to fetch them easily. But for convenience, we still offer a &#8220;deps&#8221; distribution: it doesn&#8217;t contain Subversion, it just has source code for those third-party libraries.</p>
<p>Until Subversion 1.5.0, the deps distribution contained APR 0.9.x, but as of 1.5.0, we&#8217;re finally upgrading it to APR 1.x. This is because by now there are very few systems that will have binary compatibility issues, and of those, few are likely to build using the &#8220;deps&#8221; dist.</p>
<p>If you already have a Subversion installation using APR 0.9.x, it&#8217;s still possible to move to APR 1.x safely (although you are not required to, unless you use the deps dist). Just be sure to recompile Subversion, and Apache httpd if necessary, after upgrading APR.</p>
<p>Note that it&#8217;s perfectly safe to use APR 1.x from the beginning. In fact, we recommend it. If you&#8217;re building Subversion for the first time, there&#8217;s no compatibility issue to worry about, so just grab the latest version of APR (or use our deps dist).</p>


<p>Related posts:<ol><li><a href='http://rocksun.cn/svnchanged-export/' rel='bookmark' title='Permanent Link: Subversion: Export changed Files in a revision range'>Subversion: Export changed Files in a revision range</a></li><li><a href='http://rocksun.cn/authenticate-svnserve-with-sasl/' rel='bookmark' title='Permanent Link: 使用svnserve的SASL认证'>使用svnserve的SASL认证</a></li><li><a href='http://rocksun.cn/ftp-image-with-conext-menu/' rel='bookmark' title='Permanent Link: FTP image with Conext Menu'>FTP image with Conext Menu</a></li></ol></p>
<p></p>]]></content:encoded>
			<wfw:commentRss>http://rocksun.cn/subversion-15-releasenotes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用svnserve的SASL认证</title>
		<link>http://rocksun.cn/authenticate-svnserve-with-sasl/</link>
		<comments>http://rocksun.cn/authenticate-svnserve-with-sasl/#comments</comments>
		<pubDate>Sun, 15 Jun 2008 14:53:26 +0000</pubDate>
		<dc:creator>rocksun</dc:creator>
				<category><![CDATA[recommend]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[authenticate]]></category>
		<category><![CDATA[SASL]]></category>
		<category><![CDATA[svnserve]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://rocksun.cn/?p=114</guid>
		<description><![CDATA[Subversion1.5引入了SASL库，这给了我们机会使用SASL提供的认证方式来为svnserve进行认证，本文介绍了Windows下的配置方式。
SASL核心发布目前支持认证协议有：

ANONYMOUS
CRAM-MD5
PLAIN
GSSAPI (MIT Kerberos 5 or Heimdal Kerberos 5)
DIGEST-MD5

也支持如下的认证协议：

LOGIN
SRP
NTLM
OTP
KERBEROS_V4

Windows下这些模块可能都保存为dll，你可以选择自己编译，也可以选择获取二进制程序，现在还不清楚官方的Subversion发布会不会包含所有的模块，但是现在已知的Collabnet Subversion包含了几乎所有的模块，下载地址为：
http://merge-tracking.open.collab.net/servlets/ProjectProcess?pageID=3711
SASL配置
linux下的配置文件好说，windows下SASL配置文件需要使用注册表配置，要在你的系统配置SASL，第一步就是设置注册表：
[HKEY_LOCAL_MACHINE\SOFTWARE\Carnegie Mellon\Project Cyrus\SASL Library]
&#8220;SearchPath&#8221;=&#8221;C:\\Program Files\\CollabNet Subversion Server&#8221;
&#8220;ConfFile&#8221;=&#8221;C:\\Program Files\\CollabNet Subversion Server&#8221;
这个是安装Collabnet Subversion时自动创建的，可以看到有两个键，其中“SearchPath”指明所有的扩展认证方式库存放的路径（那些dll），而ConfFile指明SASL配置文件的路径，在上面的配置里，配置文件应该是“C:\\Program Files\\CollabNet Subversion Server\\svn.conf”。下面看看我们的这个svn.conf文件：
pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: ANONYMOUS CRAM-MD5
sasldb_path: C:\svn_repository\sasldb
其中pwcheck_method指明检查的方法，这里是“auxprop ”，这个pwcheck_method还对应了如启动一个代理作为认证服务等方式，而现在的意思就是使用本文件说的方式去检查。然后我们指明auxprop_plugin为sasldb，也就是使用一个文件存放用户名密码，也就是“C:\svn_repository\sasldb”,其它的认证信息存放plugin还有sql和ldapdb。而mech_list指明了认证信息传递机制，现在指明的是ANONYMOUS和CRAM-MD5。 这里还需要做的是创建那个“C:\svn_repository\sasldb”文件：

saslpasswd2 -c -f C:\svn_repository\sasldb -u myrealm username

然后输入密码，这样就在sasldb建立了一个用户，注意“myrealm ”，后面我们还会用到，要想查看建立的用户，可以用：
sasldblistusers2.exe -f C:\svn_repository\sasldb
好的，到此为止SASL部分已经好了，需要注意的是，前面svn.conf的修改要生效必须重启svnserve，这与以前我们修改svnserve.conf立即生效不一样了。我们再去对svnserve作出相应的修改。
svnserve配置
打开一个svnserve管理的库，打开svnserve.conf，把下面这行的注释去掉
use-sasl = true
然后修改realm为前面的myrealm：
realm = myrealm
总结
好的，现在可能就好了，checkout一个工作拷贝，然后提交看看，是不是用了sasldb中的用户名密码。
比较愁人的是，SASL的文档实在太少了，而各种各样的说明也非常不清楚，我也是在不断的整理中逐渐澄清了一些问题。其实SASL更多的是提供了很多认证信息传递的协议，而对于密码保存的方式，他目前只是支持了文件、SQL和LDAP等方式，对于很多人希望的域认证来说，似乎要送ldap访问Active Directory方式入手（后面实际尝试一下），而前面所说的NTLM，只是说认证协议是NTLM的，并不能支持使用现有的域用户认证。
参考资料

Subversion关于SASL的说明：http://svn.collab.net/repos/svn/trunk/notes/sasl.txt
Cyrus SASL下载（里面有一些文档，但是要好好看才行）：ftp://ftp.andrew.cmu.edu/pub/cyrus-mail



Related posts:Dreamhost上编译SubversionWindows编译Subversion简要说明Subversion: Export changed Files in a revision range



Related posts:<ol><li><a href='http://rocksun.cn/install-subversion-on-dreamhost/' rel='bookmark' title='Permanent Link: Dreamhost上编译Subversion'>Dreamhost上编译Subversion</a></li><li><a href='http://rocksun.cn/windows%e7%bc%96%e8%af%91subversion%e7%ae%80%e8%a6%81%e8%af%b4%e6%98%8e/' rel='bookmark' title='Permanent Link: Windows编译Subversion简要说明'>Windows编译Subversion简要说明</a></li><li><a href='http://rocksun.cn/svnchanged-export/' rel='bookmark' title='Permanent Link: Subversion: Export changed Files in a revision range'>Subversion: Export changed Files in a revision range</a></li></ol>

]]></description>
			<content:encoded><![CDATA[<p>Subversion1.5引入了<a href="http://subversion.tigris.org/svn_1.5_releasenotes.html#cyrus-sasl">SASL库</a>，这给了我们机会使用SASL提供的认证方式来为svnserve进行认证，本文介绍了Windows下的配置方式。</p>
<p>SASL核心发布目前支持认证协议有：</p>
<ul>
<li>ANONYMOUS</li>
<li>CRAM-MD5</li>
<li>PLAIN</li>
<li>GSSAPI (MIT Kerberos 5 or Heimdal Kerberos 5)</li>
<li>DIGEST-MD5</li>
</ul>
<p>也支持如下的认证协议：</p>
<ul>
<li>LOGIN</li>
<li>SRP</li>
<li>NTLM</li>
<li>OTP</li>
<li>KERBEROS_V4</li>
</ul>
<p>Windows下这些模块可能都保存为dll，你可以选择自己编译，也可以选择获取二进制程序，现在还不清楚官方的Subversion发布会不会包含所有的模块，但是现在已知的Collabnet Subversion包含了几乎所有的模块，下载地址为：</p>
<p><a title="http://merge-tracking.open.collab.net/servlets/ProjectProcess?pageID=3711" href="http://merge-tracking.open.collab.net/servlets/ProjectProcess?pageID=3711">http://merge-tracking.open.collab.net/servlets/ProjectProcess?pageID=3711</a></p>
<h2>SASL配置</h2>
<p>linux下的配置文件好说，windows下SASL配置文件需要使用注册表配置，要在你的系统配置SASL，第一步就是设置注册表：</p>
<blockquote><p>[HKEY_LOCAL_MACHINE\SOFTWARE\Carnegie Mellon\Project Cyrus\SASL Library]<br />
&#8220;SearchPath&#8221;=&#8221;C:\\Program Files\\CollabNet Subversion Server&#8221;<br />
&#8220;ConfFile&#8221;=&#8221;C:\\Program Files\\CollabNet Subversion Server&#8221;</p></blockquote>
<p>这个是安装Collabnet Subversion时自动创建的，可以看到有两个键，其中“SearchPath”指明所有的扩展认证方式库存放的路径（那些dll），而ConfFile指明SASL配置文件的路径，在上面的配置里，配置文件应该是“C:\\Program Files\\CollabNet Subversion Server\\svn.conf”。下面看看我们的这个svn.conf文件：</p>
<blockquote><p>pwcheck_method: auxprop<br />
auxprop_plugin: sasldb<br />
mech_list: ANONYMOUS CRAM-MD5<br />
sasldb_path: C:\svn_repository\sasldb</p></blockquote>
<p>其中pwcheck_method指明检查的方法，这里是“auxprop ”，这个pwcheck_method还对应了如启动一个代理作为认证服务等方式，而现在的意思就是使用本文件说的方式去检查。然后我们指明auxprop_plugin为sasldb，也就是使用一个文件存放用户名密码，也就是“C:\svn_repository\sasldb”,其它的认证信息存放plugin还有sql和ldapdb。而mech_list指明了认证信息传递机制，现在指明的是ANONYMOUS和CRAM-MD5。 这里还需要做的是创建那个“C:\svn_repository\sasldb”文件：</p>
<blockquote>
<pre>saslpasswd2 -c -f C:\svn_repository\sasldb -u myrealm username</pre>
</blockquote>
<p>然后输入密码，这样就在sasldb建立了一个用户，注意“myrealm ”，后面我们还会用到，要想查看建立的用户，可以用：</p>
<blockquote><p>sasldblistusers2.exe -f C:\svn_repository\sasldb</p></blockquote>
<p>好的，到此为止SASL部分已经好了，需要注意的是，前面svn.conf的修改要生效必须重启svnserve，这与以前我们修改svnserve.conf立即生效不一样了。我们再去对svnserve作出相应的修改。</p>
<h2>svnserve配置</h2>
<p>打开一个svnserve管理的库，打开svnserve.conf，把下面这行的注释去掉</p>
<blockquote><p>use-sasl = true</p></blockquote>
<p>然后修改realm为前面的myrealm：</p>
<blockquote><p>realm = myrealm</p></blockquote>
<h2>总结</h2>
<p>好的，现在可能就好了，checkout一个工作拷贝，然后提交看看，是不是用了sasldb中的用户名密码。</p>
<p>比较愁人的是，SASL的文档实在太少了，而各种各样的说明也非常不清楚，我也是在不断的整理中逐渐澄清了一些问题。其实SASL更多的是提供了很多认证信息传递的协议，而对于密码保存的方式，他目前只是支持了文件、SQL和LDAP等方式，对于很多人希望的域认证来说，似乎要送ldap访问Active Directory方式入手（后面实际尝试一下），而前面所说的NTLM，只是说认证协议是NTLM的，并不能支持使用现有的域用户认证。</p>
<h2>参考资料</h2>
<ul>
<li>Subversion关于SASL的说明：<a title="http://svn.collab.net/repos/svn/trunk/notes/sasl.txt" href="http://svn.collab.net/repos/svn/trunk/notes/sasl.txt">http://svn.collab.net/repos/svn/trunk/notes/sasl.txt</a></li>
<li>Cyrus SASL下载（里面有一些文档，但是要好好看才行）：<a title="ftp://ftp.andrew.cmu.edu/pub/cyrus-mail" href="ftp://ftp.andrew.cmu.edu/pub/cyrus-mail">ftp://ftp.andrew.cmu.edu/pub/cyrus-mail</a></li>
</ul>


<p>Related posts:<ol><li><a href='http://rocksun.cn/install-subversion-on-dreamhost/' rel='bookmark' title='Permanent Link: Dreamhost上编译Subversion'>Dreamhost上编译Subversion</a></li><li><a href='http://rocksun.cn/windows%e7%bc%96%e8%af%91subversion%e7%ae%80%e8%a6%81%e8%af%b4%e6%98%8e/' rel='bookmark' title='Permanent Link: Windows编译Subversion简要说明'>Windows编译Subversion简要说明</a></li><li><a href='http://rocksun.cn/svnchanged-export/' rel='bookmark' title='Permanent Link: Subversion: Export changed Files in a revision range'>Subversion: Export changed Files in a revision range</a></li></ol></p>
<p></p>]]></content:encoded>
			<wfw:commentRss>http://rocksun.cn/authenticate-svnserve-with-sasl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

