﻿<?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>C++博客-Dark Angle-随笔分类-软件应用</title><link>http://www.cppblog.com/niewenlong/category/5335.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 02 Jul 2012 02:44:42 GMT</lastBuildDate><pubDate>Mon, 02 Jul 2012 02:44:42 GMT</pubDate><ttl>60</ttl><item><title>Office Professional Plus 2010 激活</title><link>http://www.cppblog.com/niewenlong/archive/2012/07/01/180983.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Sun, 01 Jul 2012 02:44:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2012/07/01/180983.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/180983.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2012/07/01/180983.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/180983.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/180983.html</trackback:ping><description><![CDATA[<div class="content" sizset="2" sizcache="14"><pre id="best-answer-content" class="reply-text mb10">先试试这个：GRPWH-7CDHQ-K3G3C-JH2KX-C88H8
现在激活office得靠运气，前一段时间先用6QFDX-PYH2G-PPYFD-C7RJM-BBKQ8 安装，然后在控制面板-卸载程序-office 2010右键 更改-更改密钥  在输入
BDD3G-XM7FB-BD2HM-YK63V-VQFDK 就可以激活。现在好像不行了。下面还有好多神key你可以试试，祝你好运。

VYBBJ-TRJPB-QFQRF-QFT4D-H3GVB
GCXQJ-KFYBG-XR77F-XF3K8-WT7QW 
QY89T-88PV8-FD7H7-CJVCQ-GJ492 
23TGP-FTKV6-HTHGD-PDWWP-MWCRQ 
GDQ98-KW37Y-MVR84-246FH-3T6BG 
FGVT2-GBV2M-YG4BD-JM823-XJYRY 
TTWC8-Y8KD3-YD77J-RGWTF-DTG2V 
GFWF2-R8H99-P4YWF-D2HY9-6PPXJ 
GRPWH-7CDHQ-K3G3C-JH2KX-C88H8</pre><pre class="reply-text mb10">&nbsp;</pre><pre class="reply-text mb10"><p>Office 2010密钥（序列号）：<br />GCCVP-793B7-92C6G-KJ4CD-98RYD<br />C6YV2-6CKK8-VF7JB-JJCFM-HXJ2D<br />GCXQJ-KFYBG-XR77F-XF3K8-WT7QW<br />KH2J9-PC326-T44D4-39H6V-TVPBY<br />TFP9Y-VCY3P-VVH3T-8XXCC-MF4YK<br />236TW-X778T-8MV9F-937GT-QVKBB<br />87VT2-FY2XW-F7K39-W3T8R-XMFGF</p><p>QY89T-88PV8-FD7H7-CJVCQ-GJ492<br />23TGP-FTKV6-HTHGD-PDWWP-MWCRQ<br />GDQ98-KW37Y-MVR84-246FH-3T6BG<br />FGVT2-GBV2M-YG4BD-JM823-XJYRY<br />TTWC8-Y8KD3-YD77J-RGWTF-DTG2V<br />GFWF2-R8H99-P4YWF-D2HY9-6PPXJ<br /></p></pre><pre class="reply-text mb10">&nbsp;</pre><pre class="reply-text mb10">程序名&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 密钥<br />Office&#174; 2010&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; J9VBQ-YXT2F-PFRJY-FVDK2-82DRK<br />Access&#174; 2010&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2PHY7-B7HRB-DD4FQ-96J8V-43K97<br />Outlook&#174; 2010&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; H6MJ8-6873D-9MCXR-MPKVH-3FDXD<br />Access&#174; 2010&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Q4JKD-G8YVM-PTGDX-M828P-GG68W<br />Outlook&#174; 2010&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; J3RV4-QYG3M-X87HK-P9GGV-8RTPF<br />OneNote&#174; 2010&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MPDFB-YDQ39-XRR24-9XHTH-RV6XG<br />PowerPoint&#174; 2010&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RDHK9-BMJ9B-78MKR-PTVFJ-VHGGF<br />Visio&#174; Professional 2010&nbsp;&nbsp;&nbsp; HVWTH-2C23J-FQ4VQ-MYY7X-WD9V8<br />Project&#174; Professional 2010&nbsp; TF662-B8FFX-JT77W-MWGXV-DTBBH<br />Publisher&#174; 2010&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6F4MR-D9VM6-B69K8-QFJC2-4XTM9<br />SharePoint Designer&#174; 2010&nbsp;&nbsp; 不需要密钥即可激活。</pre></div><img src ="http://www.cppblog.com/niewenlong/aggbug/180983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2012-07-01 10:44 <a href="http://www.cppblog.com/niewenlong/archive/2012/07/01/180983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>硬盘安装WIN7到C盘方法</title><link>http://www.cppblog.com/niewenlong/archive/2009/06/19/88105.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Fri, 19 Jun 2009 08:10:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2009/06/19/88105.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/88105.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2009/06/19/88105.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/88105.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/88105.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;普通PE下安装windows7，<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E7%B3%BB%E7%BB%9F">系统</span>默认安装在C盘(在PE下直接setup安装不了)<br><br>1.把<span class=t_tag onclick=tagshow(event) href="tag.php?name=WINDOWS">WINDOWS</span>7的ISO镜像解压到D:\win7\...。（win7文件夹也可以不建）<br>2.进入PE，格式化C盘为NTFS。<br>3.从D:\win7\提取boot和bootmgr这两个文件到C盘根目录。再从D:\win7\sources提取boot.<span class=t_tag onclick=tagshow(event) href="tag.php?name=wim">wim</span>和install.<span class=t_tag onclick=tagshow(event) href="tag.php?name=wim">wim</span>这两个文件到C:\sources。<br>4.在PE中运行cmd，输入&#8220;c:\boot\bootsect.exe /nt60 c:&#8221;（注意exe和/及nt60和c:之间有空格）<br>回车后看到提示successful即成功了！&nbsp;&nbsp;然后重起电脑。<br>5.出现安装界面，注意一定不要点现在安装，点左下角&#8220;Repair Your computer&#8221;进入系统恢复选项，选最后一项&#8220;command prompt&#8221;，进入DOS窗口。<br>6.进入DOS后，输入&#8220;D:\win7\sources\setup&#8221;，回车，进入系统的正常安装，选安装位置时记得要格式化C盘。<br>&nbsp; &nbsp; 整个过程和VISTA的安装过程一样，15分钟结束，比XP和VISTA都快。<br></p>
<p><br>&nbsp;</p>
<p><br>&nbsp;</p>
<p><br>&nbsp;</p>
<p><br>&nbsp;</p>
<p>目前，Win7测试版在网上炒得火热，多数人的评价都比较正面，说什么&#8220;爽&#8221;之类，搞得不少人心痒痒的，也想装来玩玩。<br>&nbsp;&nbsp;&nbsp;&nbsp;按常规，下载回来的DVD镜像要先刻盘，再从光盘启动来安装。可是很多人没有刻录机，甚至连光驱都没有。怎么办呢，从硬盘安装啦！下面详细介绍XP系统下从硬盘安装Win7的方法和步骤，按照步骤去做，肯定能成功。<br>&nbsp;&nbsp;&nbsp;&nbsp;友情提示：<img src="http://www1.pconline.com.cn/itbbs/080506/old/emot/em217.gif"><br>本方法很适合安装64位的Win7&nbsp;或Vista&nbsp;。如果是在空盘（没用任何系统的硬盘）上安装，推荐用PE光盘（U盘）启动，然后对照本文进行操作。如果硬盘已经有XP（X86）系统，又是安装32位的Win7或Vista的话，直接双击安装文件SETUP.EXE即可。<br>&nbsp;&nbsp;&nbsp;&nbsp;1、硬盘空间准备。<br>&nbsp;&nbsp;&nbsp;&nbsp;安装Win7系统的分区一般要30～50G大小，且为NTFS格式。因你现在的电脑已经在C盘安装了XP，因此要先准备一个30～50G的D盘或E盘来装Win7&nbsp;。如果D、E盘的空间不符合要求，则调整一下。调整方法是：先备份D、E盘的资料，然后下载Paragon&nbsp;Partition&nbsp;Manager&nbsp;绿色版，在XP系统下用它将D盘或E盘的空间调整到30～50G&nbsp;。具体方法可以参考这个帖子的部分章节：<a href="http://softbbs.pconline.com.cn/7307078.html" target=_blank><u><font color=#0000ff>http://softbbs.pconline.com.cn/7307078.html</font></u></a><br>Paragon&nbsp;Partition&nbsp;Manager&nbsp;7绿色版可以在点击这里下载：<a href="http://img.pconline.com.cn/images/bbs4/attachment/20092/12/1234426021995.rar" target=_blank><u><font color=#0000ff>WINPM.rar</font></u></a><br>&nbsp;&nbsp;&nbsp;&nbsp;2、Win7文件准备。<br>&nbsp;&nbsp;&nbsp;&nbsp;①下载Win7&nbsp;的ISO文件到本机硬盘中。<br>&nbsp;&nbsp;&nbsp;&nbsp;②提取Win7&nbsp;启动文件。用UltraISO软件或虚拟光驱加载Vista的ISO文件，将bootmgr文件和boot、efi、sources文件夹拷到C盘（sources只需拷贝boot.wim文件，其余的不必拷贝，因此可以事先在C盘新建一个文件夹sources，再拷贝boot.wim文件进去）。<br>&nbsp;&nbsp;&nbsp;&nbsp;③提取Win7&nbsp;安装文件。用与②相同的方法将sources文件夹拷贝到E盘中（也可以放到F盘等，只要不放在Win7&nbsp;要安装的D盘）。<br><br><a onclick="window.open('viewpic.jsp?imgUrl=http%3A%2F%2Fimg.pconline.com.cn%2Fimages%2Fbbs4%2F20092%2F12%2F1234426073059.jpg');return false;" href="javascript:void(0);" target=_blank rel=nofollow><img onmouseenter="javascript:if(window.ubbImgWidth&amp;&amp;this.width>window.ubbImgWidth)this.width=window.ubbImgWidth;" alt=硬盘安装Win7全攻略（图解） src="http://img.pconline.com.cn/images/bbs4/20092/12/1234426073059.jpg" onload="javascript:if(window.ubbImgWidth&amp;&amp;this.width>window.ubbImgWidth)this.width=window.ubbImgWidth;" border=0></a> <br>&nbsp;&nbsp;&nbsp;&nbsp;3、Win7&nbsp;启动格式准备。<br>&nbsp;&nbsp;&nbsp;&nbsp;在XP系统打开行命令行窗口（方法是：开始&#8594;运行，填入CMD然后回车），在命令行窗口键入命令并回车：<br>c:\boot\bootsect.exe&nbsp;/nt60&nbsp;c:<br><br>注：如果安装64位的Win7/Vista，因为系统镜像中的bootsect.exe是64位的，不能在32位系统下运行。下面提供一个32位的给大家下载，免得又要到处找。请安装64位系统的网友下载使用，解压后覆盖boot文件夹中的64位的bootsect.exe就行了。<br><a href="http://img.pconline.com.cn/images/bbs4/attachment/20095/3/1241354214543.rar" target=_blank><u><font color=#0000ff>bootsect86.rar</font></u></a><br><br><a onclick="window.open('viewpic.jsp?imgUrl=http%3A%2F%2Fimg.pconline.com.cn%2Fimages%2Fbbs4%2F20092%2F12%2F1234426134215.jpg');return false;" href="javascript:void(0);" target=_blank rel=nofollow><u><font color=#0000ff><img onmouseenter="javascript:if(window.ubbImgWidth&amp;&amp;this.width>window.ubbImgWidth)this.width=window.ubbImgWidth;" alt=硬盘安装Win7全攻略（图解） src="http://img.pconline.com.cn/images/bbs4/20092/12/1234426134215.jpg" onload="javascript:if(window.ubbImgWidth&amp;&amp;this.width>window.ubbImgWidth)this.width=window.ubbImgWidth;" border=0></font></u></a> <a onclick="window.open('viewpic.jsp?imgUrl=http%3A%2F%2Fimg.pconline.com.cn%2Fimages%2Fbbs4%2F20092%2F12%2F1234426133448.jpg');return false;" href="javascript:void(0);" target=_blank rel=nofollow><img onmouseenter="javascript:if(window.ubbImgWidth&amp;&amp;this.width>window.ubbImgWidth)this.width=window.ubbImgWidth;" alt=硬盘安装Win7全攻略（图解） src="http://img.pconline.com.cn/images/bbs4/20092/12/1234426133448.jpg" onload="javascript:if(window.ubbImgWidth&amp;&amp;this.width>window.ubbImgWidth)this.width=window.ubbImgWidth;" border=0></a> <br>&nbsp;&nbsp;&nbsp;&nbsp;4、启动Win7&nbsp;的PE系统。<br>&nbsp;&nbsp;&nbsp;&nbsp;重启电脑，就会进入WinPE&nbsp;系统&nbsp;，启动完成后弹出Win7&nbsp;安装界面，点&#8220;下一步&#8221;&#8594;&#8220;修复计算机&#8221;&#8594;&#8220;否&#8221;&#8594;&#8220;下一步&#8221;&#8594;&#8220;命令提示符&#8221;，弹出命令行窗口。<br><br><a onclick="window.open('viewpic.jsp?imgUrl=http%3A%2F%2Fimg.pconline.com.cn%2Fimages%2Fbbs4%2F20092%2F12%2F1234426305511.jpg');return false;" href="javascript:void(0);" target=_blank rel=nofollow><img onmouseenter="javascript:if(window.ubbImgWidth&amp;&amp;this.width>window.ubbImgWidth)this.width=window.ubbImgWidth;" alt=硬盘安装Win7全攻略（图解） src="http://img.pconline.com.cn/images/bbs4/20092/12/1234426305511.jpg" onload="javascript:if(window.ubbImgWidth&amp;&amp;this.width>window.ubbImgWidth)this.width=window.ubbImgWidth;" border=0></a> <a onclick="window.open('viewpic.jsp?imgUrl=http%3A%2F%2Fimg.pconline.com.cn%2Fimages%2Fbbs4%2F20092%2F12%2F1234426305685.jpg');return false;" href="javascript:void(0);" target=_blank rel=nofollow><img onmouseenter="javascript:if(window.ubbImgWidth&amp;&amp;this.width>window.ubbImgWidth)this.width=window.ubbImgWidth;" alt=硬盘安装Win7全攻略（图解） src="http://img.pconline.com.cn/images/bbs4/20092/12/1234426305685.jpg" onload="javascript:if(window.ubbImgWidth&amp;&amp;this.width>window.ubbImgWidth)this.width=window.ubbImgWidth;" border=0></a> <a onclick="window.open('viewpic.jsp?imgUrl=http%3A%2F%2Fimg.pconline.com.cn%2Fimages%2Fbbs4%2F20092%2F12%2F1234426305619.jpg');return false;" href="javascript:void(0);" target=_blank rel=nofollow><img onmouseenter="javascript:if(window.ubbImgWidth&amp;&amp;this.width>window.ubbImgWidth)this.width=window.ubbImgWidth;" alt=硬盘安装Win7全攻略（图解） src="http://img.pconline.com.cn/images/bbs4/20092/12/1234426305619.jpg" onload="javascript:if(window.ubbImgWidth&amp;&amp;this.width>window.ubbImgWidth)this.width=window.ubbImgWidth;" border=0></a> <br><br><a onclick="window.open('viewpic.jsp?imgUrl=http%3A%2F%2Fimg.pconline.com.cn%2Fimages%2Fbbs4%2F20092%2F12%2F1234426305574.jpg');return false;" href="javascript:void(0);" target=_blank rel=nofollow><img onmouseenter="javascript:if(window.ubbImgWidth&amp;&amp;this.width>window.ubbImgWidth)this.width=window.ubbImgWidth;" alt=硬盘安装Win7全攻略（图解） src="http://img.pconline.com.cn/images/bbs4/20092/12/1234426305574.jpg" onload="javascript:if(window.ubbImgWidth&amp;&amp;this.width>window.ubbImgWidth)this.width=window.ubbImgWidth;" border=0></a> <a onclick="window.open('viewpic.jsp?imgUrl=http%3A%2F%2Fimg.pconline.com.cn%2Fimages%2Fbbs4%2F20092%2F12%2F1234426306279.jpg');return false;" href="javascript:void(0);" target=_blank rel=nofollow><img onmouseenter="javascript:if(window.ubbImgWidth&amp;&amp;this.width>window.ubbImgWidth)this.width=window.ubbImgWidth;" alt=硬盘安装Win7全攻略（图解） src="http://img.pconline.com.cn/images/bbs4/20092/12/1234426306279.jpg" onload="javascript:if(window.ubbImgWidth&amp;&amp;this.width>window.ubbImgWidth)this.width=window.ubbImgWidth;" border=0></a> <br>&nbsp;&nbsp;&nbsp;&nbsp;5、清理启动文件。<br>&nbsp;&nbsp;&nbsp;&nbsp;必须删除原来拷贝到C盘的bootmgr文件和boot、efi、sources文件夹，以免安装Win7&nbsp;时启动文件混乱导致失败。分别在命令行窗口键入命令并回车：<br>del&nbsp;c:\bootmgr<br>rd&nbsp;/s&nbsp;c:\boot<br>rd&nbsp;/s&nbsp;c:\efi<br>rd&nbsp;/s&nbsp;c:\sources<br>&nbsp;&nbsp;&nbsp;&nbsp;6、格式化D盘。<br>&nbsp;&nbsp;&nbsp;&nbsp;键入以下命令并回车：format&nbsp;d:&nbsp;/q&nbsp;/fs:ntfs<br>如果D盘已经是NTFS格式，可以不加/fs:ntfs这个参数。&nbsp;如果D盘是空盘，就不必格式化了，跳过这一步。&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;7、运行win7&nbsp;安装命令。<br>&nbsp;&nbsp;&nbsp;&nbsp;键入以下命令并回车：<br>E:\SOURCES\setup.exe<br><br><a onclick="window.open('viewpic.jsp?imgUrl=http%3A%2F%2Fimg.pconline.com.cn%2Fimages%2Fbbs4%2F20092%2F12%2F1234426389027.jpg');return false;" href="javascript:void(0);" target=_blank rel=nofollow><img onmouseenter="javascript:if(window.ubbImgWidth&amp;&amp;this.width>window.ubbImgWidth)this.width=window.ubbImgWidth;" alt=硬盘安装Win7全攻略（图解） src="http://img.pconline.com.cn/images/bbs4/20092/12/1234426389027.jpg" onload="javascript:if(window.ubbImgWidth&amp;&amp;this.width>window.ubbImgWidth)this.width=window.ubbImgWidth;" border=0></a> <br>&nbsp;&nbsp;&nbsp;&nbsp;8、完成安装。<br>&nbsp;&nbsp;&nbsp;&nbsp;按提示一步步完成win7&nbsp;安装，其过程跟光盘安装是一样的。<br>&nbsp;&nbsp;&nbsp;&nbsp;安装完成后，你就拥有Win7-XP双系统了。<br><br><a onclick="window.open('viewpic.jsp?imgUrl=http%3A%2F%2Fimg.pconline.com.cn%2Fimages%2Fbbs4%2F20092%2F12%2F1234426427340.jpg');return false;" href="javascript:void(0);" target=_blank rel=nofollow><img onmouseenter="javascript:if(window.ubbImgWidth&amp;&amp;this.width>window.ubbImgWidth)this.width=window.ubbImgWidth;" alt=硬盘安装Win7全攻略（图解） src="http://img.pconline.com.cn/images/bbs4/20092/12/1234426427340.jpg" onload="javascript:if(window.ubbImgWidth&amp;&amp;this.width>window.ubbImgWidth)this.width=window.ubbImgWidth;" border=0></a> <br>要注意的是：<br>①在提示选择&#8220;安装类型&#8221;时不要选&#8220;升级&#8221;，要选&#8220;自定义（高级）&#8221;；<br>②在提示安装到哪一个盘时选&#8220;分区2&#8221;（即D盘），不要搞错了；<br>③在提示输入产品密钥时，输入你申请（搜索...？-_-）到的密钥，或可以留空，直接点&#8220;下一步&#8221;，等安装完成后，再想法激活。<br><br></p>
<img src ="http://www.cppblog.com/niewenlong/aggbug/88105.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2009-06-19 16:10 <a href="http://www.cppblog.com/niewenlong/archive/2009/06/19/88105.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows下架设Subversion服务器</title><link>http://www.cppblog.com/niewenlong/archive/2008/10/28/65285.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Tue, 28 Oct 2008 02:51:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2008/10/28/65285.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/65285.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2008/10/28/65285.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/65285.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/65285.html</trackback:ping><description><![CDATA[<p style="FONT-FAMILY: 幼圆">作者：indian</p>
<p style="FONT-FAMILY: 幼圆">版本：v1.2</p>
<p style="FONT-FAMILY: 幼圆">修订：2008年1月24日11:45:35</p>
<p style="FONT-FAMILY: 幼圆">出处：<a href="http://indian.blog.163.com/blog/static/10881582007112415021751"><font color=#1b6d5d><u>blog.kysf.net</u></font></a></p>
<p style="MARGIN-LEFT: 31.5pt; TEXT-INDENT: -31.5pt; FONT-FAMILY: 幼圆">版权：作者保留对本文的一切修改、发布等权力。任何人想要转载本文部分或全部内容时，必须保留包括作者、版本、修订、出处、版权，共五项信息。对本文的参考引用，则不受限制。</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">关键词：subversion, 安装配置, 权限, 目录访问</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">1 前言<br>2 基本概念<br>　2.1 什么是版本控制<br>　2.2 什么是 Subversion<br>　2.3 版本库（repository）<br>3 安装配置<br>　3.1 安装独立服务器 SVNServer<br>　3.2 安装 ApacheSVN 服务器<br>4 FAQ<br>5 参考资料</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<h1 style="TEXT-ALIGN: center">1、前 言</h1>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">花了72小时，终于把 Subversion 初步掌握了。从一个连&#8220;什么是版本控制&#8221;都不知道的门外汉，到配置出精确至每目录访问的入门者，中间还卡了一天时间。其中费了许多气力，摸索实验了多次，还差点放弃了，但是收获是巨大的。现把我的配置和学习过程写下来，供大家参考，也让初学者少走弯路。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">由于本人不会 Unix/Linux （正在学习中），故仅以 Windows 平台为例讲解，Unix/Linux 平台请参考相关资料。如其中有谬误的地方，包括错别字，请联系我修订。</p>
<p style="COLOR: red; TEXT-INDENT: 2em; FONT-FAMILY: 幼圆"><strong>技术在分享中进步！</strong></p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<h1 style="TEXT-ALIGN: center" align=center>2、基本概念</h1>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">2.1、什么是版本控制</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">简单点来说，版本控制就是数据仓库，它可以记录你对文件的每次更改。这样，就算你在昏天黑地的改了几个月后老板说不要了，还是按照过去那样，你也不会抓狂，简单的恢复版本操作就搞定一切。</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">2.2、什么是 Subversion</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">Subversion是一个自由/开源版本控制系统，它管理文件和目录可以超越时间。一组文件存放在中心版本库，这个版本库很像一个普通的文件服务器，只是它可以记录每一次文件和目录的修改，这便使你可以取得数据以前的版本，从而可以检查所作的更改。从这个方面看，许多人把版本控制系统当作一种&#8220;时间机器&#8221;。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">Subversion可以通过网络访问它的版本库，从而使用户可以在不同的电脑上使用。一定程度上可以说，允许用户在各自的地方修改同一份数据是促进协作。进展可能非常的迅速，并没有一个所有的改变都会取得效果的通道，由于所有的工作都有历史版本，你不必担心由于失去某个通道而影响质量，如果存在不正确的改变，只要取消改变。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">一些版本控制系统也是软件配置管理（SCM）系统，这种系统经过特定的精巧设计来管理源代码，有许多关于软件开发的特性—本身理解编程语言、或者提供构建程序的工具。然而，Subversion不是这样一个系统，它是一个通用系统，可以管理任何类型的文件集，对你这可能是源代码，对别人，可能是一个货物报价单或者是书稿等。</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">2.3、版本库（repository）</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">Subversion 的核心就是 rpository ，中文翻译成&#8220;版本库&#8221;。就是位于服务器端，统一管理和储存数据的地方。</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<h1 style="TEXT-ALIGN: center">3、安装配置</h1>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<h3>3.1 安装独立服务器 SVNServer</h3>
<p style="FONT-FAMILY: 幼圆">环境</p>
<p style="FONT-FAMILY: 幼圆">OS：Windows XP SP2</p>
<p style="FONT-FAMILY: 幼圆">Web：Apache 2.2.6</p>
<p style="FONT-FAMILY: 幼圆">SVN：svn-win32-1.4.6</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">一、准备工作</p>
<p style="FONT-FAMILY: 幼圆">1、获取 Subversion 服务器程序</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">到官方网站（http://subversion.tigris.org/）下载最新的服务器安装程序。目前最新的是1.4.6版本，具体下载地址在：<a href="http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100&amp;expandFolder=8100&amp;folderID=91"><font color=#1b6d5d><u>http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100&amp;expandFolder=8100&amp;folderID=91</u></font></a> ，注意找 for apache 2.2.x 版本的。</p>
<p style="FONT-FAMILY: 幼圆">2、获取 TortoiseSVN 客户端程序</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">从官方网站 <a href="http://tortoisesvn.net/downloads"><font color=#1b6d5d><u>http://tortoisesvn.net/downloads</u></font></a> 获取最新的 TortoiseSVN 。TortoiseSVN 是一个客户端程序，用来与 subvers 服务器端通讯。Subversion 自带一个客户端程序 svn.exe ,但 TortoiseSVN 更好操作，提高效率。</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">二、安装服务器端和客户端</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">首先安装 Apache 2.2.6 ，具体安装方法大家参考相关资料，或者参看我写的《<a href="http://indian.blog.163.com/blog/static/1088158200755105546704"><font color=#1b6d5d><u>Windows下安装Apache 2.2.x</u></font></a>》。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">其次安装 Subversion（以下简称SVN）的服务器端和客户端。下载下来的服务器端是个 zip 压缩包，直接解压缩即可，比如我解压到 E:\subversion 。客户端安装文件是个 exe 可执行文件，直接运行按提示安装即可，客户端安装完成后提示重启。</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">三、建立版本库（Repository）</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">运行Subversion服务器需要首先要建立一个版本库（Repository）。版本库可以看作是服务器上集中存放和管理数据的地方。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">开始建立版本库。首先建立 e:\svn 空文件夹作为所有版本库的根目录。然后，进入命令行并切换到subversion的bin目录。输入如下命令：</p>
<div style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: silver; PADDING-BOTTOM: 4pt; MARGIN: 30pt 21pt; BORDER-LEFT: 1pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: 1pt solid; FONT-FAMILY: 幼圆">svnadmin create E:\svn\repos1</div>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">此命令在 E:\svn 下建立一个版本库 repos1 。repos1 下面会自动生成一些文件夹和文件。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">我们也可以使用 TortoiseSVN 图形化的完成这一步：</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">先建立空目录 E:\svn\repos1 ，注意一定是要空的。然后在 repos1 文件夹上&#8220;右键-&gt;TortoiseSVN-&gt;Create Repository here...&#8221;，然后可以选择版本库模式，这里使用默认的FSFS即可，然后就创建了一系列文件夹和文件，同命令行建立的一样。</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">四、运行独立服务器</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">此时 subversion 服务还没有开始，只是通过它的命令建立了版本库。继续在刚才的命令窗口输入：</p>
<div style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: silver; PADDING-BOTTOM: 4pt; MARGIN: 30pt 21pt; BORDER-LEFT: 1pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: 1pt solid; FONT-FAMILY: 幼圆">svnserve.exe --daemon</div>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">svnserve 将会在端口 3690 等待请求，--daemon（两个短横线）选项告诉 svnserve 以守护进程方式运行，这样在手动终止之前不会退出。注意不要关闭命令行窗口，关闭窗口会把 svnserve 停止。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">为了验证svnserve正常工作，使用TortoiseSVN -&gt; Repo-browser 来查看版本库。在弹出的 URL 对话框中输入：</p>
<div style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: silver; PADDING-BOTTOM: 4pt; MARGIN: 30pt 21pt; BORDER-LEFT: 1pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: 1pt solid; FONT-FAMILY: 幼圆">svn://localhost/svn/repos1</div>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">点 OK 按钮后就可以看见 repos1 版本库的目录树结构了，只不过这时 repos1 是个空库。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">你也可以使用--root选项设置根位置来限制服务器的访问目录，从而增加安全性和节约输入svnserve URL的时间：</p>
<div style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: silver; PADDING-BOTTOM: 4pt; MARGIN: 30pt 21pt; BORDER-LEFT: 1pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: 1pt solid; FONT-FAMILY: 幼圆">svnserve.exe --daemon --root drive:\path\to\repository</div>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">以前面的测试作为例，svnserve 将会运行为：</p>
<div style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: silver; PADDING-BOTTOM: 4pt; MARGIN: 30pt 21pt; BORDER-LEFT: 1pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: 1pt solid; FONT-FAMILY: 幼圆">svnserve.exe --daemon --root e:\svn</div>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">然后TortoiseSVN中的版本库浏览器URL缩减为：</p>
<div style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: silver; PADDING-BOTTOM: 4pt; MARGIN: 30pt 21pt; BORDER-LEFT: 1pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: 1pt solid; FONT-FAMILY: 幼圆">svn://localhost/repos1</div>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">五、配置用户和权限</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">用文本编辑器打开E:\svn\repos1\conf目录，修改svnserve.conf：</p>
<p style="FONT-FAMILY: 幼圆">将：</p>
<div style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: silver; PADDING-BOTTOM: 4pt; MARGIN: 30pt 21pt; BORDER-LEFT: 1pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: 1pt solid; FONT-FAMILY: 幼圆"># password-db = passwd</div>
<p style="FONT-FAMILY: 幼圆">改为：</p>
<div style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: silver; PADDING-BOTTOM: 4pt; MARGIN: 30pt 21pt; BORDER-LEFT: 1pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: 1pt solid; FONT-FAMILY: 幼圆">password-db = passwd</div>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">即去掉前面的 # 注释符，注意前面不能有空格。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">然后修改同目录的passwd文件，增加一个帐号：</p>
<p style="FONT-FAMILY: 幼圆">将：</p>
<div style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: silver; PADDING-BOTTOM: 4pt; MARGIN: 30pt 21pt; BORDER-LEFT: 1pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: 1pt solid; FONT-FAMILY: 幼圆">[users]<br># harry = harryssecret<br># sally = sallyssecret</div>
<p style="FONT-FAMILY: 幼圆">增加帐号：</p>
<div style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: silver; PADDING-BOTTOM: 4pt; MARGIN: 30pt 21pt; BORDER-LEFT: 1pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: 1pt solid; FONT-FAMILY: 幼圆">[users]<br>#harry = harryssecret<br>#sally = sallyssecret<br>test = test</div>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">六、初始化导入</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">下面就是将我们的数据（项目）导入到这个版本库，以后就由版本库管理我们的数据。我们的任何改动都回被版本库记录下来，甚至我们自己丢失、改错数据时版本库也能帮我们找回数据。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">比如，我在 d:\wwwroot 下有个 guestbook 文件夹，里面存放的是我编写的留言簿程序。在此文件夹上&#8220;右键 -&gt; TortoiseSVN -&gt; Import...&#8221; ，在弹出对话框的&#8220;URL of repository&#8221;输入&#8220;svn://localhost/repos1/guestbook&#8221;。在&#8220;Import message&#8221;输入&#8220;导入整个留言簿&#8221;作为注释。<br>点 OK 后要求输入帐号。我们在用户名和密码处都输入 test 。完成后 guestbook 中的内容全部导入到了 svn://localhost/svn/repos1/guestbook 。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">我们看到在 e:\svn\repos1 没有任何变化，连个 guestbook 文件夹都没有建立，唯一的变化就是e:\svn\repos1容量变大了。实际上我们源guestbook中的内容已经导入 repos1 版本库了，源 guestbook 文件夹可以删除了。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">需要注意的是，这一步操作可以完全在另一台安装了 TortoiseSVN 的客户机上进行。例如运行svnserve的主机的IP是133.96.121.22，则URL部分输入的内容就是&#8220;svn://133.96.121.22&#8221; 。</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">七、基本操作流程</p>
<p style="FONT-FAMILY: 幼圆">1、取出（check out）</p>
<p style="FONT-FAMILY: 幼圆">取出版本库到一个工作拷贝：</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">来到任意空目录下，比如在f分区建立一个空文件夹 f:\work 。&#8220;右键 -&gt; SVN Checkout&#8221;。在&#8220;URL of repository&#8221;中输入&#8220;svn://localhost/svn/repos1/guestbook&#8221;，这样我们就得到了一份 guestbook 中内容的工作拷贝。</p>
<p style="FONT-FAMILY: 幼圆">2、存入（check in）/提交（commit）</p>
<p style="FONT-FAMILY: 幼圆">在工作拷贝中作出修改并提交：</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">在 guestbook 工作拷贝中随便打开一个文件，作出修改，然后&#8220;右键 -&gt; SVN Commit... &#8221;。这样我们就把修改提交到了版本库，版本库根据情况存储我们提交的数据。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">在修改过的文件上&#8220;右键 -&gt; TortoiseSVN -&gt; Show Log&#8221; ，可以看到对这个文件所有的提交。在不同的 revision 条目上&#8220;右键 -&gt; Compare with working copy&#8221;，我们可以比较工作拷贝的文件和所选 revision 版本的区别。</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<h3>3.2 安装 ApacheSVN 服务器</h3>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">Subversion的设计包括一个抽象的网络层，这意味着版本库可以通过各种服务器进程访问。理论上讲，Subversion可以使用无限数量的网络协议实现，目前实践中存在着两种服务器。</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<ul>
    <li>SVNServer：svnserve 是一个小的（也叫轻型的）、独立服务器，使用自己定义的协议和客户端。（作者注：以下称这种服务器为&#8220;svnserver服务器&#8221;，上面的安装配置就是安装svnserver服务器。）<br><br>&nbsp;
    <li>ApacheSVN：Apache是最流行的web服务器，通过使用 mod_dav_svn 模块，Apache可以访问版本库，并且可以使客户端使用HTTP的扩展协议WebDAV/DeltaV进行访问。（作者注：以下称这种服务器为&#8220;ApacheSVN服务器&#8221;） </li>
