﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-subversion svn </title><link>http://www.cnitblog.com/subversion/</link><description>subversion</description><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2026 10:09:43 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2026 10:09:43 GMT</pubDate><ttl>60</ttl><item><title>Linux下 只允许用户修改自己的svn日志的钩子脚本</title><link>http://www.cnitblog.com/subversion/archive/2011/05/10/73509.html</link><dc:creator>subversion</dc:creator><author>subversion</author><pubDate>Tue, 10 May 2011 08:33:00 GMT</pubDate><guid>http://www.cnitblog.com/subversion/archive/2011/05/10/73509.html</guid><wfw:comment>http://www.cnitblog.com/subversion/comments/73509.html</wfw:comment><comments>http://www.cnitblog.com/subversion/archive/2011/05/10/73509.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/subversion/comments/commentRss/73509.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/subversion/services/trackbacks/73509.html</trackback:ping><description><![CDATA[<p>本钩子实现用户可以修改自己的svn日志，脚本适用于Linux。 </p>
<p>操作方法： </p>
<p>1、将版本库的hooks文件夹中的pre-revprop-change.tmp修改成pre-revprop-change </p>
<p>2、为pre-revprop-change加上执行权限：使用命令chmod +x </p>
<p>3、将pre-revprop-change内容改成下面的样子。 </p>
<pre>#!/bin/sh
REPOS="$1"
REV="$2"
USER="$3"
PROPNAME="$4"
ACTION="$5"
if [ "$USER"&nbsp;!= $(<strong>/usr/local/subversion/bin/svnlook author</strong> -r "$2" "$1") ]; then   //判断不是自己提交的文件及日志
echo "author error!" &gt;$2
exit 1
elif [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then    //只能修改日志，不能编辑作者
exit 0
fi
echo "Changing revision properties other than svn:log is prohibited" &gt;&amp;2
exit 1
</pre>
<p>注：黑体部分<strong>/usr/local/subversion/bin/svnlook</strong> 根据自己的存储路径不同而做相应的改变 </p>
<img src ="http://www.cnitblog.com/subversion/aggbug/73509.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/subversion/" target="_blank">subversion</a> 2011-05-10 16:33 <a href="http://www.cnitblog.com/subversion/archive/2011/05/10/73509.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>强制svn 提交代码者 添加注释信息</title><link>http://www.cnitblog.com/subversion/archive/2008/11/12/51364.html</link><dc:creator>subversion</dc:creator><author>subversion</author><pubDate>Wed, 12 Nov 2008 05:28:00 GMT</pubDate><guid>http://www.cnitblog.com/subversion/archive/2008/11/12/51364.html</guid><wfw:comment>http://www.cnitblog.com/subversion/comments/51364.html</wfw:comment><comments>http://www.cnitblog.com/subversion/archive/2008/11/12/51364.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/subversion/comments/commentRss/51364.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/subversion/services/trackbacks/51364.html</trackback:ping><description><![CDATA[打开你建立的项目，里面有个hooks目录，更改 pre-commit.tmpl 为pre-commit<br>编辑pre-commit 文件内容，找到下面3行，用#注释掉。<br><br>&nbsp;$SVNLOOK log -t "$TXN" "$REPOS" | \<br>&nbsp;grep "[a-zA-Z0-9]" &gt; /dev/null || exit 1<br>&nbsp;commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1<br><br>然后再修改处下面增加一下内容。<br><br>LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`<br>if [ "$LOGMSG" -lt 5 ];#........5.........<br>then<br>&nbsp;echo -e "\nLog message cann't be empty! you must input more than 5 chars as comment!." 1&gt;&amp;2<br>exit 1<br>fi<br><br>保存退出。 设置pre-commit文件权限可执行 使用如下命令chomd +x pre-commit<br><br>完毕<br><br><img src ="http://www.cnitblog.com/subversion/aggbug/51364.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/subversion/" target="_blank">subversion</a> 2008-11-12 13:28 <a href="http://www.cnitblog.com/subversion/archive/2008/11/12/51364.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>trac, subversion and apache on Fedora </title><link>http://www.cnitblog.com/subversion/archive/2008/05/15/43790.html</link><dc:creator>subversion</dc:creator><author>subversion</author><pubDate>Thu, 15 May 2008 15:41:00 GMT</pubDate><guid>http://www.cnitblog.com/subversion/archive/2008/05/15/43790.html</guid><description><![CDATA[<h2>trac, subversion and apache on Fedora 8</h2>
<div class=t_msgfont id=postmessage_424315>Prepare:<br># <span class=t_tag onclick=tagshow(event) href="tag.php?name=yum">yum</span> install svn mod_dav_svn trac<br><br>Subversion:<br># useradd svn -d /svn<br># <span class=t_tag onclick=tagshow(event) href="tag.php?name=chm">chm</span>od g+rwx /svn<br># su svn<br>$ cd<br>$ mkdir repos trac .conf<br>$ cd repos<br>$ mkdir proj0<br>$ svnadmin create --fs-type fsfs proj0<br><br><span class=t_tag onclick=tagshow(event) href="tag.php?name=The">The</span> commands start with "#" should be excuted as root. About the repository filesystem type, you can choose either FSFS or Berkelay-DB, I'd like the simple one... <br><br>Trac:<br>$ cd ~/trac<br>$ mkdir proj0<br>$ cd proj0<br>$ trac-admin proj0 initenv<br><br>Then the program will ask you some questions about the project, if you are using SQLite as the DB, just <span class=t_tag onclick=tagshow(event) href="tag.php?name=make">make</span> sure the path of subversion repository is correct, /svn/repos/proj0 in this example. <br><br>Apache:<br>$ su<br># cd /etc/httpd<br><br>Setup svn: <br><br># vim conf.d/subversion.conf<br><br>Modify the Location section: <br><br>&lt;Location /svn&gt; <br><br>DAV svn<br>SVNParentPath /svn/repos<br>AuthType Basic<br>AuthName "SVN repos"<br>AuthUserFile /svn/.conf/userlist<br>AuthzSVNAccessFile /svn/.conf/authfile<br>Require valid-user <br><br>&lt;/Location&gt;<br><br>Setup trac: <br><br># vim conf.d/trac.conf<br><br>Comment all settings and modify the Location section: <br><br>&lt;Location /trac&gt; <br><br>SetEnv TRAC_ENV /svn/trac<br>SetEnv PYTHON_EGG_CACHE /tmp<br>SetHandler mod_python<br>PythonHandler trac.<span class=t_tag onclick=tagshow(event) href="tag.php?name=web">web</span>.modpython_frontend<br>PythonInterpreter main_interpreter<br>PythonOption TracEnvParentDir /svn/trac<br>AuthType Basic<br>AuthName "Trac Projects"<br>AuthUserFile /svn/.conf/userlist <br><br>&lt;/Location&gt;<br><br>Because I will manage the accouts with the trac plugin, the "Require valid-user" option doesn't need be here. <br><br>Then, setup the httpd: <br><br># usermod -G svn apache<br># chkconfig --level 5 httpd on<br># htpasswd -c /svn/.conf/userlist test<br><br>Account Management:<br># su svn<br>$ cd ~/.conf<br>$ vim authfile<br><br>For more details about the svn authz module, please read the svn-book.pdf in official web site, it's pretty good. Now make the authfile looked like this: <br><br>[proj0:/]<br>* = r<br>test = rw<br><br>At last, we need install easy_install to install the trac plugins packaged as the python eggs: <br><br>$ cd<br>$ wget <a href="http://peak.telecommunity.com/dist/ez_setup.py" target=_blank><u><font color=#810081>http://peak.telecommunity.com/dist/ez_setup.py</font></u></a><br>$ su<br># python ez_setup.py -U setuptools<br># easy_install <a href="http://trac-hacks.org/svn/accountmanagerplugin/0.10" target=_blank><u><font color=#0000ff>http://trac-hacks.org/svn/accountmanagerplugin/0.10</font></u></a><br># easy_install <a href="http://svn.edgewall.com/repos/trac/sandbox/webadmin" target=_blank><u><font color=#0000ff>http://svn.edgewall.com/repos/trac/sandbox/webadmin</font></u></a><br># vim trac/proj0/conf/trac.ini<br><br>Add these: <br><br>[components]<br>webadmin.* = enabled<br>trac.web.auth.LoginModule = disabled<br>acct_magr.* = enabled<br><br>Then start the httpd service: <br><br># service httpd restart<br><br>Open your browser and type the address: http://localhost/trac/proj0, DO HAVE FUN.</div>
<img src ="http://www.cnitblog.com/subversion/aggbug/43790.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/subversion/" target="_blank">subversion</a> 2008-05-15 23:41 <a href="http://www.cnitblog.com/subversion/archive/2008/05/15/43790.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用 Apache 和 Subversion 搭建安全的版本控制环境 ---ibm</title><link>http://www.cnitblog.com/subversion/archive/2006/09/15/16880.html</link><dc:creator>subversion</dc:creator><author>subversion</author><pubDate>Fri, 15 Sep 2006 06:36:00 GMT</pubDate><guid>http://www.cnitblog.com/subversion/archive/2006/09/15/16880.html</guid><wfw:comment>http://www.cnitblog.com/subversion/comments/16880.html</wfw:comment><comments>http://www.cnitblog.com/subversion/archive/2006/09/15/16880.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/subversion/comments/commentRss/16880.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/subversion/services/trackbacks/16880.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 级别: 中级																																																																				吴																																																																																										玥...&nbsp;&nbsp;<a href='http://www.cnitblog.com/subversion/archive/2006/09/15/16880.html'>阅读全文</a><img src ="http://www.cnitblog.com/subversion/aggbug/16880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/subversion/" target="_blank">subversion</a> 2006-09-15 14:36 <a href="http://www.cnitblog.com/subversion/archive/2006/09/15/16880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache2+Subversion1.3.x安装手记 </title><link>http://www.cnitblog.com/subversion/archive/2006/09/12/16745.html</link><dc:creator>subversion</dc:creator><author>subversion</author><pubDate>Tue, 12 Sep 2006 10:54:00 GMT</pubDate><guid>http://www.cnitblog.com/subversion/archive/2006/09/12/16745.html</guid><wfw:comment>http://www.cnitblog.com/subversion/comments/16745.html</wfw:comment><comments>http://www.cnitblog.com/subversion/archive/2006/09/12/16745.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/subversion/comments/commentRss/16745.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/subversion/services/trackbacks/16745.html</trackback:ping><description><![CDATA[一、安装<br />第一次安装Subversion，在昨天的安装过程中，出现了一些问题：<br /><strong>第一步,安装Apache+Subversion</strong><br />       首先，我选择了apache_2.2.3+svn-1.3.2的组合。开始安装Apache server就报错，提示http.conf第133行出错，打开在前面加了个#，启动成功。接着安装svn-1.3.2，配置好httpd.conf之后发现apche的服务无法启动，说是无法加载mod_dav_svn.so。baidu之后发现是svn无法在apache2.2下面安装，其<a href="http://subversion.tigris.org/project_packages.html"><font style="BACKGROUND-COLOR: #fdfde1" color="#cc0000">官方下载页面</font></a>也有提示说：Note that the Apache modules included in this package was compiled against Apache HTTP Server 2.0, and thus will <em>not</em> work with Apache HTTP Server 2.2.下载的过程中，没注意这个东西！下次得多留意这些细节。<br /><br />       只好重新下载安装apache_2.0.59版本，把Subversion/bin下面所有.dll文件复制到Apache Group\Apache2\bin下，提示有文件覆盖，选择不覆盖；再将Subversion/bin下的.so文件复制到Apache Group\Apache2\modules下。<br /><br /><p><strong>第二步,修改apache的配置文件<br /></strong>接著打开Apache HTTP Server 的 httpd.conf（在 <apache_root>/conf/ 目录下），先找到以下两行：<br />#LoadModule dav_module modules/mod_dav.so<br />#LoadModule dav_fs_module modules/mod_dav_fs.so<br />把這两行最前面的 '#' 字符刪除，然后把下面这行加到这些 LoadModule 指令的后面：<br />LoadModule dav_svn_module modules/mod_dav_svn.so<br />LoadModule authz_svn_module modules/mod_authz_svn.so<br />用记事本打开 Apache HTTP Server 的 httpd.conf，在文件最后面加上以下几行:<br />&lt;Location /svn&gt;<br />    DAV svn<br />    SVNParentPath d:/svn<br />&lt;/Location&gt;<br />其中d:/svn为你要建的仓库的父目录(必须为本地目录),最好用双引号引一下.<br /></apache_root></p><p><strong>第三步,创建仓库<br /></strong>根据apache的配置文件的设置建立目录:d:/svn.然后我们就可以在下面建立仓库了,创建方法如下:<br />c:\&gt;svnadmin create d:/svn/repository<br />命令执行成功之后,会在d:/svn/repository下面生成很多的文件和目录</p><p><strong>第四步,使用<br /></strong>重新启动Apache Server<br />在浏览器中输入网址: <br />http://localhost/svn/repository/<br />这时候,看到页面显示：<br /><br />Revision 0: /<br /><em>Powered by </em><a href="http://subversion.tigris.org/"><em>Subversion</em></a><em> version 1.3.2 (r19776).<br /></em><br /><br /><br /><br /><br />安装成功，接下来将进行进一步的设置。<br /><br />二、配置<br /><br />1．  以两种方式运行<br /><br />（1） 以apache方式运行<br />  svn使用apache的权限管理对档案库及目录进行读写管理。<br />  <br />  建立保存用户名和密码的文件<br />  htpasswd -c  /svn-auth-filename username1<br />  然后，会提示输入密码，这里就加入了一个用户了。然后再加一个用户：<br />  htpasswd -m  /svn-auth-filename username2<br />  <br />  建立控制用户访问权限的文件svn-access-filename<br /> [svn1:/]               //这表示，仓库svn1的根目录下的访问权限<br /> harry = rw             // svn1仓库harry用户具有读和写权限<br /> sally = r               // svn1仓库sally用户具有读权限<br /> [svn2:/]               //svn2仓库根目录下的访问权限<br /> harry = r               // harry用户在svn2仓库根目录下只有读权限<br /> sally =               // sally用户在 svn2仓库根目录下无任何权限<br /> [svn2:/src]           //svn2仓库下src目录的访问权限<br /> harry=rw             <br /> sally=r<br /> [/]                  // 这个表示在所有仓库的根目录下<br /> * = r               // 这个表示对所有的用户都具有读权限<br /> [groups]               // 这个表示群组设置<br /> svn1-developers = harry, sally           // 这个表示某群组里的成员<br /> svn2-developers = sally<br /> [svn1:/]            <br /> @svn1-developers = rw       // 如果在前面加上@符号，则表示这是个群组权限设置<br />  <br />然后修改httpd.conf配置：<br />&lt;Location /svn&gt; <br />DAV svn<br />SVNParentPath /svn<br />AuthType Basic<br />AuthName “Subversion repository”<br />AuthUserFile /svn-auth-filename （保存用户名和密码）<br />Require valid-user<br />AuthzSVNAccessFile /svn-access-filename（保存用户访问的权限策略）<br />&lt;/Location&gt;<br />（注：）<br /> /svn-auth-filename 文件直接可以放到C:\Program Files\Apache Group\Apache2\下，这也是默认的目录，置于其他目录下，启动apache server出现错错误。<br />AuthUserFile文件需要用htpasswd工具创建、维护；AuthzSVNAccessFile 文件可以用Subversion创建仓库以后，生成的conf文件夹下面的authz文件加以修改。<br />如果已经有一个apache服务，希望两个apache服务同时运行，则修改其中一个的服务端口。<br />修改httpd.conf中的一行： Listen 80 将80改成其他不用的端口号</p><p>启动apahce就可以通过<br /><a href="http://svnmachine-ip/svn/svn1">http://svnmachine-ip/svn/svn1</a><br /><a href="http://svnmachine-ip/svn/svn2">http://svnmachine-ip/svn/svn2</a><br />这两个URL来访问仓库了，当然，要受权限的限制，必须是合法用户才能访问且具有相应的权限</p><p>（2） svnserve方式运行<br />这种方式的运行又可以分为以下两种(这和vsftp有些相似)<br />1) standalone mode<br />直接运行 #svnserve –d<br />运行 lsof -i :3690可以看到SVN服务器已经在运行</p><p>2) xinetd mode<br />在/etc/xinetd.d/下生成svnserve文件，内容如下<br />service svnserve<br />{<br />disable = no<br />socket_type = stream<br />protocol = tcp<br />wait = no<br />user = svnpub  (最好建一个这样的用户管理svn)<br />server = /usr/local/bin/svnserve<br />server_args = -i<br />}<br />编辑 /etc/services 檔,加入底下两行:<br />svnserve 3690/tcp # Subversion svnserve<br />svnserve 3690/udp # Subversion svnserve<br />重启xinetd服务，运行 netstat -a|grep svnserve 可以看到SVN服务器已经在运行</p><p>默认下客户可以以匿名方式通过svn://方式任意访问档案库，为了限制其权限，比如只允许读操作，可以通过修改档案库conf子目录中的svnseve.conf文件来实现。<br />#vi /svn1/conf/svnseve.conf<br />将下面三行前的＃去掉<br />anon-access = none            //则匿名用户不可以通过svn://方式访问档案库<br />auth-access = write     <br />password-db = passwd          //使用passwd中的用户名和密码进行认证，有一点不好的是这里面的密码输的是明文<br />authz-db = authz              //使用authz中的权限控制策略，写法如同apache中的svn-access-filename</p><p>如果想更强的安全性可以使用svn+ssh://访问机制。<br />首当用户通过svn+ssh://访问时，服务器会自动启动ssh认证机制，要求用户输入密码，对于window用户来说还需要安装第三方软件openssh，才可以采用这种机制。</p><p>2．  将代码导入项目仓库。在要导入仓库的目录上面点击右键，点击TortoiseSVN项的子菜单Import…在URl里面填写http://服务器IP/svn/project，这里project就是刚刚建立的项目仓库，</p><p>在下面填入注释，点击OK，弹出提示输入用户名密码对话框，填入flmn和password，就可以把代码导入仓库了。刚刚导入的文件并没有显示被svn管理，现在把这个目录里文件都删除，再在右键菜单里选择SVN Checkout…就可以导出代码，再看这个目录，就有个小图标在文件夹图标下面了。</p><p>3．  对于其它操作，和CVS差不多，这里就不赘述了。可以参考TortoiseSVN帮助文件。<br /></p><img src ="http://www.cnitblog.com/subversion/aggbug/16745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/subversion/" target="_blank">subversion</a> 2006-09-12 18:54 <a href="http://www.cnitblog.com/subversion/archive/2006/09/12/16745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SVN使用技巧</title><link>http://www.cnitblog.com/subversion/archive/2006/09/12/16737.html</link><dc:creator>subversion</dc:creator><author>subversion</author><pubDate>Tue, 12 Sep 2006 08:05:00 GMT</pubDate><guid>http://www.cnitblog.com/subversion/archive/2006/09/12/16737.html</guid><wfw:comment>http://www.cnitblog.com/subversion/comments/16737.html</wfw:comment><comments>http://www.cnitblog.com/subversion/archive/2006/09/12/16737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/subversion/comments/commentRss/16737.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/subversion/services/trackbacks/16737.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>Submitted by <i>xyz黑板</i> on 星期一, 一月 9, 2006 - 11:17</td>
								<td style="TEXT-ALIGN: right">
										<a href="http://xyzboard.com/?q=taxonomy/term/1">随笔</a>
								</td>
						</tr>
				</tbody>
		</table>
		<hr />
		<!-- insert the node body -->
		<div class="Section1">这里不好排版，大家可以在附件中下载排好版的教程。<br /><a name="_Toc121547260"></a><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">程序员编写程序的过程中，每个程序都会有很多不同的版本，这就需要程序员很好的管理代码，在需要的时间可以取出需要的版本，并且每个版本都有一个完整的说明。</span></p><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">我们使用</span>Sub Version<span style="FONT-FAMILY: 宋体">（简称</span>SVN<span style="FONT-FAMILY: 宋体">）作为版本管理工具。这里着重介绍</span>SVN<span style="FONT-FAMILY: 宋体">作为跨平台的多人协作使用方法。在多个程序员管理同一段代码的过程中，版本的管理显得尤为重要，使用</span>SVN<span style="FONT-FAMILY: 宋体">可以方便的进行分支、合并，记录下所有的版本。</span></p><a name="_Toc121547261"></a><span><span style="FONT-FAMILY: 宋体">基本配置</span></span><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">在开始某项软件、文档的开发与撰写时，首先由配置管理负责人建立</span>SVN<span style="FONT-FAMILY: 宋体">仓库、用户名及其权限，并通知相关人员</span>SVN<span style="FONT-FAMILY: 宋体">仓库地址、</span>SVN<span style="FONT-FAMILY: 宋体">仓库负责人。</span></p><a name="_Toc121547262"></a><p class="a" style="TEXT-INDENT: 24pt">SVN<span style="FONT-FAMILY: 宋体">仓库的负责人把工程的</span>tsvn:logminisize<span style="FONT-FAMILY: 宋体">设置为</span>1<span style="FONT-FAMILY: 宋体">，以便强制注释。设置方法：在你的工程文件夹右键</span>-&gt;<span style="FONT-FAMILY: 宋体">属性中，进入</span>Subversion<span style="FONT-FAMILY: 宋体">标签，选中</span>tsvn: logminisize<span style="FONT-FAMILY: 宋体">，确保复选框</span>recursive<span style="FONT-FAMILY: 宋体">选中，然后点击</span>Set<span style="FONT-FAMILY: 宋体">按钮把它的值设为</span>1<span style="FONT-FAMILY: 宋体">，其意思是指提交的注释最短长度为一个字。如图：</span></p><p class="a" style="MARGIN-LEFT: 60pt; TEXT-INDENT: 24pt"><img height="541" src="http://xyzboard.com/xyz_img/devlop/image002.jpg" width="397" border="0" /></p><p class="MsoCaption"><span style="FONT-FAMILY: 宋体">图</span><span><span>2</span></span><span>.</span><span><span>1</span></span></p><a name="_Toc121547263"></a><span><span style="FONT-FAMILY: 宋体">软件配置</span></span><p class="a" style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt"><span style="FONT-FAMILY: Wingdings"><span>l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">        </span></span></span><span style="FONT-FAMILY: 宋体">忽略文件</span></p><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">在</span><span>SVN </span><span style="FONT-FAMILY: 宋体">的</span><span>[Setting]</span><span style="FONT-FAMILY: 宋体">的</span><span>[General]</span><span style="FONT-FAMILY: 宋体">中</span><span style="FONT-FAMILY: 宋体">，</span><span style="FONT-FAMILY: 宋体">设置需要忽略的文件以便忽略掉一些临时的、无用的文件</span><span style="FONT-FAMILY: 宋体">，</span><span style="FONT-FAMILY: 宋体">常被忽略的文件有</span><span>*.opt *.ncb *.suo *.plg *.pch *.idb *.pdb *.scc *.obj Debug Release *.o *.bin *.out *.ilk *.aps debug release *.clw *.bak</span><span style="FONT-FAMILY: 宋体">。每个程序员可以根据自己的需要进行修改忽略文件，上面只是使用</span>VC++<span style="FONT-FAMILY: 宋体">与</span>Tornado<span style="FONT-FAMILY: 宋体">编程时常用的一些忽略文件。</span><img height="371" src="http://xyzboard.com/xyz_img/devlop/image004.jpg" width="586" border="0" /></p><p class="MsoCaption"><span style="FONT-FAMILY: 宋体">图</span><span><span>2</span></span><span>.</span><span><span>2</span></span></p><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">以上说的忽略文件是指全局的忽略文件。</span>SVN<span style="FONT-FAMILY: 宋体">还能在特定的目录中指定需要忽略的文件。忽略文件支持通配符。</span></p><p class="a" style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt"><span style="FONT-FAMILY: Wingdings"><span>l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">        </span></span></span><span style="FONT-FAMILY: 宋体">合并比较工具</span></p><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">在</span>Merge Tool<span style="FONT-FAMILY: 宋体">中可以选择用来合并的工具，强烈推荐用</span>Araxis Merge<span style="FONT-FAMILY: 宋体">。在</span>[Setting]-&gt;[Diff]<span style="FONT-FAMILY: 宋体">中填入</span>"C:\Program Files\Araxis\Araxis Merge v6.5\Merge.exe"<span style="FONT-FAMILY: 宋体">；在</span>[Setting]-&gt;[Merge]<span style="FONT-FAMILY: 宋体">的选项中，填入</span>"C:\Program Files\Araxis\Araxis Merge v6.5\Merge.exe" %theirs %mine %merged <span style="FONT-FAMILY: 宋体">；其中</span>"C:\Program Files\Araxis\Araxis Merge v6.5\Merge.exe"<span style="FONT-FAMILY: 宋体">是指合并工具的路径，</span>%theirs %mine %merged<span style="FONT-FAMILY: 宋体">分别指</span>..<span style="FONT-FAMILY: 宋体">将要合并到主干的分支，主干，及合并后的结果。</span></p><p class="a" style="TEXT-INDENT: 24pt"><img height="371" src="http://xyzboard.com/xyz_img/devlop/image006.jpg" width="586" border="0" /></p><p class="MsoCaption"><span style="FONT-FAMILY: 宋体">图</span><span><span>2</span></span><span>.</span><span><span>3</span></span></p><a name="_Toc121547264"></a><span><span style="FONT-FAMILY: 宋体">仓库目录结构</span></span><p class="a" style="TEXT-INDENT: 24pt">SVN<span style="FONT-FAMILY: 宋体">仓库的负责人规划好仓库的目录结构。推荐的目录结构如下图所示。</span></p><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">仓库的一级目录只有两个，分别为</span>code<span style="FONT-FAMILY: 宋体">和</span>doc<span style="FONT-FAMILY: 宋体">。其中，</span>doc<span style="FONT-FAMILY: 宋体">主要用来放置先期的文档，</span>code<span style="FONT-FAMILY: 宋体">主要用来放置工程的代码，也可以包含后期的文档。</span></p><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">仓库的二级目录只可以是</span>branch<span style="FONT-FAMILY: 宋体">与</span>trunk<span style="FONT-FAMILY: 宋体">两个目录，分别存放主干与分支。</span>trunk<span style="FONT-FAMILY: 宋体">目录下直接存放工程文件。</span>branch<span style="FONT-FAMILY: 宋体">目录下包括一些子目录分别对应各个分支。</span></p><p class="MsoNormal" style="TEXT-ALIGN: center" align="center"><span><img height="445" src="http://xyzboard.com/xyz_img/devlop/image008.jpg" width="586" border="0" /></span></p><p class="MsoCaption"><span style="FONT-FAMILY: 宋体">图</span><span><span>2</span></span><span>.</span><span><span>4</span></span></p><a name="_Toc121547265"></a><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">从</span><span>SVN</span><span style="FONT-FAMILY: 宋体">仓库中取出代码时</span><span style="FONT-FAMILY: 宋体">，一定</span><span style="FONT-FAMILY: 宋体">不要把整个仓库取出来</span><span style="FONT-FAMILY: 宋体">，</span><span style="FONT-FAMILY: 宋体">而应该只取出</span><span>trunk</span><span style="FONT-FAMILY: 宋体">目录</span><span style="FONT-FAMILY: 宋体">，</span><span style="FONT-FAMILY: 宋体">或只取出</span><span>branch</span><span style="FONT-FAMILY: 宋体">下的某个分支目录</span><span style="FONT-FAMILY: 宋体">（比</span><span style="FONT-FAMILY: 宋体">如上图中的</span><span>svn:\\code\branch\xw_051206</span><span style="FONT-FAMILY: 宋体">）</span><span style="FONT-FAMILY: 宋体">。</span></p><a name="_Toc121547266"></a><a name="_Toc121547267"></a><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">一个项目会有多个人共同合作开发完成。基本流程是：</span></p><p class="a" style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt"><span style="FONT-FAMILY: Wingdings"><span>l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">        </span></span></span><span style="FONT-FAMILY: 宋体">各开发成员建立自己的分支，并在此分支上开发；</span></p><p class="a" style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt"><span style="FONT-FAMILY: Wingdings"><span>l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">        </span></span></span><span style="FONT-FAMILY: 宋体">各开发成员把分支合并到主干上并形成较为稳定的版本；</span></p><p class="a" style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt"><span style="FONT-FAMILY: Wingdings"><span>l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">        </span></span></span><span style="FONT-FAMILY: 宋体">各个成员重新从主干上建立新的分支，在此分支上开发</span><span>(</span><span style="FONT-FAMILY: 宋体">即回到第一步</span><span>)</span></p><p class="a" style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt"><span style="FONT-FAMILY: Wingdings"><span>l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">        </span></span></span><span style="FONT-FAMILY: 宋体">循环往复，直到工程结束。</span></p><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">下面我用一个例子来说明合作开发的基本流程。</span></p><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">现在</span>xb<span style="FONT-FAMILY: 宋体">与</span>lzj<span style="FONT-FAMILY: 宋体">两个开发人员要共同开发一个工程</span>onlytest<span style="FONT-FAMILY: 宋体">，其这个工程的主干的</span>SVN<span style="FONT-FAMILY: 宋体">仓库地址如下图。</span></p><p class="MsoNormal" style="TEXT-ALIGN: center" align="center"><span><img height="309" src="http://xyzboard.com/xyz_img/devlop/image010.jpg" width="450" border="0" /></span></p><p class="MsoCaption"><span style="FONT-FAMILY: 宋体">图</span><span><span>2</span></span><span>.</span><span><span>5</span></span></p><a name="_Toc121547268"></a><p class="a" style="TEXT-INDENT: 24pt">xb<span style="FONT-FAMILY: 宋体">与</span>lzj<span style="FONT-FAMILY: 宋体">分别在</span>onlytest<span style="FONT-FAMILY: 宋体">这个工程中建立两个分支，分别为</span>xb _051115<span style="FONT-FAMILY: 宋体">和</span>lz_051115<span style="FONT-FAMILY: 宋体">。</span></p><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">在这里分支命名要采用</span>[<span style="COLOR: rgb(51,153,102); FONT-FAMILY: 宋体">姓名缩写</span><span style="COLOR: rgb(51,153,102)">_6</span><span style="COLOR: rgb(51,153,102); FONT-FAMILY: 宋体">个数的日期</span><span style="COLOR: rgb(51,153,102)">_</span><span style="COLOR: rgb(51,153,102); FONT-FAMILY: 宋体">后缀</span>(<span style="FONT-FAMILY: 宋体">可选</span>)]<span style="FONT-FAMILY: 宋体">的形式，比如</span>xb_051208_1<span style="FONT-FAMILY: 宋体">，</span>xb_051212<span style="FONT-FAMILY: 宋体">之类的。创建完分支后我们可以看到这个工程的目录结构如下图所示：</span></p><p class="MsoNormal" style="TEXT-ALIGN: center" align="center"><span><img height="426" src="http://xyzboard.com/xyz_img/devlop/image012.jpg" width="586" border="0" /></span></p><p class="MsoCaption"><span style="FONT-FAMILY: 宋体">图</span><span><span>2</span></span><span>.</span><span><span>6</span></span><span style="FONT-FAMILY: 宋体">分支目录</span></p><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">建完之后，</span> xb<span style="FONT-FAMILY: 宋体">和</span>lzj<span style="FONT-FAMILY: 宋体">分别在本地取出对应的分支进行开发。</span></p><a name="_Toc121547269"></a><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">当</span><span style="FONT-FAMILY: 宋体">程序到达一个比较稳定的阶段，就需要把分支合并到主干上，下面讲述一下合并的流程。</span></p><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">在本节中继续使用上一节中所示的工程与</span>SVN<span style="FONT-FAMILY: 宋体">仓库讲解。</span></p><span><span>1.2.3.1 </span></span><span>xb</span><span style="FONT-FAMILY: 黑体">与</span><span>lzj</span><span style="FONT-FAMILY: 黑体">分别修改自己分支上的代码</span><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">现在</span><span style="FONT-FAMILY: 宋体">，</span><span style="FONT-FAMILY: 宋体">主干上的</span><span>test_SVN.txt</span><span style="FONT-FAMILY: 宋体">是空文档。</span></p><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">由</span><span>xb</span><span style="FONT-FAMILY: 宋体">与</span><span>lzj</span><span style="FONT-FAMILY: 宋体">修改提交后</span><span style="FONT-FAMILY: 宋体">，</span><span style="FONT-FAMILY: 宋体">两个分支中</span><span>test_SVN.txt</span><span style="FONT-FAMILY: 宋体">分别如下两图所示</span><span style="FONT-FAMILY: 宋体">：</span></p><p class="MsoNormal" style="TEXT-ALIGN: center" align="center"><span><img height="130" src="http://xyzboard.com/xyz_img/devlop/image014.jpg" width="321" border="0" /></span></p><p class="MsoCaption"><span style="FONT-FAMILY: 宋体">图</span><span><span>2</span></span><span>.</span><span><span>7</span></span><span> xb_051129</span><span style="FONT-FAMILY: 宋体">分支下的</span><span>test_SVN.txt</span></p><p class="MsoNormal" style="TEXT-ALIGN: center" align="center"><span><img height="130" src="http://xyzboard.com/xyz_img/devlop/image016.jpg" width="321" border="0" /></span></p><p class="MsoCaption"><span style="FONT-FAMILY: 宋体">图</span><span><span>2</span></span><span>.</span><span><span>8</span></span><span> lzj_051129</span><span style="FONT-FAMILY: 宋体">分支下的</span><span>test_SVN.txt</span></p><span><span>1.2.3.2 </span></span><span>xb</span><span style="FONT-FAMILY: 黑体">将</span><span>xb_051129</span><span style="FONT-FAMILY: 黑体">分支合并到主干</span><p class="a" style="TEXT-INDENT: 24pt"><span>xb</span><span style="FONT-FAMILY: 宋体">先把主干</span><span>check out</span><span style="FONT-FAMILY: 宋体">到本地。然后在主干的目录上右键</span><span style="FONT-FAMILY: 宋体">选择</span>svn-&gt;merge<span style="FONT-FAMILY: 宋体">，弹出如下窗口：</span></p><p class="MsoNormal" style="TEXT-ALIGN: center" align="center"><span><img height="466" src="http://xyzboard.com/xyz_img/devlop/image018.jpg" width="524" border="0" /></span></p><p class="MsoCaption"><span style="FONT-FAMILY: 宋体">图</span><span><span>2</span></span><span>.</span><span><span>9</span></span><span style="FONT-FAMILY: 宋体">合并对话框</span></p><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">此对话框的含义是把</span>From<span style="FONT-FAMILY: 宋体">指定的分支版本到</span>To<span style="FONT-FAMILY: 宋体">指定的分支版本之间的差异合并到主干上。</span></p><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">在这里分支选的是</span>xb_051129<span style="FONT-FAMILY: 宋体">。版本号的选定方法是点击</span>From<span style="FONT-FAMILY: 宋体">中的</span>Show Log<span style="FONT-FAMILY: 宋体">，在</span>Log<span style="FONT-FAMILY: 宋体">窗口中按住</span>Ctrl<span style="FONT-FAMILY: 宋体">键，点击选择</span>”made a copy”<span style="FONT-FAMILY: 宋体">之上的那个版本，以及最顶上的那个版本，如</span><span style="FONT-FAMILY: 宋体">图</span><span>2</span>.<span>11</span><span style="FONT-FAMILY: 宋体">所示。然后点击确定回到上图中的对话框，会自动填写</span>From<span style="FONT-FAMILY: 宋体">与</span>To<span style="FONT-FAMILY: 宋体">中的</span>Revision<span style="FONT-FAMILY: 宋体">号。</span></p><p class="MsoNormal" style="TEXT-INDENT: 21pt"><span><img height="581" src="http://xyzboard.com/xyz_img/devlop/image020.jpg" width="585" border="0" /></span></p><p class="MsoCaption"><a name="_Ref121716988"></a><span><span><span>2</span></span></span><span><span>.</span></span><span><span><span>10</span></span></span><span style="FONT-FAMILY: 宋体">选择需要合并的版本</span></p><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">然后直接点击</span>merge<span style="FONT-FAMILY: 宋体">进行合并，你也可以通过</span>dry run<span style="FONT-FAMILY: 宋体">来看是不是两者之间有差异。由于没有其它人修改主干，所以合并的很顺利，下图是</span>xb_051115<span style="FONT-FAMILY: 宋体">与主干合并后的结果。合并完毕之后，由</span>xb<span style="FONT-FAMILY: 宋体">对主干进行提交。</span></p><p class="a" style="TEXT-INDENT: 24pt; TEXT-ALIGN: center" align="center"><img height="130" src="http://xyzboard.com/xyz_img/devlop/image022.jpg" width="321" border="0" /></p><p class="MsoCaption"><span style="FONT-FAMILY: 宋体">图</span><span><span>2</span></span><span>.</span><span><span>11</span></span><span style="FONT-FAMILY: 宋体">合并后，主干上的</span><span>test_SVN.txt</span></p><p class="a" style="TEXT-INDENT: 24pt"> </p><span><span>1.2.3.3 </span></span><span>lzj</span><span style="FONT-FAMILY: 黑体">将</span><span>lzj_051129</span><span style="FONT-FAMILY: 黑体">分支合并到主干，解决冲突</span><p class="a" style="TEXT-INDENT: 24pt">xb<span style="FONT-FAMILY: 宋体">合并完毕之后，</span>lzj<span style="FONT-FAMILY: 宋体">要将他的分支合并到主干上去，方法同上。但是由于</span>xb<span style="FONT-FAMILY: 宋体">已经修改过主干，所以产生了冲突，会弹出一个冲突对话框。双击对话框中的产生冲突的文件名，就可以调出工具对此文件进行合并，下图是我们用</span>merge<span style="FONT-FAMILY: 宋体">工具显示的界面。</span></p><p class="MsoNormal"><span><img height="382" src="http://xyzboard.com/xyz_img/devlop/image023.jpg" width="585" border="0" /></span></p><p class="MsoCaption"><span style="FONT-FAMILY: 宋体">图</span><span><span>2</span></span><span>.</span><span><span>12</span></span></p><p class="a" style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt"><span style="FONT-FAMILY: Wingdings"><span>l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">        </span></span></span><span style="FONT-FAMILY: 宋体">首先比较第一个窗口与第二个窗口，把结果修改合并到第二个窗口。</span></p><p class="a" style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt"><span style="FONT-FAMILY: Wingdings"><span>l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">        </span></span></span><span style="FONT-FAMILY: 宋体">然后确保光标处于第二个窗口时，点击上图中红色圈圈所示的按钮。这样会把第二个窗口的内容全部复制到第三个容口。之后保存，退出。</span></p><p class="a" style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt"><span style="FONT-FAMILY: Wingdings"><span>l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">        </span></span></span><span style="FONT-FAMILY: 宋体">然后在工程目录上点右键，进行</span>SVN-&gt;Resolved<span style="FONT-FAMILY: 宋体">。这样会删除无用的临时文件。</span></p><p class="a" style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt"><span style="FONT-FAMILY: Wingdings"><span>l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">        </span></span></span><span style="FONT-FAMILY: 宋体">最后提交所作的修改，并添加详细的注释。</span></p><a name="_Toc121547270"></a><a name="_Toc121547271"></a><span><span style="FONT-FAMILY: 宋体">中的标签</span></span><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">与</span>CVS<span style="FONT-FAMILY: 宋体">不同，使用</span>SVN<span style="FONT-FAMILY: 宋体">时不用专门为目录添加标签，因为</span>SVN<span style="FONT-FAMILY: 宋体">也对目录进行版本管理。</span></p><p class="MsoNormal" style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">我们在提交时写好注释（比如重要的版本提交时使用</span><span>051201</span><span style="FONT-FAMILY: 宋体">之类的日期作为开头），就可以通过注释来查找比较重要的目录版本号，相当于</span><span>CVS</span><span style="FONT-FAMILY: 宋体">或</span><span>VSS</span><span style="FONT-FAMILY: 宋体">中的标签。</span></p><p class="MsoNormal" style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">另外，每个工程都会有一个版本说明文件，通过此文件可以查找关键版本。</span></p><a name="_Toc121547272"></a><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">你可以重命名、移动或删除你的文件或文件夹，但请使用</span>SVN<span style="FONT-FAMILY: 宋体">进行这些操作，否则之前的版本信息会丢失。</span></p><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">使用</span>SVN<span style="FONT-FAMILY: 宋体">删除、移动与重命名文件夹的方法是在文件</span>/<span style="FONT-FAMILY: 宋体">文件夹上点右键进行</span>SVN<span style="FONT-FAMILY: 宋体">操作，或直接在资源浏览器中使用右键拖放（会弹出</span>SVN<span style="FONT-FAMILY: 宋体">选项）。</span></p><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">文件的删除、移动与重命名之前，必须保证工作目录是最新的版本；进行这些操作之后，需要进行提交。</span></p><span><span>1.3.3 </span></span><span style="FONT-FAMILY: 宋体">版本的回退</span><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">在代码的编写过程中，难免会有不尽人意的地方，你也许需要回退到某一个版本，但是在这个过程中可能有一些文件你想保留，也有一些文件你不想保留，这就牵扯到很复杂的版本管理过程，在这里给大家推荐几种方法。</span></p><p class="a" style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt"><span><span>1.<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">        </span></span></span><span style="FONT-FAMILY: 宋体">若是你编辑了工程，在没有提交的前提下，你想放弃这些修改，你可以直接选择</span><span>revert</span><span style="FONT-FAMILY: 宋体">就可以更新到工程的最新的版本。</span></p><p class="a" style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt"><span><span>2.<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">        </span></span></span><span style="FONT-FAMILY: 宋体">若是你想退回到某一个版本，你就可以直接选择</span><span>update to reversion</span><span style="FONT-FAMILY: 宋体">如图</span><span>,</span><span style="FONT-FAMILY: 宋体">这样我们就可以把我们的版本回退到你选中的版本去，这种情况下</span><span>SVN</span><span style="FONT-FAMILY: 宋体">并没有显示出有什么冲突，并且新建立的文件也还在，但是在这种情况下你并不能直接在你回退后的版本上进行编辑，因为</span><span>SVN</span><span style="FONT-FAMILY: 宋体">的版本控制还是在最新的主干上。我们需要</span><span>update</span><span style="FONT-FAMILY: 宋体">并解决冲突。</span><span></span></p><p class="a" style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt"><span><span>3.<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">        </span></span></span><span style="FONT-FAMILY: 宋体">你可以直接选择</span><span>revert changes from this revision</span><span style="FONT-FAMILY: 宋体">如图，这样的话你可以直接解决冲突并提交。不过这种方法的不足是，你新建的文件都没有了，整个工程都回退到之前的版本了。</span></p><p class="a" style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt"><span><span>4.<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">        </span></span></span><span style="FONT-FAMILY: 宋体">我推荐的一种方法是，直接</span><span>export</span><span style="FONT-FAMILY: 宋体">一个你需要的版本，然后用你</span><span>export</span><span style="FONT-FAMILY: 宋体">的版本覆盖你的最新的版本，这样你就可以不丢失你新建的文件，同时获得</span><span>head</span><span style="FONT-FAMILY: 宋体">的</span><span>SVN</span><span style="FONT-FAMILY: 宋体">控制文件。</span></p><p class="a" style="MARGIN-LEFT: 24pt; TEXT-INDENT: 0pt"><span><img height="563" src="http://xyzboard.com/xyz_img/devlop/image025.jpg" width="586" border="0" /></span></p><p class="MsoCaption"><span style="FONT-FAMILY: 宋体">图</span><span><span>13</span></span></p><p class="MsoNormal"><span></span> </p><a name="_Toc121547273"></a><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">每个工程会有很多个小模块，当某个模块达到稳定的时候，你就需要提交一次，以免写下个模块代码的时候出现不可恢复的错误。</span></p><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">每一次提交需要前，需要通过</span>pclint<span style="FONT-FAMILY: 宋体">检查，保证是一个编译没有错误的版本。当提交比较稳定的版本的时候，同时要修改你的版本号。</span></p><p class="a" style="TEXT-INDENT: 24pt"><a name="_Toc121547274"></a></p><span><span><span>1.3.5 </span></span><span style="FONT-FAMILY: 宋体">版本说明文件</span></span><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">版本说明文件为</span>xml<span style="FONT-FAMILY: 宋体">表格，可用</span>excel<span style="FONT-FAMILY: 宋体">编辑，它会记录下关键的版本信息。</span></p><p class="a" style="TEXT-INDENT: 24pt"><span style="FONT-FAMILY: 宋体">版本说明文件内容如下表。发布版本是指用户对外公布的版本号，后文中有详细描述；</span>Revision<span style="FONT-FAMILY: 宋体">是</span>SVN<span style="FONT-FAMILY: 宋体">内部的工程文件夹的版本号。一个发布版本可能对应多个</span>Revision<span style="FONT-FAMILY: 宋体">：</span></p><table class="MsoTableGrid" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"><tbody><tr><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: windowtext 1pt solid; WIDTH: 65.4pt; PADDING-TOP: 0pt; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="87"><p class="a" style="TEXT-INDENT: 0pt; TEXT-ALIGN: justify"><span style="FONT-FAMILY: 宋体">发布版本</span></p></td><td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: medium none; WIDTH: 65.4pt; PADDING-TOP: 0pt; BORDER-BOTTOM: 1pt solid" valign="top" width="87"><p class="a" style="TEXT-INDENT: 0pt; TEXT-ALIGN: justify">Revision </p></td><td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: medium none; WIDTH: 312.6pt; PADDING-TOP: 0pt; BORDER-BOTTOM: 1pt solid" valign="top" width="417"><p class="a" style="TEXT-INDENT: 0pt; TEXT-ALIGN: justify"><span style="FONT-FAMILY: 宋体">详细说明</span></p></td></tr><tr><td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: 1pt solid; WIDTH: 65.4pt; PADDING-TOP: 0pt; BORDER-BOTTOM: 1pt solid" valign="top" width="87" rowspan="3"><p class="a" style="TEXT-INDENT: 0pt; TEXT-ALIGN: justify">1,0,0,12</p></td><td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: medium none; WIDTH: 65.4pt; PADDING-TOP: 0pt; BORDER-BOTTOM: 1pt solid" valign="top" width="87"><p class="a" style="TEXT-INDENT: 0pt; TEXT-ALIGN: justify">76</p></td><td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: medium none; WIDTH: 312.6pt; PADDING-TOP: 0pt; BORDER-BOTTOM: 1pt solid" valign="top" width="417"><p class="MsoNormal" style="TEXT-ALIGN: justify"><span style="FONT-FAMILY: 宋体">加入了抗干扰日志，需长时间测试</span></p><p class="MsoNormal" style="TEXT-ALIGN: justify"><span style="FONT-FAMILY: 宋体">程序代码进行了重构，已经调试通过</span></p></td></tr><tr><td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: medium none; WIDTH: 65.4pt; PADDING-TOP: 0pt; BORDER-BOTTOM: 1pt solid" valign="top" width="87"><p class="a" style="TEXT-INDENT: 0pt; TEXT-ALIGN: justify">77</p></td><td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: medium none; WIDTH: 312.6pt; PADDING-TOP: 0pt; BORDER-BOTTOM: 1pt solid" valign="top" width="417"><p class="MsoNormal" style="TEXT-ALIGN: justify"><span>xxx @#$%^&amp;</span></p></td></tr><tr><td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: medium none; WIDTH: 65.4pt; PADDING-TOP: 0pt; BORDER-BOTTOM: 1pt solid" valign="top" width="87"><p class="a" style="TEXT-INDENT: 0pt; TEXT-ALIGN: justify">78</p></td><td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: medium none; WIDTH: 312.6pt; PADDING-TOP: 0pt; BORDER-BOTTOM: 1pt solid" valign="top" width="417"><p class="a" style="TEXT-INDENT: 0pt; TEXT-ALIGN: justify"><span style="FONT-FAMILY: 宋体">啥</span>...</p></td></tr><tr><td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: 1pt solid; WIDTH: 65.4pt; PADDING-TOP: 0pt; BORDER-BOTTOM: 1pt solid" valign="top" width="87"><p class="a" style="TEXT-INDENT: 0pt; TEXT-ALIGN: justify">1,0,0,13</p></td><td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: medium none; WIDTH: 65.4pt; PADDING-TOP: 0pt; BORDER-BOTTOM: 1pt solid" valign="top" width="87"><p class="a" style="TEXT-INDENT: 0pt; TEXT-ALIGN: justify">81</p></td><td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: medium none; WIDTH: 312.6pt; PADDING-TOP: 0pt; BORDER-BOTTOM: 1pt solid" valign="top" width="417"><p class="a" style="TEXT-INDENT: 0pt; TEXT-ALIGN: justify"><span style="FONT-FAMILY: 宋体">测试过的稳定版本</span></p></td></tr><tr><td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: 1pt solid; WIDTH: 65.4pt; PADDING-TOP: 0pt; BORDER-BOTTOM: 1pt solid" valign="top" width="87"><p class="a" style="TEXT-INDENT: 0pt; TEXT-ALIGN: justify">1,0,0,14</p></td><td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: medium none; WIDTH: 65.4pt; PADDING-TOP: 0pt; BORDER-BOTTOM: 1pt solid" valign="top" width="87"><p class="a" style="TEXT-INDENT: 0pt; TEXT-ALIGN: justify">99</p></td><td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: medium none; WIDTH: 312.6pt; PADDING-TOP: 0pt; BORDER-BOTTOM: 1pt solid" valign="top" width="417"><p class="a" style="TEXT-INDENT: 0pt; TEXT-ALIGN: justify">fix some bug<span style="FONT-FAMILY: 宋体">，没有测试</span></p></td></tr><tr><td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: 1pt solid; WIDTH: 65.4pt; PADDING-TOP: 0pt; BORDER-BOTTOM: 1pt solid" valign="top" width="87"><p class="a" style="TEXT-INDENT: 0pt; TEXT-ALIGN: justify"> </p></td><td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: medium none; WIDTH: 65.4pt; PADDING-TOP: 0pt; BORDER-BOTTOM: 1pt solid" valign="top" width="87"><p class="a" style="TEXT-INDENT: 0pt; TEXT-ALIGN: justify"> </p></td><td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0pt; BORDER-LEFT: medium none; WIDTH: 312.6pt; PADDING-TOP: 0pt; BORDER-BOTTOM: 1pt solid" valign="top" width="417"><p class="a" style="TEXT-INDENT: 0pt; TEXT-ALIGN: justify"> </p></td></tr></tbody></table><span> </span></div>
		<table id="attachments">
				<tbody>
						<tr>
								<th>附件</th>
								<th>大小</th>
						</tr>
						<tr class="dark">
								<td>
										<a href="http://xyzboard.com/files/svn版本管理教程.rar">svn版本管理教程.rar</a>
								</td>
								<td>474.51 KB</td>
						</tr>
				</tbody>
		</table>
		<p align="right">
				<!-- insert the node links -->7674 reads </p>
		<a id="comment">
		</a>
		<form action="?q=comment" method="post">
				<div>
						<input type="hidden" value="110" name="edit[nid]" />
						<a id="comment-492">
						</a>
						<div class="mysubject">So Good! Your Article.</div>
						<div class="mybody">Submitted by <i>ALLKILL (没有被验证)</i> on 星期四, 四月 13, 2006 - 23:31 
<hr /><p>So Good! Your Article.</p><p align="right"><a href="http://xyzboard.com/?q=comment/reply/110/492">回复</a></p></div>
						<br />
						<a id="comment-493">
						</a>
						<div class="mysubject">Thank you. And The New Ver</div>
						<div class="mybody">Submitted by <i>xyz黑板</i> on 星期五, 四月 14, 2006 - 00:05 
<hr /><p>Thank you.</p><p>And The New Version of TSVN has a little good change, I will rebuild this article when I have time</p><p align="right"><a href="http://xyzboard.com/?q=comment/reply/110/493">回复</a></p></div>
						<br />
						<a id="comment-504">
						</a>
						<div class="mysubject">very well and thank you !</div>
						<div class="mybody">Submitted by <i>Anonymous (没有被验证)</i> on 星期四, 四月 20, 2006 - 14:30 
<hr /><p>very well and thank you !</p><p align="right"><a href="http://xyzboard.com/?q=comment/reply/110/504">回复</a></p></div>
						<br />
						<a id="comment-571">
						</a>
						<div class="mysubject">Thank you for your Article.It</div>
						<div class="mybody">Submitted by <i>Anonymous (没有被验证)</i> on 星期四, 六月 8, 2006 - 16:08 
<hr /><p>Thank you for your Article.It's very userful.</p><p align="right"><a href="http://xyzboard.com/?q=comment/reply/110/571">回复</a></p></div>
						<br />
						<a id="comment-607">
						</a>
						<div class="mysubject">不错的文章,但我对你</div>
						<div class="mybody">Submitted by <i><a href="http://blog.csdn.net/yeyuboy">yeyuboy</a> (没有被验证)</i> on 星期日, 七月 9, 2006 - 00:36 
<hr /><p>不错的文章,但我对你所说的多人开发的基本流程不太赞同,SubVersion Book 上说,分支是在对项目有长期或试验性的更改时才使用.<br />成员应该是在主干上进行修改的,这样使用分支不会导致合并时冲突频繁吗?将分支合并进主干很麻烦(相对于简单地一个commit),这不就会导致成员不再极积频繁地进行合并呢(这导致一旦进行合并冲突的可能性会更大,成员间的交流不畅,恶性循环.)?</p><p align="right"><a href="http://xyzboard.com/?q=comment/reply/110/607">回复</a></p></div>
						<br />
						<a id="comment-676">
						</a>
						<div class="mysubject">thanks</div>
						<div class="mybody">Submitted by <i>Anonymous (没有被验证)</i> on 星期五, 八月 11, 2006 - 14:52 
<hr /><p>thanks</p><p align="right"><a href="http://xyzboard.com/?q=comment/reply/110/676">回复</a></p></div>
						<br />
						<a id="comment-695">
						</a>
						<div class="mysubject">对我非常有用的文档</div>
						<div class="mybody">Submitted by <i>summer rain (没有被验证)</i> on 星期一, 八月 28, 2006 - 15:22 
<hr /><p>对我非常有用的文档。<br />请问如何才能在虚拟机上进行SVN操作呢？</p><p align="right"><a href="http://xyzboard.com/?q=comment/reply/110/695">回复</a></p></div>
						<br />
						<a id="comment-709">
						</a>
						<div class="mysubject">好东东，Many Thanks</div>
						<div class="mybody">Submitted by <i>Jelly (没有被验证)</i> on 星期四, 九月 7, 2006 - 17:50 
<hr /><p>好东东，Many Thanks</p><p align="right"><a href="http://xyzboard.com/?q=comment/reply/110/709">回复</a></p></div>
						<br />
						<a id="comment-729">
						</a>
						<div class="mysubject">TortoiseSVN和资源管理器</div>
						<div class="mybody">Submitted by <i><a href="http://hi.baidu.com/jabber">xmpp</a> (没有被验证)</i> on 星期六, 九月 9, 2006 - 22:59 
<hr /><p>TortoiseSVN和资源管理器整合在一起，有时候更新有问题，我觉得subclipse(eclipse的svn插件)更好用。</p></div>
				</div>
		</form>
<img src ="http://www.cnitblog.com/subversion/aggbug/16737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/subversion/" target="_blank">subversion</a> 2006-09-12 16:05 <a href="http://www.cnitblog.com/subversion/archive/2006/09/12/16737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>svn学习笔记</title><link>http://www.cnitblog.com/subversion/archive/2006/09/11/16710.html</link><dc:creator>subversion</dc:creator><author>subversion</author><pubDate>Mon, 11 Sep 2006 14:50:00 GMT</pubDate><guid>http://www.cnitblog.com/subversion/archive/2006/09/11/16710.html</guid><wfw:comment>http://www.cnitblog.com/subversion/comments/16710.html</wfw:comment><comments>http://www.cnitblog.com/subversion/archive/2006/09/11/16710.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/subversion/comments/commentRss/16710.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/subversion/services/trackbacks/16710.html</trackback:ping><description><![CDATA[
		<font color="#333333">Subversion 系统<br /><br />多年来，并发版本系统（CVS）一直是在Linux上管理代码或者文本的标准。作为基于RCS上建立但却允许多用户协作的系统而言，CVS记录所有文件的修改信息。这对于程序开发者、网络设计者和系统管理员而言，是非常有用的。<br />然而，CVS逐渐显示出它的衰老，出现了相似的源代码管理软件。然而大多这种东西都是以牟利为主要目的的。<br />Subversion就是一种相对新鲜的源代码管理系统。虽然事实上它还在不断的反展之中，但是Subversion已经是一个非常稳定而且成熟的产品。它是一个全新的系统，其功能可以和CVS媲美，同时，它要比CVS更直观，更容易操作。本文就Subversion的安装和一些特殊功能作一个介绍。<br />安装服务器端<br /><br />下载Apache和SVN源码包<br />从官方网站台下载httpd-2.0.52.tar.gz,subversion-1.1.1.tar.gz<br />(因为redhat 9默认安装的Apache没有并包含--enable-so选项，所以无法产生mod_dav_svn.没有这个模块，SVN就无法采用http方式运行，所以必须重新编译新的Apache)<br />以root身份执行：<br />#tar zxvf httpd-2.0.52.tar.gz<br />#cd httpd-2.0.52<br />#./configure --enable-dav --enable-so --enable-maintainer-mode<br />#make <br />#make install<br />此时会产生/usr/local/apache2目录,接着执行:<br />#tar zxvf subversion-1.1.1.tar.gz<br />#./configure --with-apxs=/usr/local/apache2/bin/apxs<br /># rm /usr/local/lib/libsvn*<br /># make clean &amp;&amp; make &amp;&amp; make install<br /><br />此时会自动在/usr/local/apache2/conf/httpd.conf添加<br />LoadModule dav_svn_module modules/mod_dav_svn.so<br />安装完成后,运行svnserver --version确认版本为1.1.1。<br />SVN服务器安装结束.<br /><br />安装客户机端<br /><br />window客户机：<br />直接安装TortoiseSVN-1.1.1-UNICODE_svn-1.1.1.msi，方法同一般软件安装相同。<br />Linux客户机：<br />方法舆安装服务器相同。<br />(注意redhat 9默认安装的SVN版本为0.17.1,它的客户端命令svn无法舆新的SVN服务器通讯,必须重新安装)<br /><br />建立仓库Repository <br /><br />Subversion 的档案库是个中央仓储, 用来存放任意数量项目的受版本控管资料,建立方法很简单<br />#svnadmin create path/to/repos<br />举个例子：<br />#svnadmin create /home/mysvn<br />#chown ?R nobody /home/mysvn<br />运行服务器<br /><br />Subversion服务器有两种运行方式，一是可以作为Apache 2.0的一个模块， 以WebDAV/DeltaV协议与外界连通；另外，也可使用Subversion 自带的小型服务器程序svnserve。该程序使用的是自带的通讯协议，可以很容易地透过SSH以<br />以http方式运行<br />在/usr/local/apache2/conf/httpd.conf中加入:<br /><location svn="" repository="">;<br />DAV svn<br />SVNPath /home/mysvn<br /></location>;<br />在服务器的浏览器中输入网址: <br />http://localhost/svn/repository/<br />这时候,你会看到这样的显示：<br /><br />这表明服务器已经以http方式正常运行了.<br />以svnserve方式运行<br />这种方式的运行又可以分为以下两种(这和vsftp有些相似)<br />1) standalone mode<br />直接运行 #svnserve ?d<br />运行 lsof -i :3690可以看到SVN服务器已经在运行<br />2) xinetd mode<br />在/etc/xinetd.d/下生成svnserve文件，内容如下<br />service svnserve<br />{<br />disable = no<br />socket_type = stream<br />protocol = tcp<br />wait = no<br />user = apache<br />server = /usr/local/bin/svnserve<br />server_args = -i<br />}<br />编辑 /etc/services ?,加入底下两行:<br />svnserve 3690/tcp # Subversion svnserve<br />svnserve 3690/udp # Subversion svnserve<br />重启xinetd服务，运行 lsof -i :3690可以看到SVN服务器已经在运行<br /><br />客户机访问<br /><br />客户机的访问方法舆服务器的运行方式有直接关系<br />window客户机：<br />1) 服务器以http方式运行<br />安装完TortoiseSVN-1.1.1-UNICODE_svn-1.1.1.msi后,在你想工作的目录下点击右键，执行checkout，按上图输入即可。<br /><br />2) 服务器以svnserve方式运行<br />同上的区别只是URL of repository变为 svn://svn服务器ip/home/mysvn<br />或者 svn+ssh://svn服务器ip/home/mysvn<br />(注意不是//svn服务器ip//svn/repository)<br />linux客户机：<br />1) 服务器以http方式运行<br />执行 #svn checkout http: //svn服务器ip/svn/repository<br />2) 服务器以svnserve方式运行<br />执行 #svn checkout svn://svn服务器ip/home/mysvn<br />或者 #svn checkout svn+ssh://svn服务器ip/home/mysvn<br /><br />客户认证机制<br /><br />这舆服务器的运行方式有关<br />服务器以http方式运行<br />比如我们想给 Sally 与 Harry 送交存取档案库的权限. 首先, 我们必须把它们加入到密码档案. <br /># ### 第一次: 以 -c 建立档案<br /># htpasswd -c /etc/svn-auth-file harry<br />New password: ***** <br />Re-type new password: *****<br />Adding password for user harry<br /># htpasswd /etc/svn-auth-file sally<br />New password: *******<br />Re-type new password: *******<br />Adding password for user sally<br />#<br />接着,在/usr/local/apache2/conf/httpd.conf的加入: <br /><location svn="" repository="">;<br />DAV svn<br />SVNPath /home/mycvs<br />AuthType Basic<br />AuthName "Subversion repository"<br />AuthUserFile /etc/svn-auth-file<br />Require valid-user<br /></location>;<br />重新激活 Apache后，如果有人要访问SVN服务器，系统会要求他输入用户名和密码。 只有输入Sally 或Harry的用户名和相应的密码，才可以对档案库进行修改和访问<br /><br />服务器以svnserve方式运行<br />默认下客户可以以匿名方式通过svn://方式任意访问档案库，为了限制其权限，比如只允许读操作，可以通过修改档案库conf子目录中的svnseve.conf文件来实现。<br />#vi /home/mysvn/conf/svnseve.conf<br />修改[general]字段下内容为：<br />anon-access = read<br />如果设为anon-access = none，则匿名用户不可以通过svn://方式访问档案库<br />为了实现用户认证,我们一般采用svn+ssh://访问机制。<br />首先在svnseve.conf文件设置anon-access = none禁止匿名用户通过svn://方式访问档案库，然后在其后加入<br />auth-access = write<br />auth-access 是限制有援权的使用者(使用svn+ssh:// 来登入) 的存取权限，我们设为是可以读写。<br />当用户通过svn+ssh://访问时，服务器会自动激活ssh认证机制，要求用户输入密码，对于window用户来说还需要安装第三方软件openssh，才可以采用这种机制<br />Hook scripts<br />挂勾 (hook) 是改动档案库时所触发的程序, 比如当你提交更动前，会先触发pre-commit，提交更动后，则会触发post-commit，我们可以利用hook来实现一些自动控制。档案库的hook 子目录中, 预设是放置各个档案库挂勾的模板:<br />post-commit.tmpl <br />pre-revprop-change.tmpl<br />post-revprop-change.tmpl <br />start-commit.tmpl<br />pre-commit.tmpl <br />如果要使用这些hook，就必须把它的后缀名.tmpl去掉，拷贝为<br />post-commit <br />pre-revprop-change<br />post-revprop-change <br />start-commit<br />pre-commit<br />这里主要介绍pre-commit和post-commit(事实上它们就是在特定的情况下被触发的普通的shell程序,至于shell的内容由用户自己随意编写，但是要保证名称不能改动) <br />pre-commit <br />本挂勾执行的时间为异动完成之后, 送交之前.档案库会传递两个自变量给这个程序: 档案库的路径, 以及准备送交的异动名称. 如果程序传回一个非零的结束值, 送交会被中止, 而异动会被删除. <br /><br />如何应用pre-commit我们不妨举个例子：<br />假如有一个项目由Mail Team,Login Team和PHP Team三个Team共同通过SVN系统开发完成。当项目准备发布的时候， PM人员发现Mail功能方面存在一些 bug，需要Mail Team去修改，为了防止其它Team的人员修改系统，我们可以在任何改动档案库的企图之前用pre-commit去检查log message信息,(因为任何更动档案库的操作都必须提供log message信息,PM可以事先舆 Mail Team约定好一个log message),如果舆pre-commit中设定的log message不相符，则不能提交更动。<br />pre-commit源程序如下:<br />#!/bin/sh<br />REPOS="$1"<br />TXN="$2"<br />SVNLOOK=/usr/local/bin/svnlook<br />$SVNLOOK log -t "$TXN" "$REPOS" | \<br />grep ?w "bug1234" &gt;; /dev/null || exit 1<br />exit 0<br />本例中的log message为”bug1234”,任何人想要提交更动就必须用 ?m “bug1234”参数,采用-m “bug123”,-m “bug12345”都会提交失败。<br />post-commit <br />本挂勾执行的时间是在异动送交, 新修订版被建立之后. 大多数的人用这个挂勾来寄出关于本次送交的电子邮件, 或是建立档案库的备份. 档案库会传递两个自变量给这个程序: 档案库的路径, 以及新建立的修订版号. 本程序的结束码会被忽略. <br /><br />Subversion 源码树的 tools/hook-script 目录中包含了一个 commit-email.pl 命令，可以用来寄送包含描述指定送交的电子邮件. 这个邮件包含了更动路径列表, 该送交所对应的记录讯息, 使用者, 送交的日期,以及一个以 GNU diff 样式表示的本次更动差异. 我们可以将这个程序舆post-commit这个hook搭配起来使用来实现档案库更动后自动mail给相关人员的功能。<br />post-commit源程序如下:<br />#!/bin/sh<br />REPOS="$1"<br />REV="$2"<br />commit-email.pl "$REPOS" "$REV" PM@yourdomain.com <br />##需要指明commit-email.pl的绝对路径<br /><br />特殊性质<br /><br />除了对你的目录与档案进行版本控制之外, Subversion 还提供了一个接口, 可用来新增, 修改, 以及移除已纳入版本控制的目录与档案的版本控制描述资料. 我们称这个描述资料为性质,在这里我主要介绍以下几个比较重要的特殊性质<br />svn:mime-type<br />svn:mime-type 性质在 Subversion 中有很多作用. 除了作为储存档案的多用途网际网络邮件延伸语法 (MIME) 分类之外, 这个性质的内容还会决定几项 Subversion 的行为特征. <br />举个例子, 如果 svn:mime-type 性质设为文字的 MIME 类别 , Subversion 会假设该档的内容是二进制(也就是人类看不懂的资料). Subversion 提供的功能中, 其中一项是在从服务器收到工作档的更新中, 依文字内容与文字列进行合并. 但是对含有二进制资料的档案, 根本就没有 “文字列” 的概念. 因此, Subversion 对这些档案在更新时, 不会试着进行内文合并. 它改用另一种方式。 <br />一般来说Subversion 在执行 svn import 与 svn add 子命令时, 会使用二进制侦测运算法的方式来协助使用者. 但是如果 Subversion 猜错了, 或是你希望将 svn:mime-type 设定成更为明确的值(可能是 image/png)你都可以移除或是手动编辑这个性质. <br />svn:ignore<br />svn:ignore 性质包含了档案样式的列表, Subversion 处理时会忽略. 它可以与执行时期设定的 global-ignores 选项一起工作, 以便在类似 svn status 的命令中过滤掉未纳入版本控制的目录与档案. <br />我们知道新增的文件和目录必须透过 svn add 命令, 才会被纳入 Subversion 的管理. svn status 命令会将工作复本中未纳入版控制目录与档案显示出来. <br />$ svn status calc<br />M calc/button.c<br />? calc/calculator<br />? calc/data.c<br />? calc/debug_log<br />? calc/debug_log.1<br /><br />在这个范例中, 用?标注出来的文件就是未纳入版控制的档案.如果你不想每次执行 svn status 时, 都看到这些档案， 那幺svn: ignore 性质就是解决方案。你可以透过 svn propedit svn:ignore calc 对 calc 目录加上一些忽略样式. 举个例子,将以下的值作为 svn:ignore 性质的新内容: <br />calculator<br />debug_log*<br />加上这个性质后再执行你的 svn status 输出便会不同：<br />$ svn status<br />M calc<br />M calc/button.c<br />? calc/data.c<br />现在, 所有不想看到的东西都从输出中消失了! <br /><br /><br />svn:keywords<br />Subversion 具有取代关键词(有关纳入版本控制档案的有用信息)进入档案内容的功能. <br />举个例子, 假设你有个文件, 想要在里面显示最近一次修改的日期. 你可以把这个负担加诸文件的作者身上, 让他们每一次送交更动之前, 顺便添加最近一次修改日期的部份. 但是迟早有人会忘记这件事. 换个方式, 只要叫 Subversion 对 LastChangedDate 关键词进行关键词取代即可.<br />Subversion 定义了可用来进行取代的关键词列表. 这个列表包含了以下五个关键词: <br />LastChangedDate <br />LastChangedRevision <br />LastChangedBy <br />HeadURL <br />Id <br />如果只把关键词定位锚加进档案里的话, 什幺事也不会发生.要告诉 Subversion 是否该对某一个档案进行关键词取代,得使用svn:keywords这个性质。当它被设定时, 它会控制该档案哪个关键词应该被取代. <br />举个例子, 假设你有一个纳入版本控制的档案, 名为 weather.txt, 看起来像这样: <br />Here is the latest report from the front lines.<br />$LastChangedDate$<br />$Rev$<br />Cumulus clouds are appearing more frequently as summer approaches.<br />如果没有设定该档案的 svn:keywords 性质, Subversion 什幺事也不会作. 让我们开启关键词 LastChangedDate 的内容取代. <br />$ svn propset svn:keywords "LastChangedDate Author" weather.txt<br />property `svn:keywords' set on 'weather.txt'<br />$<br />在你送交了这个性质更动之后, Subversion 会显示为： <br />Here is the latest report from the front lines.<br />$LastChangedDate: 2002-07-22 21:42:37 -0700 (Mon, 22 Jul 2002) $<br />$Rev$<br />Cumulus clouds are appearing more frequently as summer approaches.<br />这样不管谁提交这个文件，都会在里面显示最近一次修改的日期。<br />svn:eol-style<br />除非另外指定版本控制档案的 svn:mime-type 性质, Subversion 会假设档案包含人类可读的资料.这对于列尾符号 (EOL) 是很不幸地, 因为不同的操作系统会使用不同的符号来表示一列的结尾. 举个例子, 一般用在 Windows 平台上的列尾符号是两个 ASCII 控制字符 ：返回字符 (CR) 与换行字符 (LF). 但是 Unix 软件就只使用 LF 字符来表示一列的结尾.这样以来 window客户提交的档案中的CR 字符在 linux客户端会显示成 ^M, 而linux客户提交的档案中CR 字符在 Windows 客户端会被忽略。结果将档案里的所有文字列合并成一个超长的文字列, 这是因为没有返回CRLF字符组合的存在来表示一个换行。 解决的方法是 svn:eol- style 性质. 当这个性质设定为native时, Subversion 会根据系统的类型来决定是否对该档案的结尾进行自动处理。. <br />svn:externals<br />有的时候, 一个工作复本可能包含了数个不同来源的工作复本. 举个例子, 你可能想要有数个不同的目录, 各来自不同的档案库.我们可以通过 svn:externals 性质来宣告这一对对应关系。内容是子目录对应至 Subversion 档案库 URL 的多行表格. <br />$ svn propget svn:externals calc<br />third-party/sounds http://sounds.red-bean.com/repos<br />third-party/skins http://skins.red-bean.com/repositories/skinproj<br />third-party/skins/toolkit http://svn.red-bean.com/repos/skin-maker<br />当有人取出 calc 目录的工作复本, Subversion 还会继续取出在外部定义里的项目. <br />$ svn checkout http://svn.example.com/repos/calc<br />A calc<br />A calc/Makefile<br />A calc/integer.c<br />A calc/button.c<br />Checked out revision 148.<br /><br />Fetching external item into calc/third-party/sounds<br />A calc/third-party/sounds/ding.ogg<br />A calc/third-party/sounds/dong.ogg<br />A calc/third-party/sounds/clang.ogg<br />Checked out revision 14.<br /><br />Fetching external item into calc/third-party/skins<br />…<br /><br />小结<br /><br />Subversion有一份很好的文???《Version Control with Subversion》（http://svnbook.red-bean.com/）。它提供了有关Subversion的各方面内容，如使用、管理和开发等。 <br />经过数年的开发，以替代CVS为目标的Subversion，相信以其强大的功能，对CVS良好的继承性，一定会有很好的发展。<br /><br />作者简介<br />姓名：雷凯<br />工作单位：升技主板(苏州)研发中心<br />联系地址：苏州市新区马运路罗礼科技有限公司研发中心 邮编 215000<br />E-mail: tigerleihm@yahoo.com.cn <br /><br />参考资料：Version Control with Subversion　（http://svnbook.red-bean.com/）<br /><br />“本文作者是雷凯 升技主板(苏州)研发中心工程师。他目前在中国苏州 升技主板(苏州)研发中心工作。可以通过tigerleihm@yahoo.com.cn 与他联系。”</font>
		<br />
		<br />
<img src ="http://www.cnitblog.com/subversion/aggbug/16710.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/subversion/" target="_blank">subversion</a> 2006-09-11 22:50 <a href="http://www.cnitblog.com/subversion/archive/2006/09/11/16710.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Subversion的Repository列表完美解决方案</title><link>http://www.cnitblog.com/subversion/archive/2006/09/11/16709.html</link><dc:creator>subversion</dc:creator><author>subversion</author><pubDate>Mon, 11 Sep 2006 14:49:00 GMT</pubDate><guid>http://www.cnitblog.com/subversion/archive/2006/09/11/16709.html</guid><wfw:comment>http://www.cnitblog.com/subversion/comments/16709.html</wfw:comment><comments>http://www.cnitblog.com/subversion/archive/2006/09/11/16709.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/subversion/comments/commentRss/16709.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/subversion/services/trackbacks/16709.html</trackback:ping><description><![CDATA[
		<font color="#333333">我的SVN项目都放在h:/svn下，在Apache中只是把这个目录设置成了虚拟目录，这样我可以方便的通过http: //localhost/svn/project1访问这个目录下的所有Repository，但如果我想访问http: //localhost/svn/，是得不到所有Repository列表的，只是一个403 Forbidden错误，在TortorseSVN的帮助中有这么一篇文章中提到了解决的方法，下面是我的具体实施和一点心得。<br /><br />SVN在Apache中的配置段一般都用&lt;Location&gt;，我尝试过使用&lt;Directory&gt;，好像也可以，但不管用那个，在配置中无法使用AllowOverride指令，也就是说.htaccess文件无法使用。因此，若想把http: //localhost/svn/转向到调用其它文件，只能使用Rewrite module，并且必须写在&lt;Location&gt;段之外。我就是在这里试了N久 :( 。<br /><br />（Apache一般配置和PHP、Rewrite module安装略过）<br /><br />为了方便管理，用于显示Repository列表的PHP文件放在了h:/svn/svntools/目录，也就是在SVN的根目录下 :-) 。因此，Apache中的这段配置如下：<br /><br />Alias /svntools "h:/svn/svntools"<br />RewriteEngine on<br />RewriteRule ^/svn/$ /svntools/svn_index.php [PT]<br />&lt;Location /svn&gt;<br />DAV svn<br />SVNParentPath h:/svn<br />&lt;/Location&gt;<br /><br />先用Alias定义到h:/svn/svntools的虚拟目录，这样就可以访问到svn_index.php文件了，然后打开 RewriteEngine，使用RewriteRule将到/svn/的访问重定向到/svntools/svn_index.php文件，通过执行这个文件就会产生Repository列表了；最后是SVN虚拟目录的配置。</font>
		<br />
		<br />
<img src ="http://www.cnitblog.com/subversion/aggbug/16709.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/subversion/" target="_blank">subversion</a> 2006-09-11 22:49 <a href="http://www.cnitblog.com/subversion/archive/2006/09/11/16709.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Subversion简明命令手册</title><link>http://www.cnitblog.com/subversion/archive/2006/09/11/16708.html</link><dc:creator>subversion</dc:creator><author>subversion</author><pubDate>Mon, 11 Sep 2006 14:48:00 GMT</pubDate><guid>http://www.cnitblog.com/subversion/archive/2006/09/11/16708.html</guid><wfw:comment>http://www.cnitblog.com/subversion/comments/16708.html</wfw:comment><comments>http://www.cnitblog.com/subversion/archive/2006/09/11/16708.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/subversion/comments/commentRss/16708.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/subversion/services/trackbacks/16708.html</trackback:ping><description><![CDATA[
		<h3>Subversion简明命令手册</h3>
		<span class="date">
				<font face="Verdana" size="1">allen | 06 五月, 2006 13:06</font>
		</span>
		<p>之前的<a href="http://www.a3linux.net/plog/index.php?op=ViewArticle&amp;articleId=31&amp;blogId=1"><font color="#666666">subversion尝试</font></a>后，一直没有很好的总结一下经验，总觉得subversion和CVS没什么两样，仔细想来，Subversion和CVS还是有很多区别的，具体的比较且不去在这里说了，这儿总结一下几个常用的命令，这几条几乎是Linux/Unix下用SVN肯定用的着的命令，还是和CVS有些不同的，具体的东西还是要真的用了才可以想明白。<br /><b>创建仓库（Repository）</b><br />svnadmin create /path/to/repository<br /><br />svnadmin是有用的subversion系统管理命令，使用svnadmin help查看在线帮助<br />信息。<br /><br /><b>添加新的项目（import new project）</b><br />subversion的手册推荐的项目目录结构，<br />project/<br />+ branches/<br />+ tags/<br />+ trunk/<br />+ dir1/<br />+ file1<br />+ file2<br />+ dir2/<br /><br />svn import project file:///repository_name/project -m "Comment"<br />svn import project http://host/svn_dir/repository_name/project -m "Comment"<br /><br /><b>检出（checkout）项目</b><br />svn checkout file:///repository_name/project/trunk project<br />svn checkout http://host/svn_dir/repository_name/project/trunk project<br /><br /><b>列出仓库中的项目（list）</b><br />svn list --verbose file:///repository_name/project<br />svn list --verbose http://host/svn_dir/repository_name/project<br /><br /><b>状态查询（status）</b><br />svn status<br />给出新文件，已经改变的文件和被删除的文件列表;<br /><br /><b>添加文件或目录（add）</b><br />svn add<br /><br /><b>删除文件或目录（delete）</b><br />svn delete<br />svn delete http://host/svn_dir/repository/project_dir 这条命令刚好可以用来删除<br />错误的import的某些项目！！<br /><br /><b>提交（commit）</b><br />svn commit http://host/svn_dir/repository/project_dir<br /><br /><b>更新（update）</b><br />svn update<br />更新仓库中的文件到本地。<br /><br /><b>标签和特殊版本项目</b><br />使用copy命令<br />svn copy http://host/repos/project/trunk http://host/repos/project/tags/1.0.0<br />用于创建某个特定版本的快照（snapshot）;<br />svn list http://host/repos/project/tags/1.0.0<br />查看某个版本的内容</p>
<img src ="http://www.cnitblog.com/subversion/aggbug/16708.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/subversion/" target="_blank">subversion</a> 2006-09-11 22:48 <a href="http://www.cnitblog.com/subversion/archive/2006/09/11/16708.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Installation instructions for Subversion 1.0.3 server in Linux(in non-usual places)</title><link>http://www.cnitblog.com/subversion/archive/2006/09/11/16706.html</link><dc:creator>subversion</dc:creator><author>subversion</author><pubDate>Mon, 11 Sep 2006 14:37:00 GMT</pubDate><guid>http://www.cnitblog.com/subversion/archive/2006/09/11/16706.html</guid><wfw:comment>http://www.cnitblog.com/subversion/comments/16706.html</wfw:comment><comments>http://www.cnitblog.com/subversion/archive/2006/09/11/16706.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/subversion/comments/commentRss/16706.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/subversion/services/trackbacks/16706.html</trackback:ping><description><![CDATA[
		<h1>Installation instructions for Subversion 1.0.3 server in Linux(in non-usual places)</h1>The following programs are required to install Subversion server: 
<ul><li>Autoconf 2.5 or newer 
</li><li>Libtool 1.4 or newer 
</li><li>Python 2.0 
</li><li>PkgConfig 0.15.0 
</li><li>OpenSSL 0.9.7d </li></ul><p>These instructions will assume that all applications are installed in the $HOME/local directory and with the library path of $HOME/local/lib.<br />The $HOME/local/lib directory needs to be added to the LD_LIBRARY_PATH variable.</p><h2>Installing Berkeley DB 4.2 (or newer)</h2><ol><li>Go to <a href="http://www.sleepycat.com/download/db/index.shtml">http://www.sleepycat.com/download/db/index.shtml</a> to download the latest version of Berkeley DB (db-4.X.X.tar.gz) 
</li><li>Unpack it using the following command: <pre>tar zxvf db-4.X.X.tar.gz
</pre></li><li>Download any new patches from the website and apply using the following: <pre>cd /path/to/db-4.X.X
patch -p0 &lt; patchfile
</pre></li><li>Configure and compile using the following: <pre>cd /path/to/db-4.X.X/build_unix
../dist/configure --prefix=$HOME/local
make
make install
</pre></li></ol><h2>Installing Apache Server</h2><ol><li>Go to <a href="http://httpd.apache.org/download.cgi">http://httpd.apache.org/download.cgi</a> to download the latest version of Apache server (httpd-X.X.X.tar.gz) 
</li><li>Unpack it using the following command: <pre>tar zxvf httpd-X.X.X.tar.gz
</pre></li><li>Build APR utilities using custom Berkeley DB path <pre>cd /path/to/httpd-2.X.X/srclib/apr
./configure --prefix=$HOME/local
cd ../apr-util
./configure --prefix=$HOME/local --with-berkeley-db=$HOME/local --with-apr=../apr
make
make install
</pre></li><li>Build Apache using the custom built APR utilities <pre>cd /path/to/httpd-2.X.X
./configure --prefix=$HOME/local --enable-dav --enable-http --enable-dav-fs --enable-so --enable-ssl --with-ssl=$HOME/local/lib --with-apr-util=$HOME/local
make
make install
</pre></li></ol><h2>Installing Neon</h2><ol><li>Go to <a href="http://www.webdav.org/neon/">http://www.webdav.org/neon/</a> and download neon library 0.24.6 or better. 
</li><li>Unpack it and rename the directory from "./neon-0.24.6/" to "./neon/". 
</li><li>Configure and compile using the following: <pre>cd /path/to/neon
./configure --prefix=$HOME/local --with-ssl --with-lib=$HOME/local/openssl-0.9.7d
make
make install
</pre></li></ol><h2>Installing the Subversion Server</h2>The following instructions describe the steps involved in setting up the subversion server with user authentication 
<h3>Compiling Subversion</h3><ol><li>Go to <a href="http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=260">http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=260</a> to download the latest source tar ball for Subversion (subversion-X.X.X.tar.gz 
</li><li>Unpack it using the following command: <pre>tar zxvf subversion-X.X.X.tar.gz
</pre></li><li>Configure and compile using the following: <pre>cd /path/to/subversion-X.X.X
./configure --prefix=$HOME/local --enable-maintainer-mode --with-ssl=$HOME/local/lib --enable-ssl --with-berkeley-db=$HOME/local --with-dbm=db42 --with-apxs=$HOME/local/bin/apxs
make
make install
</pre></li></ol><h3>Create a user's file using htpasswd (comes with Apache)</h3><ol><li>Use the following command to enter a password for each user (-c to create the file) <pre>$HOME/local/htpasswd -cm /path/to/svn-auth-file username
</pre></li></ol><h3>Creating an Authorized SVN Access file</h3><ol><li>The access file is used to determine which users have which access to which directories. The sections of the file is of the form [repos-name:path]. The following is an example file: <pre>#Gives harry read and write permissions to /branches/calc/bug-142 and all directories below
#it in the calc repository
#Gives sally read-only permissions
[calc:/branches/calc/bug-142]
harry = rw
sally = r

# give sally write access only to the 'testing' subdir
[calc:/branches/calc/bug-142/testing]
sally = rw
	
# Denies any permissions to harry
[calc:/branches/calc/bug-142/secret]
harry =
	
#Gives all users read access to all repositories
[/]
* = r
	
#Permissions can be given to entire groups by defining the members of groups
[groups]
calc-developers = harry, sally, joe
paint-developers = frank, sally, jane
everyone = harry, sally, joe, frank, sally, jane
	
[calc:/projects/calc]
@calc-developers = rw

[paint:/projects/paint]
@paint-developers = rw
jane = r
</pre></li></ol><h3>Configuring httpd.conf and ssl.conf</h3><ol><li>Add the following lines to http.conf to instruct Apache to load the mod_dav_svn module. These lines must be added before any Subversion-related configuration items: <pre>LoadModule dav_svn_module     modules/mod_dav_svn.so
</pre></li><li>Add the following lines to httpd.conf somewhere AFTER the LoadModule commands to tell Apache where you keep your Subversion repositories: <pre># To access a repository type in the URL "SERVER/svn/REPOSITORYNAME"
&lt; Location /svn&gt;
DAV svn
SVNParentPath /usr/local/svn
	    
# our access control policy
AuthzSVNAccessFile /path/to/access/file
            
# try anonymous access first, resort to real 
# authentication if necessary.
Require valid-user
            
# how to authenticate a user
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /path/to/svn-auth-file
&lt;/Location&gt;
</pre></li><li>Fix the ServerName, username, etc. as appropriate in both httpd.conf and ssl.conf 
</li><li>Create an SSL certificate, get it signed, and add the following lines to httpd.conf to identify the location of server.key and server.crt: <pre>SSLCertificateFile /h/45/villegas/local/conf/ssl.crt/server.crt
SSLCertificateKeyFile /h/45/villegas/local/conf/ssl.key/server.key
</pre></li></ol><h3>Starting Subversion server with SSL</h3><ol><li>Start up Apache server with SSL option: <pre>$HOME/local/bin/apachectl -f $HOME/local/conf/httpd.conf -DSSL
</pre></li></ol><h3>Creating a Repository in Subversion</h3><ol><li>To create a repository called "test_repos" (requires administrator privileges): <pre>svnadmin create /path/to/test_repos
</pre></li><li>To import a tree of data called project into the repository: <pre>svn import /path/to/project https://domainname.com/svn/test_repos -m "Initial import"
</pre></li><li>To checkout the files into a working directory called "project": <pre>svn checkout https://domainname.com/svn/test_repos/trunk project
</pre></li></ol>The repository can now be viewed by pointing your web browser at https://domainname.com/repos/test_repos 
<hr /><p class="fileid">$Id: subversion_linux.html,v 1.4 2004/06/22 15:51:40 wvillegas Exp $</p><img src ="http://www.cnitblog.com/subversion/aggbug/16706.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/subversion/" target="_blank">subversion</a> 2006-09-11 22:37 <a href="http://www.cnitblog.com/subversion/archive/2006/09/11/16706.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>