</ul>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">通过 Http 协议访问版本库是 Subversion 的亮点之一。<strong>ApacheSVN服务器</strong> 具备了许多 <strong>svnserve服务器 </strong>没有的特性，使用上更加灵活，但是有一点难于配置，灵活通常会带来复杂性。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">由于 Subversion 需要版本化的控制，因此标准的 Http 协议不能满足需求。要让 Apache 与 Subversion 协同工作，需要使用 WebDAV（Web-based Distributed Authoring and Versioning：）Web 分布式创作和版本控制）。WebDAV 是 HTTP 1.1 的扩展，关于 WebDAV 的规范和工作原理，可以参考 <a href="http://www.ietf.org/rfc/rfc2518.txt"><font color=#1b6d5d><u>IETF RFC 2518</u></font></a> 。</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">一、必备条件</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">为了让你的版本库使用HTTP网络，你必需具备以下几个条件：</p>
<ol>
    <li>配置好httpd 2.2.x，并且使用mod_dav启动。
    <li>为mod_dav安装mod_dav_svn插件。
    <li>配置你的httpd.conf，使http协议能访问版本库。 </li>
</ol>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">下面以我的配置过程详细讲解。</p>
<p style="FONT-FAMILY: 幼圆">环境：</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">OS：Windows XP SP2</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">Web：Apache 2.2.6</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">SVN：svn-win32-1.4.6</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">二、安装</p>
<p style="FONT-FAMILY: 幼圆">1、安装Apache</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">具体安装方法见：《<a href="http://indian.blog.163.com/blog/static/1088158200755105546704"><font color=#1b6d5d><u>Windows下安装Apache 2.2.x</u></font></a>》</p>
<p style="FONT-FAMILY: 幼圆">2、安装 Subversion</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">将下载下来的 svn-win32-1.4.6.zip 直接解压即可，比如我解压到 e:\subversion 。<br>从Subversion安装目录的 bin 子目录将 intl3_svn.dll、libdb44.dll、mod_authz_svn.so、mod_dav_svn.so 拷贝到Apache的模块目录（Apache 安装目录的 modules 文件夹）。</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">三、基本的Apache配置</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">修改Apache的配置文件 <em>httpd.conf </em>，使用LoadModule来加载mod_dav_svn模块。</p>
<p style="FONT-FAMILY: 幼圆">将：</p>
<div style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: silver; PADDING-BOTTOM: 4pt; MARGIN: 30pt 21pt; BORDER-LEFT: 1pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: 1pt solid; FONT-FAMILY: 幼圆">#LoadModule dav_module modules/mod_dav.so</div>
<p style="FONT-FAMILY: 幼圆">改成：</p>
<div style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: silver; PADDING-BOTTOM: 4pt; MARGIN: 30pt 21pt; BORDER-LEFT: 1pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: 1pt solid; FONT-FAMILY: 幼圆">LoadModule dav_module modules/mod_dav.so</div>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">即去掉前面的&#8220;#&#8221;号。</p>
<p style="FONT-FAMILY: 幼圆">添加：</p>
<div style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: silver; PADDING-BOTTOM: 4pt; MARGIN: 30pt 21pt; BORDER-LEFT: 1pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: 1pt solid; FONT-FAMILY: 幼圆">LoadModule dav_svn_module modules/mod_dav_svn.so</div>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">一定确定它在 mod_dav 之后。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">现在你已经设置了Apache和Subversion，但是Apache不知道如何处理Subversion客户端，例如TortoiseSVN。为了让Apache知道哪个目录是用来作为Subversion版本库，你需要使用编辑器（例如记事本）编辑Apache的配置文件。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">在配置文件最后添加如下几行：</p>
<div style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: silver; PADDING-BOTTOM: 4pt; MARGIN: 30pt 21pt; BORDER-LEFT: 1pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: 1pt solid; FONT-FAMILY: 幼圆">&lt;Location /repository/&gt;<br>&nbsp; DAV svn<br>&nbsp; SVNPath e:/svn/repos1<br>&lt;/Location&gt;</div>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">这个配置告诉Apache首先需要启用 dav_module，然后加载 dav_svn_module 。版本库对外的URL是：http://服务器IP/repository/ ，所有的Subversion版本库在物理上位于e:/svn/repos1/ 。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">配置完毕后重新启动 Apache，打开浏览器，输入 http://服务器IP/ repository/ 将会看到如下画面：</p>
<p style="MARGIN: 25pt; FONT-FAMILY: 幼圆; TEXT-ALIGN: center"><img height=104 alt="" src="http://img.blog.163.com/photo/94bq16Cb2CSM3YMOo_WcWQ==/880172252174552815.jpg" width=324 border=0></p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">这表示 Apache 的 dav_svn 模块已经可以正常工作了。用户可以使用任何一种 Subversion 的客户端通过 Http 协议访问你的版本库。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">如果想要指定多个版本库，可以用多个 Location 标签，也可以使用 SVNParentPath 代替 SVNPath，例如在 e:\svn 下有多个版本库 repos1，repos2 等等，用如下方式指定：</p>
<div style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: silver; PADDING-BOTTOM: 4pt; MARGIN: 30pt 21pt; BORDER-LEFT: 1pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: 1pt solid; FONT-FAMILY: 幼圆">&lt;Location /repository/&gt;<br>　DAV svn<br>　SVNParentPath e:/svn<br>&lt;/Location&gt;</div>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">&#8220;SVNParentPath e:/svn &#8221; 表示 e:\svn 下的每个子目录都是一个版本库。可以通过 http://服务器IP/repository/repos1/，http://服务器IP/repository/repos2/ 来访问。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">现在你的版本库任何人都可以访问，并且有完全的写操作权限。也就是说任何人都可以匿名读取，修改，提交，以及删除版本库中的内容(注：这时不需要配置E:\svn\repos\conf\svnserve.conf 文件，并且也不需要启动E:\subversion\bin\svnserve.exe。因为提交是通过Apache的dav模块处理的，而不是由svnservice处理。)。我们用 TortoiseSVN 客户端验证即知。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">显然大部分场合这是不符合需求的。那么如何进行权限设置呢，Apache 提供了基本的权限设置：</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">四、认证选项</p>
<p style="FONT-FAMILY: 幼圆">1、基本 HTTP 认证</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">最简单的客户端认证方式是通过 HTTP 基本认证机制，简单的使用用户名和密码来验证一个用户的身份。Apache提供了一个 htpasswd 工具来管理一个用户文件，这个文件包含用户名和加密后的密码，这些就是你希望赋予 Subversion 特别权限的用户。htpasswd 可以在 Apache 的 bin 安装目录下找到。具体使用方法如下：</p>
<div style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: silver; PADDING-BOTTOM: 4pt; MARGIN: 30pt 21pt; BORDER-LEFT: 1pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: 1pt solid; FONT-FAMILY: 幼圆">
<p style="FONT-FAMILY: 幼圆">创建用户文件：<br>htpasswd -c E:\usr\Apache2.2\bin\passwd.conf username</p>
<p style="FONT-FAMILY: 幼圆">添加新用户（-m 表示以 MD5 加密密码，可选项）：<br>htpasswd [-m] E:\usr\Apache2.2\bin\passwd.conf Newusername</p>
<p style="FONT-FAMILY: 幼圆">更改用户密码：<br>htpasswd [-m] E:\usr\Apache2.2\bin\passwd.conf username</p>
<p style="FONT-FAMILY: 幼圆">删除用户（要用大写的 D ）：<br>htpasswd &#8211;D E:\usr\Apache2.2\bin\passwd.conf username</p>
</div>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">接下来修改 httpd.conf，在 Location 标签中加入如下内容：</p>
<div style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: silver; PADDING-BOTTOM: 4pt; MARGIN: 30pt 21pt; BORDER-LEFT: 1pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: 1pt solid; FONT-FAMILY: 幼圆">AuthType Basic<br>AuthName "svn repos"<br>AuthUserFile E:/usr/Apache2.2/bin/passwd.conf<br>Require valid-user</div>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">说明：</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">AuthType Basic：启用基本的验证，比如用户名/密码对。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">AuthName "svn repos"：当一个认证对话框弹出时，出现在认证对话框中的信息。（最好用英文，TortoiseSVN 不支持中文，安装语言包除外。）</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">AuthUserFile E:/usr/Apache2.2/bin/passwd：指定E:\usr\Apache2.2\bin\passwd为用户文件，用来验证用户的用户名及密码。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">Require valid-user：限定用户只有输入正确的用户名及密码后才能访问这个路径</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">重新启动 Apache ，打开浏览器访问版本库。Apache 会提示你输入用户名和密码来认证登陆了，现在只有 passwd 文件中设定的用户才可以访问版本库。也可以配置只有特定用户可以访问，替换上述 "Require valid-user" 为 "Require user tony robert" 将只有用户文件中的 tony 和 robert 可以访问该版本库。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">有的时候也许不需要这样严格的访问控制，例如大多数开源项目允许匿名的读取操作，而只有认证用户才允许写操作。为了实现更为细致的权限认证，可以使用 Limit 和 LimitExcept 标签。例如：</p>
<div style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: silver; PADDING-BOTTOM: 4pt; MARGIN: 30pt 21pt; BORDER-LEFT: 1pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: 1pt solid; FONT-FAMILY: 幼圆">&lt;LimitExcept GET PROPFIND OPTIONS REPORT&gt;<br>&nbsp; require valid-user<br>&lt;/LimitExcept&gt;</div>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">以上配置将使匿名用户有读取权限，而限制只有 passwd 中配置的用户可以使用写操作。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">如果这还不能满足你的要求，你希望精确的控制版本库目录访问，可以使用 Apache 的 mod_authz_svn 模块对每个目录进行认证操作。</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">2、用 mod_authz_svn 进行目录访问控制</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">首先需要让 Apache 将 mod_authz_svn 模块加载进来。在 Subversion 的安装目录中找到 mod_auth_svn 模块，将其拷贝到 Apache 安装目录的 modules 子目录下。修改 httpd.conf 文件，添加：</p>
<div style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: silver; PADDING-BOTTOM: 4pt; MARGIN: 30pt 21pt; BORDER-LEFT: 1pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: 1pt solid; FONT-FAMILY: 幼圆">LoadModule authz_svn_module modules/mod_authz_svn.so</div>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">现在可以在 Location 标签中使用 authz 的功能了。一个基本的 authz 配置如下：</p>
<div style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: silver; PADDING-BOTTOM: 4pt; MARGIN: 30pt 21pt; BORDER-LEFT: 1pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: 1pt solid; FONT-FAMILY: 幼圆">&lt;Location /repository/&gt;<br>&nbsp; DAV svn<br>&nbsp; SVNParentPath e:/svn<br><br>&nbsp; # our access control policy<br>&nbsp; AuthzSVNAccessFile E:/usr/Apache2.2/bin/accesspolicy.conf<br><br>&nbsp; # try anonymous access first, resort to real<br>&nbsp; # authentication if necessary.<br>&nbsp; Satisfy Any<br>&nbsp; Require valid-user<br><br>&nbsp; # how to authenticate a user<br>&nbsp; AuthType Basic<br>&nbsp; AuthName "Subversion repository"<br>&nbsp; AuthUserFile E:/usr/Apache2.2/bin/passwd.conf<br>&lt;/Location&gt;</div>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">AuthzSVNAccessFile 指向的是 authz 的策略文件，详细的权限控制可以在这个策略文件中指定。访问文件 accesspolicy.conf 的语法与svnserve.conf和 Apache 的配置文件非常相似，以（#）开头的行会被忽略；在它的简单形式里，每一小节命名一个版本库和一个里面的路径；认证用户名是在每个小节中的选项名；每个选项的值描述了用户访问版本库的级别：r（只读）或者rw（读写），如果用户没有提到或者值留空，访问是不允许的； * 表示所有用户，用它控制匿名用户的访问权限；@符号区分组和用户。如：</p>
<div style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: silver; PADDING-BOTTOM: 4pt; MARGIN: 30pt 21pt; BORDER-LEFT: 1pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: 1pt solid; FONT-FAMILY: 幼圆">[groups]<br>committers = paulex, richard<br>developers = jimmy, michel, spark, sean<br><br>[/]<br>* = r<br>@committers = rw <br><br>[/branches/dev]<br>@developers = rw <br><br>[/tags]<br>tony = rw <br>[/private]<br>* = <br>@committers= r<br>&nbsp;</div>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">使用 SVNParentPath 代替 SVNPath 来指定多个版本库的父目录时，其中所有的版本库都将按照这个策略文件配置。例如上例中 tony 将对所有版本库里的 /tags 目录具有读写权限。如果要对具体每个版本库配置，用如下的语法：</p>
<div style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: silver; PADDING-BOTTOM: 4pt; MARGIN: 30pt 21pt; BORDER-LEFT: 1pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: 1pt solid; FONT-FAMILY: 幼圆">[groups]<br>project1_committers = paulex, richard<br>project2_committers = jimmy, michel, spark, tony, Robert<br><br>[repos1:/] <br>* = r <br>@ project1_committer = rw<br><br>[repos2:/] <br>* = r <br>@ project2_committer = rw<br>&nbsp;</div>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">这样项目1的 project1_committer 组只能对 repos1 版本库下的文件具有写权限而不能修改版本库 repos2 ，同样项目2的 project2_commiter 组也不能修改 repos1 版本库的文件。</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<h1 style="TEXT-ALIGN: center">4、FAQ</h1>
<p style="FONT-FAMILY: 幼圆">1、路径或权限不足时将出现错误信息提示：</p>
<p style="FONT-FAMILY: 幼圆">http://localhost （路径不对）<br>Error * PROPFIND request failed on '/' PROPFIND of '/': 200 OK (http://localhost)</p>
<p style="FONT-FAMILY: 幼圆">http://localhost/svn （权限不足） <br>Error * PROPFIND request failed on '/svn' PROPFIND of '/svn': 403 Forbidden (http://localhost)</p>
<p style="FONT-FAMILY: 幼圆">http://localhost/svn/repos （正常显示）</p>
<p style="FONT-FAMILY: 幼圆">http://localhost/repos （权限不允许） <br>Error * PROPFIND request failed on '/repos' PROPFIND of '/repos': 405 Method Not Allowed (http://localhost)</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">2、不启动E:\subversion\bin\svnserve.exe ，但启动了ApacheSVN ，访问（tortoiseSVN &#8211;&gt; Repo &#8211; browser）或提交（SVN Commit）情形如下：</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">现象：svn://localhost/svn/repos 不能访问或提交，提示：Error * Can't connect to host 'localhost': 由于目标机器积极拒绝，无法连接。 但 file:///e:/svn/repos 和 http://localhost/svn/repos 可以访问或提交。</p>
<p style="TEXT-INDENT: 2em; FONT-FAMILY: 幼圆">原因：svn:// 是独立服务器 svnserver 自己的协议。file:/// 是本地访问，即服务器端和客户端在一个机器上。</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">参考资料：<br><a href="http://subversion.tigris.org/"><font color=#1b6d5d><u>Subversion 官方网站</u></font></a>：Subversion 的官方网站，提供最权威的介绍和最新的下载。<br><a href="http://www.subversion.org.cn/svnbook/"><font color=#1b6d5d><u>Subversion 中文手册</u></font></a>：Subversion 简体中文官方网站翻译的中文手册。<br><a href="http://www.subversion.org.cn/tsvndoc/"><font color=#1b6d5d><u>TortoiseSVN 中文文档</u></font></a>：Subversion 简体中文官方网站翻译的 TortoiseSVN 中文文档。<br><a href="http://www.iusesvn.com/"><font color=#1b6d5d><u>我用SVN中文论坛</u></font></a>：国内人气非常旺的 SVN 中文交流论坛。<br>《<a href="http://www.subversion.org.cn/index.php?option=com_content&amp;task=view&amp;id=78&amp;Itemid=9"><font color=#1b6d5d><u>用Apache和Subversion搭建安全的版本控制环境</u></font></a>》：IBM 工程师写的基于 Linux 的 SVN 教程。<br><a href="http://baike.baidu.com/"><font color=#1b6d5d><u>百度百科</u></font></a>：由全体网民共同撰写的百科全书</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">~ 全文完~</p>
<p style="FONT-FAMILY: 幼圆">&nbsp;</p>
<p style="FONT-FAMILY: 幼圆">　　　　　　　　　　印第安</p>
<p style="FONT-FAMILY: 幼圆">　　　　　　2007年12月23日23:37:41　v1.0 初稿<br>　　　　　　2007年12月25日2:24:53　v1.1 更新。更改了几处路径，使之更加便于Win下调试。全文重新排版，阅读条理更清晰。 <br>　　　　　　2008年1月24日11:45:35　v1.2 修订。修改几处书写错误（谢谢山东济南的网易博友242）；修改1个关键配置路径。</p>
<img src ="http://www.cppblog.com/niewenlong/aggbug/65285.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2008-10-28 10:51 <a href="http://www.cppblog.com/niewenlong/archive/2008/10/28/65285.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>svn版本控制</title><link>http://www.cppblog.com/niewenlong/archive/2008/10/28/65284.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Tue, 28 Oct 2008 02:49:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2008/10/28/65284.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/65284.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2008/10/28/65284.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/65284.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/65284.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px dashed; PADDING-RIGHT: 10px; BORDER-TOP: #cccccc 1px dashed; DISPLAY: block; PADDING-LEFT: 10px; FONT-SIZE: 12pt; PADDING-BOTTOM: 10px; BORDER-LEFT: #cccccc 1px dashed; PADDING-TOP: 10px; BORDER-BOTTOM: #cccccc 1px dashed; FONT-FAMILY: 幼圆">
<p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <caption>文档规则 </caption>
    <tbody>
        <tr>
            <td>[本地工作区] ：work copy ，本地工作副本；</td>
        </tr>
        <tr>
            <td>[主项目]：引用共用模块的新项目（工程）</td>
        </tr>
        <tr>
            <td>最新版本（HEAD revision）：版本库里文件或目录的最新版本</td>
        </tr>
        <tr>
            <td>SA ：SVN服务器的管理员</td>
        </tr>
        <tr>
            <td>PRA ：单个项目库的管理员，或者是项目负责人</td>
        </tr>
        <tr>
            <td>User ：普通工作人员</td>
        </tr>
        <tr>
            <td>WC ：work copy ，本地工作副本</td>
        </tr>
    </tbody>
</table>
</p>
<p><br><strong>1. 版本控制原则</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;SVN（或者其他版本控制软件）只是一个版本控制的辅助工具，不可能把所有的问题都自动解决掉。尤其，对于冲突这个麻烦事儿，项目成员在项目进程中要尽量通过优化流程来解决，而不是将希望寄托于软件工具来自动解决一切问题。<br>建议的开发过程组织：<br>&nbsp;&nbsp;&lt;1&gt;. 随行就市&gt;<br>项目刚开始阶段，单独开发；项目稳定阶段，完整开发。项目开发初期，各个项目成员负责自己的文件夹（或者模块），与SVN服务器间的更新、提交等操作只需 要针对自己负责的文件夹（或者模块）就行了，他人的文件夹（或者模块）可以不必关心；项目稳定阶段，也就是每天的变更量很小了，所有项目成员与SVN服务 器的更新、提交等操作需要针对项目的所有文件夹（或者模块），各个项目成员在其本地编译时本地工作区的全部项目程序（或者资料）均为最新的版本，保证项目 作为整体能够顺利运行。<br>&nbsp;&nbsp; &lt;2&gt;. 能躲就躲<br>尽量保证一份文件只有一个项目成员在编辑。举例说明：程序员A负责底层中文件 DBAccess.cs的编写，如果程序员B的工作要求他为DBAccess.cs增加两个方法，程序员B应该通知程序员A来增加而不是自己增加；如果此 时A非常繁忙需要B自己增加，就需要B先更新本地的DBAccess.cs，然后开始修改，修改完成后立即提交并通知A更新本地的文件，通过缩短提交间隔 来减少冲突。<br><strong>2. 基于版本控制的开发流程</strong><br><img alt="" src="http://www.qudee.com/scv20071110/images/tech/1.gif"><br>版本控制下的软件开发基本流程<br><span class=STYLE1>注意：</span>上述的流程中没有考虑测试和审核的步骤。<br><strong>3.各阶段中svn的使用方法介绍</strong><br>&lt;1&gt;.安装后的常规设置<br>&nbsp;&nbsp;(1). 中文界面的设置<br>将TortoiseSVN的操作语言设置为中文，控制文件夹使用&#8220;_SVN&#8221;以便支持Asp.net项目。<br><img alt="" src="http://www.qudee.com/scv20071110/images/tech/2.gif"><br>&nbsp;&nbsp;(2).忽略文件<br>&nbsp;&nbsp;为防止在提交操作时将不必要的文件上传到SVN服务器上，可将项目中不需要受SVN控制的文件和文件夹通过设置忽略选项的方式排除掉。常被忽略的文件 有 _* obj *.db *.resharper* *.Load *.pdb *.bak。可以根据实际需要来修改忽略参数， 每个需要忽略的文件（文件夹）名称之间用空格作分隔符，需要忽略的文件夹只要写文件夹名称就行，例如 obj，忽略obj文件夹及所包含文件；_*忽略所有_（下划线）开头的文件夹及所包含文件。注意，这个设置仅对本机有效，而且对本机的所有项目的本地工 作区有效，对其他项目组成员没有影响。被忽略的文件仍可以通过&#8220;添加&#8221;命令使其受SVN控制。<br><br>操作界面如下图，只需将忽略参数填写在&#8220;全局忽略模式&#8221;后的文本框中即可。 <br><img alt="" src="http://www.qudee.com/scv20071110/images/tech/3.gif"><br>&nbsp;&nbsp;(3).配置强制注释<br>&nbsp;&nbsp;项目负责人通过设置项目的TortoiseSVN:logminisize设置为5，以便强制注释。设置方法：在项目的本地工作区文件夹上点击鼠标右 键选择&#8220;属性&#8221;，进入 Subversion标签，选中TortoiseSVN: logminisize，确保复选框&#8220;递归应用该属性&#8221;选中，取值设为5，其意思是指提交的注释最短长度为五个字。注意，这个设置对其他项目成员的也有 效，但是对别的SVN客户端工具（如AnkhSVN）无效。 <br>&lt;2&gt;. 初始化版本库<br>初始化版本库有两种常用的方式：<br>&nbsp;&nbsp;1. 直接&#8220;导入Import&#8230;&#8221;<br>对要执行导入操作得项目文件夹进行如下清理：<br>&nbsp;&nbsp;&nbsp;&nbsp;(1). 把项目中不需要的文件删除。（临时文件、编译器创建的文件，比如*.obj、二进制文件等。）<br>&nbsp;&nbsp;&nbsp;&nbsp;(2). 把文件夹和子文件夹中的所有文件整理一遍。虽然你可以在导入之后再来进行重命名或删除等操作，但是还是推荐你在导入之前把你的项目整理好。<br>在资源管理器（windows explorer）中选择项目(本地硬盘上)的根文件夹，单击鼠标右键，选择导入Import&#8230;命令，跳出一个对话框：<br><img alt="" src="http://www.qudee.com/scv20071110/images/tech/4.gif"><br>&nbsp;&nbsp;在这个对话框中你需要填写你要将项目导入仓库的URL地址（svn必须小写）。导入信息（Important Message）是用来记录日志信息的。注意：与&#8220;忽略样式exclude pattern&#8221;匹配的文件或文件夹不会被导入，除非选择了&#8220;包含忽略的文件&#8221;选项。<br>按下&#8220;确定&#8221;按钮后，TortoiseSVN就开始把整个文件夹树（包括所有文件）导入到仓库。用来做&#8220;导入Import&#8221;操作的这个文件夹的名字不会出 现在仓库中，只有文件夹中的内容会出现。注意：刚才用来做&#8220;导入Import&#8221;操作的这个文件夹并没有处于版本控制下！要获取一份处于版本控制之下的[本 地工作区]副本，你需要对刚导入的版本做一次&#8220;检出Checkout&#8221;操作。<br>&nbsp;&nbsp;2.&#8220;检出Checkout&#8221;—&gt;&#8220;提交Commit&#8221;<br>新建一个空文件夹作为[本地工作区]的存放文件夹（建议与项目同名），在文件夹上（或者文件夹里）单击鼠标右键后在命令菜单中选择&#8220;检出Checkout&#8230;&#8221;，出现操作窗口。注意：只能检出Checkout到一个空文件夹。<br><img alt="" src="http://www.qudee.com/scv20071110/images/tech/5.gif"><br>&nbsp;&nbsp;把本地硬盘上的项目文件夹中的内容（不要复制项目的根文件夹）全部复制到[本地工作区] 文件夹中，并对文件夹中进行清理操作（同&#8220;导入Import&#8221;操作前的清理操作）。然后选择[本地工作区] 文件夹单击鼠标右键跳出菜单，选择命令&#8220;提交Commit&#8230;&#8221;：<br><img alt="" src="http://www.qudee.com/scv20071110/images/tech/6.gif"><br>提交对话框会显示每一个有修改的文件，包括新增的，删除的，还有没有版本控制的。如果不想&#8220;提交Commit&#8221;某个有变更的文件，只需取消勾选那个文件即可。相反，如果要提交某个未受版本控制的文件，只需勾选它就可以然后&#8220;提交Commit&#8221;即可。<br>&nbsp;&nbsp;3.日常开发中的SVN操作<br><img alt="" src="http://www.qudee.com/scv20071110/images/tech/7.gif"><br><br>0.版本号的解释<br>SVN系统中的版本号准确应该叫做&#8220;修订版本号&#8221;，每当版本库接受了一个提交Commit，文件系统进入了一个新的状态，叫做一次修订（revision），每一个修订版本被赋予一个独一无二的、递增的自然数，这个自然数就是修订版本号。<br>受控项目中任何一个受控文件/文件夹进行了修改提交Commit操作，项目的版本号就会提升一次，没有进行修改的文件/文件夹其版本号不会发生变化。受控 项目每一个装态都包含项目的所有文件/文件夹，引起该次版本号增加的即修改了的文件/文件夹保存新副本，没有发生修改的文件/文件夹保存引用，因此项目中 的文件/文件夹可能与项目的版本号不同。<br><br>0.更新(Update)工作副本<br><img alt="" src="http://www.qudee.com/scv20071110/images/tech/8.gif"><br>&nbsp;&nbsp;把他人做的修改融合到自己的本地副本当中，这个把改动从服务器拿到本地的过程就是&#8220;更新Update&#8221;。&#8220;更新Update&#8221;操作可以针对一个文件， 或几个被选择的文件，或某个文件夹中的所有文件。选择想要进行&#8220;更新Update&#8221;操作的文件和（或）文件夹，单击鼠标右键，在菜单中选择&#8220;更新 Update&#8221;， 执行窗口显示正在&#8220;更新Update&#8221;的进度。他人做的修改会合并到自己的文件中，而自己所做的修改会被保留。如果不能合并，将会出现冲突（红色文字显 示），冲突的文件图标将出现标志。<br>命令 &#8220;更新至版本Update to Revision...&#8221; 可以使[本地工作区]更新到自己选择的一个特定版本。<br><br>0.解决冲突<br>&nbsp;&nbsp;选择<img alt="" src="http://www.qudee.com/scv20071110/images/tech/0.gif">的文件，点击鼠标右键菜单中选择&#8220;编辑冲突Edit Conflict&#8221;来打开合并工具或冲突编辑器，做一些必要的修改，然后保存文件。然后选择菜单中的&#8220;已解决的Resolved&#8221;命令执行，接着提交commit修改到仓库。<br>注意：命令&#8220;已解决的Resolved&#8221;并没有真正的解决冲突，它只不过是把&#8220;文件名称.扩展名.mine&#8221; 和 &#8220;文件名称.扩展名.r*&#8221;（r*中星号代表任意位数字，即版本号）删除，并允许你提交修改而已。因此，建议在有冲突发生时要先执行&#8220;编辑冲突Edit Conflict&#8221; 再执行&#8220;已解决的Resolved&#8221;；如果确信自己的修改是正确的，不需要保留他人的修改，可将文件名称.扩展名.mine去掉&#8220;.mine&#8221;后缀，并把 &#8220;.r*&#8221;后缀的文件和&#8220;<img alt="" src="http://www.qudee.com/scv20071110/images/tech/0.gif">&#8221;的文件删除，然后正常&#8220;提交Commit&#8221;，版本库中将保存自己的版本。<br><br>0.提交修改到仓库<br><img alt="" src="http://www.qudee.com/scv20071110/images/tech/9.gif"><br>&nbsp;&nbsp;强烈建议在提交之前，应该确认[本地工作区] 是最新的。可以直接作一次&#8220;更新Update&#8221;操作，或者先&#8220;检查更新Check for Modifications&#8221;看看在本地或在服务器上哪些文件修改过。如果没有这样的操作直接提交的话，很有可能出现冲突现象。&#8220;检查更新Check for Modifications&#8221;操作后的结果界面如下： <br><img alt="" src="http://www.qudee.com/scv20071110/images/tech/10.gif"><br>&nbsp;&nbsp;如果[本地工作区] 是最新的，并且没有冲突，就可以提交你的修改了。选中你想要提交的任意文件或文件夹，然后选择在菜单中选择&#8220;提交Commit&#8230;&#8221;在提交对话框中双击一个 有修改的文件，可以启动外挂的比较工具来显示修改细节。 在按下&#8220;确定OK&#8221;按钮之后，会显示提交的进程情况。<br><br>0.比较差异(Diff)<br><img alt="" src="http://www.qudee.com/scv20071110/images/tech/11.gif"><br>&nbsp;&nbsp;[本地工作区] 修改后，被修改的文件出现<img alt="" src="http://www.qudee.com/scv20071110/images/tech/0_2.gif">标志，选择 &#8220;比较差异Diff&#8221; 命令，可以查看该文件与版本仓库中文件具体差异，选择命令后出现对应的差异察看窗口。 <br><br>0.加入(Add)新文件/新文件夹<br><img alt="" src="http://www.qudee.com/scv20071110/images/tech/12.gif"><br>&nbsp;&nbsp;想把在开发过程中创建的新文件/文件夹加入到SVN控制之下，可以这样做：选中文件/文件夹（在新文件/文件夹所在父文件夹点击右键），然后在菜单中选择&#8220;添加Add&#8221;命令。不需要受SVN控制的文件请取消钩选。 <br><img alt="" src="http://www.qudee.com/scv20071110/images/tech/13.gif"><br>在把文件或文件夹加入到控制之下后，这些文件或文件夹就会显示为一个Added覆盖<img alt="" src="http://www.qudee.com/scv20071110/images/tech/0_1.gif">图标的样子，接下来必须对[本地工作区] 执行提交commit操作，以便其他团队成员能够看到这些文件或文件夹。<br><br>0.删除、重命名、移动<br>选择要删除（或重命名）的文件/文件夹，点击鼠标右键选择相应命令： <br><img alt="" src="http://www.qudee.com/scv20071110/images/tech/14.gif"><br>&nbsp;&nbsp;如果使用TortoiseSVN的&#8220;删除Delete&#8221;操作删除了一个文件/文件夹，文件就已经从[本地工作区]中删除了，而被&#8220;删除Delete&#8221; 的文件夹将显示为覆盖图标。要恢复被&#8220;删除Delete&#8221;文件/文件夹，只需对他的上级文件夹进行&#8220;SVN还原revert&#8221;操作即可。<br>如果要在[本地工作区]内移动文件，可以使用鼠标来拖拽：<br>&nbsp;&nbsp;&nbsp;&nbsp;1．选中要移动的文件或文件夹。<br>&nbsp;&nbsp;&nbsp;&nbsp;2．用鼠标右键拖拽他们到[本地工作区]中一个新的文件夹。<br>&nbsp;&nbsp;&nbsp;&nbsp;3．松开鼠标右键。<br>&nbsp;&nbsp;&nbsp;&nbsp;4．在跳出的菜单中选择相应命令，如下图： <br><img alt="" src="http://www.qudee.com/scv20071110/images/tech/15.gif"><br>&nbsp;&nbsp;如果一个删除操作不是使用TortoiseSVN的&#8220;删除Delete&#8221;操作完成的，而是就像平常删除文件那样删除的。提交时，对话框窗口还是会显示 这些删除的文件，并提示自己把它们从版本控制下删除。所以如果忘记使用TortoiseSVN&#8220;删除Delete&#8221;操作来删除这些文件，仍可在这里补上。<br><br>0.取消改变(revert)<br>&nbsp;&nbsp;如果要取消对一个文件/文件夹所做的修改，只需用鼠标右键单击该文件/文件夹，选择TortoiseSVN子菜单中的&#8220;SVN还原revert&#8221;命 令，在操作窗口中会显示需要还原的文件/文件夹，勾选文件/文件夹后按下&#8220;确定OK&#8221;按钮即可。注意这里所做的取消修改只能返回到该文件/文件夹上次&#8220;更 新Update&#8221;后的状态。<br><img alt="" src="http://www.qudee.com/scv20071110/images/tech/16.gif"><br><br>0.修订日志窗口<br>&nbsp;&nbsp;每一次修改和提交，都应该做好日志记录。这样开发过程中就有了一个详细的记录，以后便可找出每一个修改是如何修改以及为什么这样修改的。 日志对话框会显示所有日志信息。显示分成3个部分：<br>&nbsp;&nbsp;&nbsp;&nbsp;1.最上面部分显示的是所有被提交的版本列表。显示有日期时间、提交者、修订版本号和日志信息的前面一部分。用蓝色显示的行表示有某些文件被复制到了这个版本。（也许是从一个分支来的）<br>&nbsp;&nbsp;&nbsp;&nbsp;2.中间部分显示的是选中版本的所有日志信息。<br>&nbsp;&nbsp;&nbsp;&nbsp;3.底部显示的是选中版本所做修改的文件和文件夹列表。<br>还不仅仅是这些，对话框中还提供了很多的菜单命令可以使用。<br><img alt="" src="http://www.qudee.com/scv20071110/images/tech/17.gif"><br><br>0.文件库浏览器<br>&nbsp;&nbsp;选择&#8220;文件库浏览器&#8221;菜单，就可以打开Subversion服务器上版本库的结构，并可以对版本库中的文件/文件夹进行操作，如下图： <br><img style="WIDTH: 552px; HEIGHT: 433px" height=433 alt="" src="http://www.qudee.com/scv20071110/images/tech/18.gif" width=552></p>
</div>
<img src ="http://www.cppblog.com/niewenlong/aggbug/65284.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2008-10-28 10:49 <a href="http://www.cppblog.com/niewenlong/archive/2008/10/28/65284.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开始使用svn(subversion) </title><link>http://www.cppblog.com/niewenlong/archive/2008/10/28/65283.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Tue, 28 Oct 2008 02:41:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2008/10/28/65283.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/65283.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2008/10/28/65283.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/65283.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/65283.html</trackback:ping><description><![CDATA[<span style="FONT-FAMILY: 幼圆">&nbsp;&nbsp;&nbsp; windows下的客户端推荐使用TortoiseSVN。TortoiseSVN是windows平台下最经典的SVN客户端,操作及其简便直观,直接跟windows系统结合,通过文件/文件夹右键菜单方式进行管理您的项目.不过我喜欢用它的命令行，因为以前用CVS的时候就是用命令行，而SVN的命令行方式几乎和CVS是一样的，所以很快上手了。<br><br>&nbsp;&nbsp;&nbsp; 从</span><a title=http://subversion.tigris.org style="FONT-FAMILY: 幼圆" href="http://subversion.tigris.org/">http://subversion.tigris.org</a><span style="FONT-FAMILY: 幼圆">获取subversion for windows的版本，安装之后就有了svn.exe这个基于命令行的客户端工具。当然服务器端的程序也有了，这里就不关心如何配置SVN服务了。安装程序把svn.exe的路径加入了path环境变量,我们已经可以在命令行中直接输入svn就可以使用了。</span><br><br><span style="FONT-FAMILY: 幼圆">如果你不知道命令怎么用svn命令,可通过如下方式查询：<br>svn help<br>知道了子命令，但是不知道子命令的用法，还可以查询：<br>svn help ci <br><br>开发人员常用命令<br><br>导入项目<br>svn import http://svn.chinasvn.com:82/pthread --message "Start project"<br><br>导出项目<br>svn checkout http://svn.chinasvn.com:82/pthread<br><br>采用 export 的方式来导出一份&#8220;干净&#8221;的项目<br>svn export http://svn.chinasvn.com:82/pthread pthread<br><br>为失败的事务清场<br>svn cleanup<br><br>在本地进行代码修改，检查修改状态<br>svn status -v<br>svn diff<br><br>更新(update)服务器数据到本地<br>svn update directory<br>svn update file<br><br>增加(add)本地数据到服务器<br>svn add file.c<br>svn add dir<br><br>对文件进行改名和删除<br>svn mv b.c bb.c<br>svn rm d.c<br><br>提交(commit)本地文档到服务器<br>svn commit<br>svn ci<br>svn ci -m "commit"<br><br>查看日志<br>svn log directory<br>svn log file<br><br>相关的一些东西：<br>1、在本地文件中，每个目录下都有一个.svn文件夹(属性为隐藏)，保存了相关的信息。<br>2、注册环境变量SVN_EDITOR为"E:\Program Files\Vim\vim71\gvim.exe"，结果在svn ci的时候，出现错误:<br><br>'E:\Program' 不是内部或外部命令，也不是可运行的程序<br>或批处理文件。<br>svn: 提交失败(细节如下):<br>svn: system('E:\Program Files\Vim\vim71\gvim.exe svn-commit.tmp') 返回 1<br><br>把SVN_EDITOR改为"gvim.exe"，并且在path中添加路径"E:\Program Files\Vim\vim71\",这样就可以在提交的时候用vim编写注释了。<br><br>附:<br>提供免费SVN服务的网站:<br></span><a title=http://www.svnhost.cn/ href="http://www.svnhost.cn/"><span style="FONT-FAMILY: 幼圆">http://www.svnhost.cn/</span></a><span style="FONT-FAMILY: 幼圆">(推荐)<br></span><a title=http://www.chinasvn.com href="http://www.chinasvn.com/"><span style="FONT-FAMILY: 幼圆">http://www.chinasvn.com</span></a><br><a title=http://www.javaforge.com href="http://www.javaforge.com/"><span style="FONT-FAMILY: 幼圆">http://www.javaforge.com</span></a><br><a title=http://unfuddle.com href="http://unfuddle.com/"><span style="FONT-FAMILY: 幼圆">http://unfuddle.com</span></a><br><a title=http://svn.coollittlethings.com/index.php href="http://svn.coollittlethings.com/index.php"><span style="FONT-FAMILY: 幼圆">http://svn.coollittlethings.com/index.php</span></a><span style="FONT-FAMILY: 幼圆">(针对开源免费，针对私人项目收费)<br></span>
<img src ="http://www.cppblog.com/niewenlong/aggbug/65283.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2008-10-28 10:41 <a href="http://www.cppblog.com/niewenlong/archive/2008/10/28/65283.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SVN-Subversion快速指南</title><link>http://www.cppblog.com/niewenlong/archive/2008/10/28/65282.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Tue, 28 Oct 2008 02:32:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2008/10/28/65282.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/65282.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2008/10/28/65282.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/65282.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/65282.html</trackback:ping><description><![CDATA[<p class=cc-lisence style="FONT-SIZE: 14pt; LINE-HEIGHT: 180%; FONT-FAMILY: 幼圆" minmax_bound="true"><a href="http://creativecommons.org/licenses/by/3.0/deed.zh" target=_blank minmax_bound="true"><u><font color=#0000ff>版权声明</font></u></a>：转载时请以超链接形式标明文章原始出处和作者信息及<a href="http://bangzhuzhongxin.blogbus.com/logs/11205960.html" target=_blank minmax_bound="true"><font color=#0000ff><u>本声明</u></font></a><br minmax_bound="true"><a href="http://egeho123.blogbus.com/logs/18119163.html" minmax_bound="true"><u><font color=#810081>http://egeho123.blogbus.com/logs/18119163.html</font></u></a><br minmax_bound="true"><br minmax_bound="true"></p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">Subversion快速指南</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">Subversion（简写为SVN）作为开源社区贡献的新一代版本控制系统，已经得到越来越广泛的使用。我用过CVS（Concurent Version System，SVN的前身）和微软的VSS（Visual SourceSafe），相比之下，SVN具有更强大的功能和更简单的操作特性。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">网上已有一些文章介绍SVN的安装和使用，不过我在第一次配置时仍然遇到了几个问题。这里，我按照自己的思路来进行讲解，以期对那些初次使用SVN并且对一些问题存在疑问的朋友有所帮助。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">1. SVN简介</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">光说SVN好，那SVN究竟有什么优点呢？在SVN的手册里有着详细的说明，下面简单介绍几个重要方面：</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">1) 基于目录的版本控制</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">传统的CVS或VSS都是基于单个文件进行版本控制的，这实际上满足不了实际需求，因为在实际应用中，我们都希望按照项目或者工程进行管理，例如假设我们想要取出某个历史时间点的整个项目文件，那么基于文件的版本控制系统就存在弊端，只能单个单个文件的处理。而SVN则能很方便的做到这一点，你可以随意的取出任何一个文件、任何一个目录的任何一个历史版本。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">SVN还允许对文件和目录进行增加、删除以及复制和重命名等操作，这些都会被记录到历史信息中，实现真正的版本控制功能。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">2) 原子提交</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">SVN里的每次操作都是原子的，要么全部成功，要么全部失败。假设你要提交多个文件，如果有一个存在冲突，那么其它修改都不会被提交。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">3) 高效的分支（branching）与标签（tagging）功能</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">先说标签功能，通俗的讲，标签就是某个时间点的快照（snapshot），我们可以在项目进行到一些重要的里程碑之时为之建立标签，这样可以方便以后随时取出这些历史版本。我想你会有一个疑问：SVN不是本身就有随意取出任何一个历史版本的功能吗？是的，标签的作用主要是为了给这些特定的历史版本取一个友好的名字，以方便使用和维护。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">分支则是用于创建多个并行的工作线，比如，当我们的一个项目需要为某个用户提供一些特殊的功能时，那么就可以为之创建一个分支，这样能够保正大部分代码的共用，也使得整个项目变得容易维护和管理。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">SVN对于分支和标签的实现都是一样的，并且采用了与Unix/Linux硬链接（Hard-Link）类似的机制，即是说，当我们创建分支或标签时，SVN并不会立即为之创建一份拷贝，而是创建一个链接，只有当这些文件以后被修改时才会真正产生一份副本。这种&#8220;缓式拷贝&#8221;方法是一种常见的优化方法，能够有效的节约空间。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">那分支和标签又有什么不同呢？不同之处仅仅在于其&#8220;约定成俗&#8221;的含义，标签意味着你不会再对其进行修改，而分支意味着你会对它进行开发。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">4) 多种访问方式</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">SVN提供了一个抽象的网络访问层，可以通过不同的协议来对其进行访问。首先，SVN提供了自定义的svn协议访问方式，通过形如svn://host/repository的URL就能使用。再有，SVN还提供了与Apache Web服务器相集成的功能，这样，我们就可以通过<a href="http://host/repository" minmax_bound="true"><font color=#005880 minmax_bound="true"><u>http://host/repository</u></font></a>的方式来访问SVN了。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">5) 对二进制文件的支持</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">CVS虽然对二进制文件也有支持，但实现得并不完善，你或许遇到过文本文件里有中文字符而被认为是二进制文件的事情，SVN则提供了对二进制文件全面的支持，使得非文本文件也能跟文本文件一样进行良好的版本控制。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">6) Windows下与资源管理器集成的客户端：TortoiseSVN</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">SVN本身只提供命令行的操作方式，TortoiseSVN是第三方开发的图形化界面，它的出现使Windows下的版本管理变得非常方便。不过，由于是嵌入到资源管理器中，它可能会影响系统的速度——微乎其微，你可以自己评测一下。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">7) 平台无关</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">SVN秉承了开源软件的一贯优点，无论是Windows还是Linux平台，都可以相互访问SVN服务器。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">&nbsp;</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">如果你过去是VSS用户，那么这里还要提一点，与VSS相比，SVN还有一个理念不一样，VSS将版本冲突控制放在操作之前，你要操作某个项目必须先执行CheckOut以进行锁定、防止他人同时修改。SVN提供了同样的Lock功能，但通常情况下，我们只需各自独立的进行修改而无需锁定项目，如果有冲突在提交的时候再做处理，也就是说，SVN是将冲突控制放在操作之后、提交之时。也许你会觉得VSS更合理，但实际情况却相反，因为在我们的实际使用中经常发生有人将整个项目CheckOut后忘了CheckIn，或者未选择Recursive忘了将子目录中的文件CheckIn，这就让其他人无法修改，于是不得不人为的通知其本人，非常麻烦。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">&nbsp;</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">2. SVN服务器搭建</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">本节是针对管理员写的，普通用户可以跳过本节。我这里只以Windows上的安装为例，Linux上可按类似方式进行（有些配置参数会存在差别，具体参考帮助手册）。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">1) 安装SVN服务器</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">a. 下载</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">SVN的官方网站为<a href="http://subversion.tigris.org/" minmax_bound="true"><font color=#005880 minmax_bound="true"><u>http://subversion.tigris.org/</u></font></a>，当前最新版本为1.4.2。Windows下的二进制安装包分为两种，一种是以setup结尾的安装文件，另一种是普通的压缩包文件，setup文件会自动注册一些信息，比如环境变量以及服务等，这些都是可以自己手动实现的。在我写这篇文章时，官方网站上就只有普通二进制文件，估计setup文件稍晚些时候会出来。特别注意，下载时要详细阅读注意事项，看清与之配套的软件的版本号，避免出现问题。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">我选择的版本为svn-win32-1.4.2.zip</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">b. 安装</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">将svn-win32-1.4.2.zip解压缩到安装目录下，我选择的是C:/Program Files/Subversion，如果是setup文件，直接运行安装文件即可。对于压缩包，我们可以将bin路径添加到系统环境变量中，以方便操作。可以看到，bin目录下主要有如下几个文件：</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">svnadmin：仓库管理工具，包括创建、修复和备份等操作。<br minmax_bound="true">svnlook：仓库查看工具，包括信息、日志和锁定状态等内容，不会造成仓库的改动。<br minmax_bound="true">svnserve：svn服务程序，允许通过svn网络协议来访问仓库。<br minmax_bound="true">svn：SVN客户端，用于访问仓库，对项目进行版本管理。<br minmax_bound="true">svnversion：客户端工具，用于查看本地拷贝的修订信息。<br minmax_bound="true">c. 创建仓库（Repository）</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">SVN是以仓库为版本控制单位的，一个SVN服务器可以管理多个仓库，每个仓库拥有独立的修订号（REVISION），仓库中的任何一次更新都会带来修订号的递增。你可以根据需要选择建立一个或者多个仓库，这里，我以创建多个仓库为例子，假设我们将仓库都放到D:/SVN_REPOS目录下，下面的命令将会在该目录下创建一个Test仓库：</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">svnadmin create D:/SVN_REPOS/Test <br minmax_bound="true">如果创建成功，D:/SVN_REPOS/下将会多一个Test目录。 <br minmax_bound="true">2) 搭建svnserve访问方式</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">svn和http是两种并列的访问方式，你可以选择其中一种，也可以都采用。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">a. 注册服务</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">为了让SVN服务程序每次开机后自动运行，我们需要将其注册为服务。在控制台中执行如下命令：</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">sc create svnservice binPath= "\"C:\Program Files\Subversion\bin\svnserve.exe\" --service -r D:/SVN_REPOS" start= auto <br minmax_bound="true">注意，上述命令均在一行中。sc.exe是Windows 2000以后系统自带的一个工具，2000下没有，可以从XP上拷过来。svnservice为服务名称，后面的参数格式有严格要求，等号前面没有空格而后面有。binPath本身带有多个参数，因此用引号括起来，而由于路径里面又有空格，因此又加上了一层引号。 --service和-r均为svnserve.exe的参数，前者要求它作为服务运行，后者指明了仓库的根路径（多仓库为仓库的父目录）。 <br minmax_bound="true">带安装包的SVN会自动注册服务，这时我们可能需要修改-r参数，命令如下：</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">sc config svnservice binPath= "\"C:\Program Files\Subversion\bin\svnserve.exe\" --service -r D:/SVN_REPOS"<br minmax_bound="true">b. 访问</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">注册完后，通过运行sc start svnservice或者服务管理器（service.msc）启动服务。<br minmax_bound="true">接下来，我们就可以通过下面的命令来测试系统是否工作正常：</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">svn info svn://localhost/Test<br minmax_bound="true">如果正确的显示出仓库的相关信息，那么就大功告成了，否则请检查服务的参数是否配置正确，比如，如果未在服务参数中指定正确的-r值，就会得到如下错误：</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">No repository found in 'svn://localhost/Test'<br minmax_bound="true">如果安装了TortoiseSVN，则可以直接在浏览器中输入svn://localhost/Test，这样会调出TortoiseSVN的Repos-Browser。到此，你就可以通过TortoiseSVN来导入工程进行版本管理了（参见后文）。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">c. 权限配置</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">在进行权限配置前，所有的用户都能进行任何操作，在很多情况下是不允许的。在创建仓库时，仓库目录下都会生成好几个文件夹，其中conf里面存储的是配置信息，包括三个文件：</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">authz：访问权限配置<br minmax_bound="true">passwd：用户名和密码配置<br minmax_bound="true">svnserve.conf：基本配置信息<br minmax_bound="true">先配置svnserve.conf，将里面几项配置前的注释去掉，最后的内容如下：</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">[general]<br minmax_bound="true">anon-access = read<br minmax_bound="true">auth-access = write<br minmax_bound="true">password-db = passwd<br minmax_bound="true">authz-db = authz <br minmax_bound="true">这些参数的含义文件里都有详细说明，其中，anon-access和auth-access分别是对匿名用户以及认证用户的访问控制，password-db指明用户密码文件路径，authz-db指明权限配置文件路径。另外还有一个参数realm用于指明仓库所属的认证域，默认情况下每个仓库位于不同的域（每个仓库有一个唯一的uuid），因此我们可以不设置该项，除非多个仓库需要共用同一份passwd配置。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">passwd文件的配置很简单，格式如下（等号前面为用户名，后面为密码）：</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">[users]<br minmax_bound="true">harry = 123<br minmax_bound="true">sally = 123<br minmax_bound="true">guest = 123 <br minmax_bound="true">authz则可以创建用户组并精确配置某个用户或用户组对某个文件或目录的访问权限，下面是一个例子：</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">[groups]<br minmax_bound="true">harry_and_sally = harry,sally <br minmax_bound="true">&nbsp;</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">[/]<br minmax_bound="true">* = r</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">[/project1]<br minmax_bound="true">* =<br minmax_bound="true">harry = rw<br minmax_bound="true">sally = r</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">[/project1/foo]<br minmax_bound="true">sally = </p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">[/project2]<br minmax_bound="true">@harry_and_sally = rw<br minmax_bound="true">guest = r</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">文件内容其实很简单易懂，groups用于定义用户组，后面便是对资源的具体访问控制，/表示仓库根目录，*表示所有用户，用户组前面需加上@符号，r表示可读，w表示可写，等号右边为空则表示没有权限。注意对于目录结构，当用户访问某个资源时，SVN会先看有没有直接针对该资源的访问控制，如果没有找到，则会继承上一级目录的访问权限，如此递推。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">再提一点，当我们有多个仓库时，我们会发现这些仓库的用户帐号在大多数情况下都是相同的，因此，我们可以将passwd文件放到公共的地方，然后将所有仓库的password-db配置都指向该文件。相应的，authz-db也可以共用一个文件，不过需要在配置具体的访问控制时指明所属的仓库，如下：</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">[/]<br minmax_bound="true">* = r <br minmax_bound="true">&nbsp;</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">[repos1:/project1]<br minmax_bound="true">* = r<br minmax_bound="true">harry = rw</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">[repos2:/project1]<br minmax_bound="true">* = r<br minmax_bound="true">sally = rw</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">上述配置表明，所有人对所有仓库的根目录都有读权限，但只有harry对仓库repos1里的project1有读写权限，只有sally对仓库repos2里的project1有读写权限。 <br minmax_bound="true">3) 搭建HTTP访问方式</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">SVN可以通过Apache实现Web访问方式，但这不是必需的，除非你有此需求。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">a) 下载</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">Apache的官方网站为<a href="http://www.apache.org/" minmax_bound="true"><font color=#005880 minmax_bound="true"><u>http://www.apache.org/</u></font></a>，注意不要使用最新的2.2.x，而要选择2.0.x，这一点在SVN官方网站上有特别说明，当初我就没有注意到这一点，而导致Apache2.2启动时无法加载SVN的模块，出现&#8220;perhaps this is not an Apache module DSO&#8221;错误。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">我下载的版本为apache_2.0.59-win32-x86-no_ssl.msi</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">b) 安装和注册</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">执行Apache安装程序。由于2.0的版本不会自动注册为服务，因此我们需要手工处理。运行cmd.exe，进入apache安装目录下的bin文件夹，执行如下命令即可：</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">apache -k install<br minmax_bound="true">更多的命令可以通过apache help查看。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">注册完后，就可以通过系统托盘里的Apache Monitor来启动服务。如果80端口未被占用，那么服务器应正常启动，通过<a href="http://127.0.0.1/" minmax_bound="true"><font color=#005880 minmax_bound="true"><u>http://127.0.0.1</u></font></a>就能看到Apache的测试页面。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">c) 配置</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">Apache是通过conf目录中的httpd.conf文件进行配置的，比如，默认的监听端口为80，在文件中搜索Listen 80，将80改成你所需的其它端口即可。配置完后必须重起Apache才能生效。更多关于Apache的配置说明请参见其帮助手册或google之。下面网站为帮助手册的中文版本。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">为了让Apache支持SVN，比如增加一些配置项，一个典型的配置如下：</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true"># 加载mod_dav模块，它是对WebDAV（Web-based Distributed Authoring and Versioning）协议的支持，由Apache自带<br minmax_bound="true">LoadModule dav_module modules/mod_dav.so</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">&nbsp;</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true"># 加载mod_dav_svn模块，它与mod_dav通信，使Apache支持SVN，它位于SVN的bin目录下。<br minmax_bound="true">LoadModule dav_svn_module "D:/Program Files/Subversion/bin/mod_dav_svn.so"</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">&nbsp;</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true"># 加载mod_authz_svn模块，用于进行权限管理<br minmax_bound="true">LoadModule authz_svn_module "D:/Program Files/Subversion/bin/mod_authz_svn.so"</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">&nbsp;</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true"># 配置SVN的访问路径以及相关相关参数<br minmax_bound="true">&lt;Location /svn/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 通过<a href="http://host/svn/" minmax_bound="true"><font color=#005880 minmax_bound="true"><u>http://HOST/svn/</u></font></a>访问SVN服务器<br minmax_bound="true">&nbsp;&nbsp;&nbsp; DAV svn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 必需<br minmax_bound="true">&nbsp;&nbsp;&nbsp; SVNParentPath D:/SVN_REPOS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 说明D:/SVN_REPOS下的所有目录均为仓库<br minmax_bound="true">&nbsp;&nbsp;&nbsp; SVNListParentPath on&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 在网页中列出D:/SVN_REPOS下的所有仓库<br minmax_bound="true">&nbsp;&nbsp;&nbsp; <br minmax_bound="true">&nbsp;&nbsp;&nbsp; AuthType Basic&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 基本的用户名密码验证方式<br minmax_bound="true">&nbsp;&nbsp;&nbsp; AuthName "SVN REPOS"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 认证名称，作提示用<br minmax_bound="true">&nbsp;&nbsp;&nbsp; AuthUserFile D:/SVN_REPOS/users&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 用户名密码文件<br minmax_bound="true">&nbsp;&nbsp;&nbsp; AuthzSVNAccessFile D:/SVN_REPOS/authz&nbsp;&nbsp;&nbsp; # 权限控制文件</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">&nbsp;&nbsp;&nbsp; Require valid-user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 只有通过认证才能访问网页<br minmax_bound="true">&lt;/Location&gt;</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">&nbsp;</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true"># 重定向处理，用于将<a href="http://host/svn" minmax_bound="true"><font color=#005880 minmax_bound="true"><u>http://HOST/svn</u></font></a>地址重定向为<a href="http://host/svn/" minmax_bound="true"><font color=#005880 minmax_bound="true"><u>http://HOST/svn/</u></font></a><br minmax_bound="true">RedirectMatch ^(/svn)＄ ＄1/</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">下面对几个重要的地方作以说明：</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">i. 网上很多文章提到将mod_dav_svn.so和mod_authz_svn.so两个文件直接拷贝到Apache的modules目录下，当初我按照这种方法做时结果在一台Windows 2000 Server上无法启动Apache服务，为此折腾了半天。后来才明白，这些模块文件其实就是一些动态链接库，它需要依赖SVN的bin目录下的其它几个dll文件（可以把后缀改为dll，然后通过VC带的depends查看其依赖关系），因此如果没有设置环境变量，那么Apache加载这些模块时就会失败，当然也可以把所有依赖文件（主要是libdb43.dll ）拷贝过去。实际上，我们只需要通过绝对路径来引用这些模块即可，这样SVN升级后也不用再次拷贝。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">ii. URL的访问路径为/svn/而不是/svn，因为后者可能有问题，导致通过<a href="http://host/svn" minmax_bound="true"><font color=#005880 minmax_bound="true"><u>http://HOST/svn</u></font></a>访问出现如下错误信息</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">iii. SVNParentPath用于有多个仓库的情况，如果只有单个仓库，可以直接用SVNPath指明仓库路径。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">iv. AuthUserFile指明用户名密码文件，但它与前面提到的SVN仓库下的passwd文件不是同一个文件，AuthUserFile是Apache的认证文件格式，二者的区别主要是用户名和密码的分割符不同，passwd是等号，这里的users是冒号，当初我就是把它们当成一个文件而造成客户端无法访问（为什么SVN不把passwd的格式定义成和AuthUserFile的一样呢？这样二者可以共用一个文件）。如果要对密码加密，那么users文件需通过Apache附带的htpasswd工具生成，实际上我们也可直接采用明文方式。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">v. 权限控制文件AuthzSVNAccessFile与前面SVN里的authz一样，因此可以共用。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">4) 其它管理功能</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">a. 备份</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">b. 修复</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">&nbsp;</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">3. SVN客户端使用</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">本节针对客户端用户，主要介绍一些常用的操作方法。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">1) 客户端安装</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">客户端可以采用命令行方式，也可以采用TortoiseSVN图形化方式，个人认为还是后者方便些。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">TortoiseSVN从<a href="http://tortoisesvn.tigris.org/" minmax_bound="true"><font color=#005880 minmax_bound="true"><u>http://tortoisesvn.tigris.org/</u></font></a>上获取，注意版本应与服务器保持一致。如果是命令行方式的话，那么从<a href="http://subversion.tigris.org/" minmax_bound="true"><font color=#005880 minmax_bound="true"><u>http://subversion.tigris.org/</u></font></a>下载一个SVN二进制包就行了，此处不多讲。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">TortoiseSVN属于图形化的客户端软件，其实前面的SVN安装包里已经含有客户端程序，只不过是命令行方式的，你可以根据需要选择是否安装。TortoiseSVN的官方网站为<a href="http://tortoisesvn.tigris.org/" minmax_bound="true"><font color=#005880 minmax_bound="true"><u>http://tortoisesvn.tigris.org/</u></font></a>，同样，注意选择与SVN服务器配套的版本。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">我这里使用的版本为TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">安装完后，会提示重起机器，实际上不用重起就能直接使用，只不过重起后会更新SVN文件图标的显示。下图是SVN工作区的右键菜单内容：</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true"><br minmax_bound="true">2) 主要操作</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">TortoiseSVN使用起来很简单，所有操作都通过右键菜单来完成。命令内容也很直观，而且有非常详细的帮助手册，这里只简单的介绍一下。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">a) 导入项目（Import）</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">首先要把需要进行版本管理的工程（目录）整理好，去掉不必要的文件，比如编译器生成的临时文件。然后在最上层文件夹上单击右键，选择&#8220;TortoiseSVN -&gt; Import...&#8221;，输入要存放的SVN服务器路径，确认即可。这样就将本地的项目导入到了服务器上。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">命令行：svn import [PATH] URL</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">b) 检出项目（Checkout）</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">项目初次导入成功后，刚才本地的内容就没有用了，我们需要建立一个新的工作区，重新从SVN服务器下载受控的项目文件，执行&#8220;TortoiseSVN -&gt; Checkout...&#8221;，选择或者输入项目的URL，确认即可，以后的工作都应在这个工作区里进行。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">默认是获取项目的最新版本（HEAD），如果要获取历史版本，指定相应的修订号（Revision）即可。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">命令行：svn checkout URL[@REV]... [PATH]</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">c) 更新与提交（Update and Commit）</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">他人修改了项目，我们需要从服务器下载最新版本，这通过&#8220;SVN Update&#8221;右键菜单实现。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">命令行：svn update [PATH...]</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">如果是自己本地作了修改，则应及时将修改更新到服务器上去，这通过&#8220;SVN Commit...&#8221;实现。一个好的习惯是每次提交都应注明修改内容，以方便日后查证。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">命令行：svn commit [PATH...]</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">d) 增加和删除文件（Add and Delete）</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">如果我们要向一个受控项目中添加新文件或文件夹，只需在目标上执行&#8220;TortoiseSVN -&gt; Add&#8221;操作。注意，这里只是本地添加，要提交到服务器，还必须执行Commit才行。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">命令行：svn add PATH...</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">同样，要删除受控文件或文件夹只需执行&#8220;TortoiseSVN -&gt; Delete&#8221;操作。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">命令行：svn delete PATH/URL...</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">TortoiseSVN还提供了一个重命名操作&#8220;TortoiseSVN -&gt; Rename&#8221;，这其实是添加和删除的组合。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">e) 撤销操作（Revert）</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">有时候，我们可能进行了错误的修改或者增加和删除，只要未进行提交，我们都可以通过&#8220;TortoiseSVN -&gt; Revert&#8221;命令来撤销本地的所有更改。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">命令行：svn revert PATH...</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">f) 查看信息</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">SVN提供了几种信息查看方式，其中Show log用于显示每次版本变更的日志信息，Repo-brower是仓库浏览器，类似于资源管理器，Revision graph则以图形化的方式让我们很直观的看到版本的变更情况，尤其是对于分支和标签管理很有帮助。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">3) 其它操作</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">a) 冲突解决（Resolved）</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">如果我们本地进行了修改，而别人又把他的修改提交到了服务器上，这时我们执行Update就可能出现冲突（Conflict）。Resolved的作用不是解决冲突，它不进行任何合并，而是忽略掉他人的修改，允许我们将自己的版本提交到服务器上。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">简单的说，Revent是撤销本地修改，而Resolved是保留本地修改。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">b) 清除异常状态（Cleanup）</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">如果在执行某个命令的时候出现异常，比如服务器突然挂了，本地的工作区就会处于一种异常状态，通过Cleanup能够清除这种状态，使工作区不受到影响。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">c) 锁定（Get lock）和解锁（Release lock）</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">冲突都是由于不同的开发人员同时修改了同一份文件造成的，因此，为了避免这种情况，我们可以强行锁定自己要修改的内容，这样其他人在我们解锁前就无法提交其修改。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">d) 分支和标签（Branch/tag）</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">本文最开始就有说明，分支的目的是为了创建并行的工作线，标签的作用是为了保存项目某个版本的快照。二者在实现上却是一样的，都是通过Branch/tag命令执行。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">e) 导出（Export）</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">为了实现版本管理，SVN会在工作区的每个目录下都生成一个隐藏的.svn文件夹，而我们有时却希望得到一个干净的没有.svn文件夹的项目结构，比如发布软件时，这种情况下就可以使用Export功能。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">f) 重定向（Relocate）</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">有时候，SVN服务器的IP地址可能会发生变动，如果遇到这种情况，我们每个人的本地工作区都要重新下载吗？不用，只需通过Relocate重新配置一下本地工作区所对应的服务器地址就可以。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">g) 补丁管理（patch）</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: 幼圆" minmax_bound="true">不要被patch的名称迷惑，实际上它不属于SVN版本管理的范畴。这里所谓的patch是指那些对项目没有写权限（Commit）的人所作的修改，通过&#8220;TortoiseSVN -&gt; Create Patch&#8221;生成，然后他们采用电子邮件等方式将patch发给项目管理员，由管理员执行&#8220;TortoiseSVN -&gt; Apply Patch&#8221;并确认修改内容后再进行提交。该功能主要用于开源项目的管理。</p>
<img src ="http://www.cppblog.com/niewenlong/aggbug/65282.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2008-10-28 10:32 <a href="http://www.cppblog.com/niewenlong/archive/2008/10/28/65282.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Beyond Compare V3.0</title><link>http://www.cppblog.com/niewenlong/archive/2008/08/01/57732.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Fri, 01 Aug 2008 03:27:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2008/08/01/57732.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/57732.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2008/08/01/57732.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/57732.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/57732.html</trackback:ping><description><![CDATA[<p>Beyond Compare 是一款不可多得的专业级的文件夹和文件对比工具。使用他可以很方便的对比出两个文件夹或者文件的不同之处。并把相差的每一个字节用颜色加以表示，查看方便。并且支持多种规则对比。对软件汉化者来说，这绝对是一款不可多得的工具。<br></p>
<p><font color=#ff0000>注册码:urKH3mXZVDiTNgCKQnFnfvaQB5tTtahv tUr5HqwT9YZu50+b3T9bkzYKwKsfjhhi DgzR9Dr5qbmJ2EmNzYfSAq4ocM7E8B0D kDvyvawgHd0gV-nFnVNBsqMgnxcKoJfZ 6WrrQotEiqs6H14Jk9Wjz+SLvovnUksb gT5K1ey7T7AV2C32NLt4gjavcM5tzDR0 GUbvAou+MKzhMHebccC+3fB0wwwKNPs0 fwCz3Xh16S6yB4xxeD2bS6JFV9JPZwkA</font></p>
<img src ="http://www.cppblog.com/niewenlong/aggbug/57732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2008-08-01 11:27 <a href="http://www.cppblog.com/niewenlong/archive/2008/08/01/57732.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用 Subversion 构建版本控制环境</title><link>http://www.cppblog.com/niewenlong/archive/2007/10/12/34034.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Fri, 12 Oct 2007 07:51:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2007/10/12/34034.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/34034.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2007/10/12/34034.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/34034.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/34034.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: <br>本文将介绍如何通过 Subversion 来构建小组开发过程中最为重要的版本控制环境，包括Subversion 环境的安装配置以及如何通过各种有效的客户端工具来提高工作的效率。<br><br>一． 首先我们先来认识一下 Subversion<br><br>Subversion 项目的初衷是为了替换现在开源社区最为流行的版本控制软件 CVS，在 CVS的功能的基础上有很多的提升同时也能较好的解决 CVS 系统的一些不足，这些提升主要包括以下的一些方面：<br><br>1． 目录、文件以及改名等元数据的版本化<br>不同于 CVS 只关心文件的内容以及文件是否存在，所有文件、目录的相关操作都是被版本化的，例如文件的改名、拷贝等等；<br><br>2． 提交操作是真正的原子操作<br>在 Subversion 中，提交操作是不可分割的，修订版本号是基于每次提交操作而非文件。提交日志被附加在每个修订版本中，而不是像 CVS 一样冗余的进行存储；<br><br>3． 可通过 Apache 服务器提供基于 WebDAV/DeltaV 协议的支持<br>该功能可使&nbsp;&nbsp;<a href='http://www.cppblog.com/niewenlong/archive/2007/10/12/34034.html'>阅读全文</a><img src ="http://www.cppblog.com/niewenlong/aggbug/34034.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2007-10-12 15:51 <a href="http://www.cppblog.com/niewenlong/archive/2007/10/12/34034.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Subversion之路－－实现精细的目录访问权限控制</title><link>http://www.cppblog.com/niewenlong/archive/2007/10/12/34033.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Fri, 12 Oct 2007 07:31:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2007/10/12/34033.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/34033.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2007/10/12/34033.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/34033.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/34033.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: <br>在 Subversion 的使用当中，存在“认证”、“授权”两个概念。认证，即 authentication，是指用户名与密码的认证。授权，即 authorization ，是指某用户对某个目录是否具备读、写权限的一种审核。这两者配合作用，就组成了 Subversion 的整个帐户管理体系。<br><br>在实际的工作当中，我们有时候会遇见需要控制项目目录的访问权限的情况，比如说对项目的一些关键模块进行限制，仅允许少数授权人士才可以修改等。由于项目的目录本身就是作为版本库的一个部分被 Subversion 所收管，所以我们无法利用操作系统的帐户权限体系，来实现授权控制。因此，这个问题就只有让svn自己来解决了。<br><br>Subversion 提供了面向目录的帐户权限管理功能，通过它，我们就可以很精确地实现项目目录的访问控制。不过在 1.2 及其以前的版本，我们只能利用 mod_authz_svn.so 模块，结合 Apache 服务器来实现目录访问控制，这对于对 Apache 的配置与使用不是很熟悉的人来说，就不是很方便了。而Subversion终于在 1.3 &nbsp;&nbsp;<a href='http://www.cppblog.com/niewenlong/archive/2007/10/12/34033.html'>阅读全文</a><img src ="http://www.cppblog.com/niewenlong/aggbug/34033.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2007-10-12 15:31 <a href="http://www.cppblog.com/niewenlong/archive/2007/10/12/34033.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用 Subversion 构建版本控制环境</title><link>http://www.cppblog.com/niewenlong/archive/2007/10/12/34032.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Fri, 12 Oct 2007 07:24:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2007/10/12/34032.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/34032.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2007/10/12/34032.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/34032.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/34032.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: <br>本文将介绍如何通过 Subversion 来构建小组开发过程中最为重要的版本控制环境，包括Subversion 环境的安装配置以及如何通过各种有效的客户端工具来提高工作的效率。<br>一． 首先我们先来认识一下 Subversion<br>Subversion 项目的初衷是为了替换现在开源社区最为流行的版本控制软件 CVS，在 CVS的功能的基础上有很多的提升同时也能较好的解决 CVS 系统的一些不足，这些提升主要包括以下的一些方面：<br>1． 目录、文件以及改名等元数据的版本化<br>不同于 CVS 只关心文件的内容以及文件是否存在，所有文件、目录的相关操作都是被版本化的，例如文件的改名、拷贝等等；<br><br>2． 提交操作是真正的原子操作<br>在 Subversion 中，提交操作是不可分割的，修订版本号是基于每次提交操作而非文件。提交日志被附加在每个修订版本中，而不是像 CVS 一样冗余的进行存储；<br><br>3． 可通过 Apache 服务器提供基于 WebDAV/DeltaV 协议的支持<br>该功能可使&nbsp;&nbsp;<a href='http://www.cppblog.com/niewenlong/archive/2007/10/12/34032.html'>阅读全文</a><img src ="http://www.cppblog.com/niewenlong/aggbug/34032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2007-10-12 15:24 <a href="http://www.cppblog.com/niewenlong/archive/2007/10/12/34032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让Subversion和Visual Studio 2005一起工作</title><link>http://www.cppblog.com/niewenlong/archive/2007/10/12/34028.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Fri, 12 Oct 2007 07:19:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2007/10/12/34028.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/34028.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2007/10/12/34028.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/34028.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/34028.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 工具准备：VS2005.<br>Subversion,撰写此文时的最新版本是1.4.2,官方网站http://subversion.tigris.org<br>TortoiseSVN,撰写此文时的最新版本是1.4.1.7992,官方网站http://tortoisesvn.net,该软件有中文汉化包<br>VisualSVN，让VS2005支持SVN的插件。该软件必须和TortoiseSVN配套使用。撰写此文时的版本是1.1.1，官方网站是http://www.visualsvn.com,该软件是商业程序，未注册的话，可以试用30天。<br><br>安装步骤：<br>STEP1：安装并设置Subversion(服务端)<br>由于可以下载SVN压缩包程序，不是安装程序，其实SVN本就不需安装。只要配置对了，就可以运行了。下面所涉及到的任何安装路径或者设置路径，都仅仅是做演示之用，可以根据需求做任意变化。&nbsp;&nbsp;<a href='http://www.cppblog.com/niewenlong/archive/2007/10/12/34028.html'>阅读全文</a><img src ="http://www.cppblog.com/niewenlong/aggbug/34028.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2007-10-12 15:19 <a href="http://www.cppblog.com/niewenlong/archive/2007/10/12/34028.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>svn服务器安装配置</title><link>http://www.cppblog.com/niewenlong/archive/2007/10/12/34024.html</link><dc:creator>聂文龙</dc:creator><author>聂文龙</author><pubDate>Fri, 12 Oct 2007 07:07:00 GMT</pubDate><guid>http://www.cppblog.com/niewenlong/archive/2007/10/12/34024.html</guid><wfw:comment>http://www.cppblog.com/niewenlong/comments/34024.html</wfw:comment><comments>http://www.cppblog.com/niewenlong/archive/2007/10/12/34024.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/niewenlong/comments/commentRss/34024.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/niewenlong/services/trackbacks/34024.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: <br>1.安装svn-1.3.0-setup.exe（可以在http://subversion.tigris.org/下载得到）<br>2.安装成功后，在命令行输入svnadmin create D:\svnhome\workflow,建立工程，svn自动会<br>在该目录下建立若干文件<br>3.在该目录下有password文件，在此文件中增加用户和密码格式如下<br>[users]<br>admin = 123<br>在svnserve.conf文件中增加<br>[general]<br>anon-access = read<br>auth-access = write<br>password-db = passwd<br>realm = svnhome<br>到这一步svn服务器已经配置完成了，下面是导入需要版本控制的工程<br>4.在命令行执行import命令<br>例如：D:\svnhome\workflow>svn import D:\eclipse\workspace\Workflow<br>file:///D:/svnhome\work&nbsp;&nbsp;<a href='http://www.cppblog.com/niewenlong/archive/2007/10/12/34024.html'>阅读全文</a><img src ="http://www.cppblog.com/niewenlong/aggbug/34024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/niewenlong/" target="_blank">聂文龙</a> 2007-10-12 15:07 <a href="http://www.cppblog.com/niewenlong/archive/2007/10/12/34024.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>