﻿<?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>BlogJava-一亩三分地-文章分类-软件配置管理</title><link>http://www.blogjava.net/guobin/category/17098.html</link><description>自家地方</description><language>zh-cn</language><lastBuildDate>Thu, 08 Mar 2007 06:35:32 GMT</lastBuildDate><pubDate>Thu, 08 Mar 2007 06:35:32 GMT</pubDate><ttl>60</ttl><item><title>Windows下配置邮件通知</title><link>http://www.blogjava.net/guobin/articles/80444.html</link><dc:creator>蝈蝈</dc:creator><author>蝈蝈</author><pubDate>Fri, 10 Nov 2006 09:01:00 GMT</pubDate><guid>http://www.blogjava.net/guobin/articles/80444.html</guid><wfw:comment>http://www.blogjava.net/guobin/comments/80444.html</wfw:comment><comments>http://www.blogjava.net/guobin/articles/80444.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/guobin/comments/commentRss/80444.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/guobin/services/trackbacks/80444.html</trackback:ping><description><![CDATA[
		<p>在一个多人协作的环境中，每个人提交代码后，应该能通知其他人这个变化，邮件是一个最常见的方法。</p>
		<p>由于windows下不像linux一样都随机配备了sendmail等发送邮件的工具，所以我们需要在windows上选择一种smtp服务器，这里我使用了<a href="http://james.apache.org/">James</a>，一个Java的开源的开源项目，实现了完整的邮件系统。</p>
		<p> 本教程是<a class="latestnews" href="http://www.subversion.org.cn/index.php?option=com_content&amp;task=view&amp;id=82&amp;Itemid=9"><u><font color="#0000ff"> Windows下Subversion配置管理员指南</font></u></a>系列教程的一部分，各个教程采用相同的目录结构和路径，有助于大家阅读。</p>
		<p>版本库根目录: d:\svnroot ，其中有project1和project2两个版本库。<br />Subversion安装目录: d:\subversion</p>
		<p> </p>
		<h3>1，下载安装</h3>
		<h5>a. 下载安装JDK</h5>
		<p>因为James是Java程序，首先你的系统必须有Java运行环境，我们可以从Sun的官方网站下载，地址是<a href="http://java.sun.com/javase/downloads/index.jsp">http://java.sun.com/javase/downloads/index.jsp</a>。下载直接按照默认安装即可，我选择安装的位置是D:\jdk1.5.0_09，教程后面将会使用这个路径。</p>
		<h5>b. 下载安装James</h5>
		<p>James的官方网站是<a href="http://james.apache.org/">http://james.apache.org/</a>，我们可以在<a href="http://java.sun.com/javase/downloads/index.jsp">http://java.sun.com/javase/downloads/index.jsp</a>下载James的服务器版本，目前的最新版本是<a href="http://apache.justdn.org/james/server/binaries/james-2.3.0.zip">http://apache.justdn.org/james/server/binaries/james-2.3.0.zip</a>。</p>
		<p>下载后直接解压缩就行了，然后打开james-2.3.0\bin\run.bat，在@echo off后面增加下面的代码：<br />    set JAVA_HOME=D:\jdk1.5.0_09<br />然后直接运行一下run.bat，就会提示启动了邮件服务器，其中我们使用的就是smtp服务，这说明James安装成功。</p>
		<h5>c. 下载安装perl</h5>
		<p>我们这个教程会借用subversion官方网站提供的发送邮件脚本，是使用perl编写，所以我们需要下载perl的运行环境。<a href="http://www.activestate.com/store/productdetail.aspx?prdGuid=81fbce82-6bd5-49bc-a915-08d58c2648ca">http://www.activestate.com/store/productdetail.aspx?prdGuid=81fbce82-6bd5-49bc-a915-08d58c2648ca</a>下的<a href="http://downloads.activestate.com/ActivePerl/Windows/5.8/ActivePerl-5.8.8.819-MSWin32-x86-267479.msi">http://downloads.activestate.com/ActivePerl/Windows/5.8/ActivePerl-5.8.8.819-MSWin32-x86-267479.msi</a>。perl的安装位置与后面的教程无关，可以随意安装。</p>
		<h5>d. 下载commit-email.pl.in</h5>
		<p>官方网站的<a href="http://svn.collab.net/repos/svn/trunk/tools/hook-scripts/">http://svn.collab.net/repos/svn/trunk/tools/hook-scripts/</a>下提供了一些有用的钩子脚本下载，我们下载<a href="http://svn.collab.net/repos/svn/trunk/tools/hook-scripts/commit-email.pl.in">http://svn.collab.net/repos/svn/trunk/tools/hook-scripts/commit-email.pl.in</a>。</p>
		<h3>
				<br />2，配置验证James</h3>
		<p>在上一小节运行了run.bat后，可以看到如下的提示：</p>
		<pre>Using PHOENIX_HOME:   D:\tools\james-<span style="COLOR: #cc66cc">2</span>.<span style="COLOR: #cc66cc">3</span>.<span style="COLOR: #cc66cc">0</span>
Using PHOENIX_TMPDIR: D:\tools\james-<span style="COLOR: #cc66cc">2</span>.<span style="COLOR: #cc66cc">3</span>.<span style="COLOR: #cc66cc">0</span>\temp
Using JAVA_HOME:      D:\jdk1.<span style="COLOR: #cc66cc">5</span>.<span style="COLOR: #cc66cc">0</span>_<span style="COLOR: #cc66cc">09</span></pre>
		<pre>Phoenix <span style="COLOR: #cc66cc">4</span>.<span style="COLOR: #cc66cc">2</span></pre>
		<pre>James <a href="http://www.php.net/mail"><span style="COLOR: #000066">Mail</span></a> Server <span style="COLOR: #cc66cc">2</span>.<span style="COLOR: #cc66cc">3</span>.<span style="COLOR: #cc66cc">0</span>
Remote Manager Service started plain:<span style="COLOR: #cc66cc">4555</span>
POP3 Service started plain:<span style="COLOR: #cc66cc">110</span>
SMTP Service started plain:<span style="COLOR: #cc66cc">25</span>
NNTP Service started plain:<span style="COLOR: #cc66cc">119</span>
FetchMail Disabled</pre>
		<p>它告诉我们可以使用启动正常（不要关闭窗口），并且可以使用telnet进行管理，为此，我们在一个新命令行窗口中运行：</p>
		<pre>telnet <span style="COLOR: #cc66cc">127</span>.<span style="COLOR: #cc66cc">0</span>.<span style="COLOR: #cc66cc">0</span>.<span style="COLOR: #cc66cc">1</span><span style="COLOR: #cc66cc">4555</span></pre>
		<p>注意：这里127.0.0.1代表了我的本机地址，如果是在局域网中，可能这里是运行James服务器的ip地址。</p>
		<p>然后出现输入用户名和密码的提示，用户名和密码都输入root即可，提示登陆成功后，直接输入下面的命令，就可以添加一个帐户：</p>
		<pre>adduser rocksun rocksun</pre>
		<p>完成这个操作后，我们就可以使用我们的邮件客户端（outlook, foxmail）验证我们的James服务器，我想配置都不是问题，smtp和pop3服务器都输入“127.0.0.1”或运行James服务器主机的IP即可，用户名和密码都是rocksun，设置smtp发送无需认证。</p>
		<p>然后可以发送一个测试邮件，根据上面添加的用户信息，我们的邮件的目的地址是
<script language="JavaScript" type="text/javascript"><!-- 
var prefix = '&#109;a' + 'i&#108;' + '&#116;o'; 
var path = 'hr' + 'ef' + '='; 
var addy85461 = 'r&#111;cks&#117;n' + '&#64;' + '127' + '&#46;' + '0' + '&#46;' + '0' + '&#46;' + '1'; 
var addy_text85461 = 'r&#111;cks&#117;n' + '&#64;' + '127' + '&#46;' + '0' + '&#46;' + '0' + '&#46;' + '1'; 
document.write( '<a ' + path + '\'' + prefix + ':' + addy85461 + '\'>' ); 
document.write( addy_text85461 ); 
document.write( '<\/a>' ); 
//--></script><a href="mailto:rocksun@127.0.0.1">rocksun@127.0.0.1</a></p>
		<noscript> 
此邮件地址受spam bots保护，需要使用 Javascript 功能来查阅。
</noscript>，发送后你在选择收邮件，就应该能得到自己发送的邮件，然后我们可以继续进行了。<h3>3，编写钩子</h3><p>剩下的工作就很简单了，将commit-email.pl.in重命名为commit-email.pl，存放在D:\svnroot\下，然后找到下面这一行：</p><pre>my <span style="COLOR: #0000ff">$svnlook</span> = <span style="COLOR: #ff0000">"@SVN_BINDIR@/svnlook"</span>;</pre><p>修改为：</p><pre>my <span style="COLOR: #0000ff">$svnlook</span> = <span style="COLOR: #ff0000">"D:/Subversion/bin/svnlook.exe"</span>;</pre><p>然后来到D:\svnroot\project1\hooks下，创建一个post-commit.bat文件，内容如下：</p><address>set REPOS=%1<br />set REV=%2<br />D:\svnroot\commit-email.pl "%REPOS%" "%REV%"
<script language="JavaScript" type="text/javascript"><!-- 
var prefix = '&#109;a' + 'i&#108;' + '&#116;o'; 
var path = 'hr' + 'ef' + '='; 
var addy85461 = 'r&#111;cks&#117;n' + '&#64;' + '127' + '&#46;' + '0' + '&#46;' + '0' + '&#46;' + '1'; 
var addy_text85461 = 'r&#111;cks&#117;n' + '&#64;' + '127' + '&#46;' + '0' + '&#46;' + '0' + '&#46;' + '1'; 
document.write( '<a ' + path + '\'' + prefix + ':' + addy85461 + '\'>' ); 
document.write( addy_text85461 ); 
document.write( '<\/a>' ); 
//--></script><a href="mailto:rocksun@127.0.0.1">rocksun@127.0.0.1</a><noscript> 
此邮件地址受spam bots保护，需要使用 Javascript 功能来查阅。
</noscript>--from
<script language="JavaScript" type="text/javascript"><!-- 
var prefix = '&#109;a' + 'i&#108;' + '&#116;o'; 
var path = 'hr' + 'ef' + '='; 
var addy79932 = 'd&#97;&#105;j&#117;n' + '&#64;' + 'gm&#97;&#105;l' + '&#46;' + 'c&#111;m'; 
var addy_text79932 = 'd&#97;&#105;j&#117;n' + '&#64;' + 'gm&#97;&#105;l' + '&#46;' + 'c&#111;m'; 
document.write( '<a ' + path + '\'' + prefix + ':' + addy79932 + '\'>' ); 
document.write( addy_text79932 ); 
document.write( '<\/a>' ); 
//--></script><a href="mailto:daijun@gmail.com">daijun@gmail.com</a><noscript> 
此邮件地址受spam bots保护，需要使用 Javascript 功能来查阅。
</noscript></address><p>好了，在project1的工作拷贝里提交吧，然后看看你刚才配置的邮件客户端，有没有受到这次变更的邮件。</p><img src ="http://www.blogjava.net/guobin/aggbug/80444.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/guobin/" target="_blank">蝈蝈</a> 2006-11-10 17:01 <a href="http://www.blogjava.net/guobin/articles/80444.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Subversion备份</title><link>http://www.blogjava.net/guobin/articles/80443.html</link><dc:creator>蝈蝈</dc:creator><author>蝈蝈</author><pubDate>Fri, 10 Nov 2006 09:00:00 GMT</pubDate><guid>http://www.blogjava.net/guobin/articles/80443.html</guid><wfw:comment>http://www.blogjava.net/guobin/comments/80443.html</wfw:comment><comments>http://www.blogjava.net/guobin/articles/80443.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/guobin/comments/commentRss/80443.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/guobin/services/trackbacks/80443.html</trackback:ping><description><![CDATA[
		<p>版本控制最关键的一件事是保证数据的安全性，不能因为磁盘损坏，程序故障造成版本库无可挽回的错误，为此必须制定较完备的备份策略。在Subversion中，我们有三种备份方式：完全备份，增量备份和同步版本库。<br /></p>
		<h3>1, 完全备份</h3>
		<p>最常见和简单的备份就是直接使用拷贝命令，将版本库目录拷贝到备份目录上，就可以了。但是这样不是很安全的方式，因为如果在拷贝时版本库发生变化，将会造成备份的结果不够准确，失去备份的作用，为此Subversion提供了“svnadmin hotcopy”命令，可以防止这种问题。</p>
		<p>还记得我们的版本库目录吗？</p>
		<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
				<p>D:\SVNROOT<br />├─project1<br />│  ├─conf<br />│  ├─dav<br />│  ├─db<br />│  │  ├─revprops<br />│  │  ├─revs<br />│  │  └─transactions<br />│  ├─hooks<br />│  └─locks<br />└─project2<br />    ├─conf<br />    ├─dav<br />    ├─db<br />    │  ├─revprops<br />    │  ├─revs<br />    │  └─transactions<br />    ├─hooks<br />    └─locks<br />    <br /></p>
		</blockquote>
		<p dir="ltr">如果要把project1备份到d:\svnrootbak目录下，只需要运行：</p>
		<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
				<p dir="ltr">svnadmin hotcopy d:\svnroot\project1 d:\svnrootbak\project1</p>
		</blockquote>
		<p dir="ltr">但是我们作为配置管理员，必须想办法优化这个过程，如果我们这个目录下有许多版本库，需要为每个版本库写这样一条语句备份，为此我写了下面的脚本，实现备份一个目录下的所有版本库。我们在D:\SVNROOT下创建了两个文件，simpleBackup.bat：</p>
		<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
				<p>@echo 正在备份版本库%1......<br />@%SVN_HOME%\bin\svnadmin hotcopy %1 %BACKUP_DIRECTORY%\%2<br />@echo 版本库%1成功备份到了%2！</p>
		</blockquote>
		<p>这个文件仅仅是对“svnadmin hotcopy”的包装，然后是backup.bat：</p>
		<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
				<p>echo off</p>
				<p>rem Subversion的安装目录<br />set SVN_HOME="D:\Subversion"</p>
				<p>rem 所有版本库的父目录<br />set SVN_ROOT=D:\svnroot</p>
				<p>rem 备份的目录<br />set BACKUP_SVN_ROOT=D:\svnrootbak</p>
				<p>set BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%\%date:~0,10%<br />if exist %BACKUP_DIRECTORY% goto checkBack<br />echo 建立备份目录%BACKUP_DIRECTORY%&gt;&gt;%SVN_ROOT%/backup.log</p>
				<p>mkdir %BACKUP_DIRECTORY%</p>
				<p>rem 验证目录是否为版本库，如果是则取出名称备份<br />for /r %SVN_ROOT% %%I in (.) do @if exist "%%I\conf\svnserve.conf" %SVN_ROOT%\simpleBackup.bat "%%~fI" %%~nI<br />goto end</p>
				<p>:checkBack<br />echo 备份目录%BACKUP_DIRECTORY%已经存在，请清空。<br />goto end</p>
				<p>:end</p>
		</blockquote>
		<p>你在使用的时候，只需要修改backup.bat开头的三个路径，将两个脚本拷贝到“SVN_ROOT”下就可以了。根据以上的配置，你只需要运行backup.bat，就可以把“SVN_ROOT”下的版本库都备份到“BACKUP_SVN_ROOT”里，并且存放在备份所在日的目录里，例如“D:\svnrootbak\2006-10-22”。</p>
		<p>虽然这部分工作很简单，可是必须有人定时地去执行这个操作（例如每周一凌晨），为了避免发生遗忘的情况，我们可以将这个操作加入到系统的at任务当中去，例如还是上面的环境，为了安装at任务，我们运行：</p>
		<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
				<pre>at <span style="COLOR: #cc66cc">1</span>:<span style="COLOR: #cc66cc">00</span> /every:M D:\svnroot\backup.bat</pre>
		</blockquote>
		<p>这样在每周一凌晨1:00都会执行这个备份过程。当然备份在本机也是不安全的，你也许需要上传到别的机器，这个就要靠你自己去实现了。</p>
		<h3>
				<br />2, 增量备份</h3>
		<p>尽管完全备份非常简单，但是也是有代价的，当版本库非常巨大时，经常进行完全备份是不现实的，也并不必要，但是一旦版本库在备份之间发生问题，该如何呢，这里我们就用到了增量备份。</p>
		<p>增量备份通常要与完全备份结合使用，就像oracle数据库的归档日志，记录着每次Subversion提交的变化，然后在需要恢复时能够回到最新的可用状态。在我们这个例子中我们使用的是，svnadmin dump命令进行增量的备份，使用方法是：</p>
		<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
				<p>svnadmin dump project1 --revision 15 --incremental &gt; dumpfile2</p>
		</blockquote>
		<p>上面的命令实现了对修订版本15进行增量的备份，其中的输出文件dumpfile2只保存了修订版本15更改的内容。</p>
		<p>为了记录每次提交的结果，我们需要使用一项Subversion的特性--<a href="http://www.subversion.org.cn/svnbook/1.1/svn-ch-5-sect-2.html#svn-ch-5-sect-2.1"><u><font color="#800080">钩子（hook）</font></u></a>，看看我们的project1目录：</p>
		<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
				<p>├─project1<br />│  ├─conf<br />│  ├─dav<br />│  ├─db<br />│  │  ├─revprops<br />│  │  ├─revs<br />│  │  └─transactions<br />│  ├─hooks<br />│  └─locks</p>
		</blockquote>
		<p>其中的hooks目录里存放的就是钩子脚本，我们在此处只使用post-commit钩子，这个钩子会在每次提交之后执行，为了实现我们的备份功能，我们在hooks下建立一个文件post-commit.bat，内容如下：</p>
		<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
				<address>echo off<br />set SVN_HOME="C:\Program Files\Subversion"<br />set SVN_ROOT=D:\svnroot<br />set UNIX_SVN_ROOT=D:/svnroot<br />set DELTA_BACKUP_SVN_ROOT=D:\svnrootbak\delta</address>
				<address>set LOG_FILE=%1\backup.log<br />echo backup revision %2 &gt;&gt; %LOG_FILE%</address>
				<address>for /r %SVN_ROOT% %%I in (.) do if D:/svnroot/%%~nI == %1 %SVN_ROOT%\%%~nI\hooks\deltaBackup.bat %%~nI %2<br />goto end</address>
				<address>:end</address>
		</blockquote>
		<p>通过这个脚本，可以实现D:\svnroot下的版本库提交时自动增量备份到D:\svnrootbak\delta（确定这个目录存在），其中使用的deltaBackup.bat其实可以放在任何地方，只是对脚本的svnadmin dump的包装，内容如下：</p>
		<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
				<p>@echo 正在备份版本库%2......<br />%SVN_HOME%\bin\svnadmin dump %SVN_ROOT%\%1 --incremental --revision %2 &gt;&gt; %DELTA_BACKUP_SVN_ROOT%\%1.dump<br />@echo 版本库%2成功备份到了%3！</p>
		</blockquote>
		<p>以上两个脚本可以直接拷贝到project2的hooks目录下，不需要修改就可以实现project2的自动备份。</p>
		<p>以上的操作已经OK了，现在需要做的是将完全备份和增量备份结合起来，也就是在完全备份后清理增量备份的结果，使之只保存完全备份后的结果。</p>
		<p>当果真出现版本库的故障，就要求我们实现版本库的恢复操作了，这是用要使用svnadmin load命令，同时也需要上次的完全备份例如要把上次完全备份backuprepo，和之后的增量备份dumpfile：</p>
		<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
				<p>svnadmin load backuprepo &lt; dumpfile</p>
		</blockquote>
		<p>最后的结果，可以下载<a href="http://www.subversion.org.cn/images/stories/svnroot.rar">svnroot.rar</a>，将之解压缩到d:\下，然后修改几个bat文件的SVN_HOME就可以使用了。</p>
		<h3>3, 版本库同步</h3>
		<p>Subversion 1.4增加了同步机制，可以实现一个版本库同另一个版本库的同步（但好像只是单向的），我们可以用来实现版本库的备份或镜像。</p>
		<h5>3.1. 对目标库初始化</h5>
		<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
				<pre>svnsync init svn:<span style="COLOR: #808080; FONT-STYLE: italic">//localhost/project2 svn://localhost/project1 </span>
 </pre>
		</blockquote>
		<p>
				<font size="2">其中project2是目标的版本库，而project1是源版本库。其中的目标版本库必须为空，而且必须允许修订版本属性的修改，也就是在目标的版本库的hooks目录里添加一个文件pre-revprop-change.bat，内容为空即可。</font>
		</p>
		<h5>3.2. 同步project2到project1</h5>
		<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
				<pre>svnsync sync svn:<span style="COLOR: #808080; FONT-STYLE: italic">//localhost/project2 </span>
 </pre>
		</blockquote>
		<p>这时候你update一下你的project2的一个工作拷贝，就会发现有了project1的所有内容。如果project1又有提交，这时候project2的版本库无法看到最新的变化，还需要再运行一遍sync操作，这样才能将最新的变化同步。需要注意的是，目标版本库只能做成只读的，如果目标版本库发生了变更，则无法继续同步了。</p>
		<h5>3.3. 同步历史属性的修改</h5>
		<p>因为同步不会更新对历史属性的修改，所以svnsync还有子命令copy-revprops，可以同步某个版本的属性。</p>
		<h5>3.4. 钩子自动同步</h5>
		<p>希望在每次提交时同步，则需要在源版本库增加post-commit脚本，内容如下：</p>
		<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
				<pre>
						<a href="http://www.php.net/echo">
								<span style="COLOR: #000066">echo</span>
						</a> off
set SVN_HOME=<span style="COLOR: #ff0000">"C:<span style="FONT-WEIGHT: bold; COLOR: #000099">\P</span>rogram Files<span style="FONT-WEIGHT: bold; COLOR: #000099">\S</span>ubversion"</span>
%SVN_HOME%\bin\svnsync sync  --non-interactive svn:<span style="COLOR: #808080; FONT-STYLE: italic">//localhost/project2 </span>
 </pre>
		</blockquote>
		<p>把以上内容存放为post-commit.bat，然后放到版本库project1下的hooks目录下，这样project1每次提交，都会引起project2的同步。<br /></p>
<img src ="http://www.blogjava.net/guobin/aggbug/80443.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/guobin/" target="_blank">蝈蝈</a> 2006-11-10 17:00 <a href="http://www.blogjava.net/guobin/articles/80443.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Subversion快速入门教程 </title><link>http://www.blogjava.net/guobin/articles/80441.html</link><dc:creator>蝈蝈</dc:creator><author>蝈蝈</author><pubDate>Fri, 10 Nov 2006 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/guobin/articles/80441.html</guid><wfw:comment>http://www.blogjava.net/guobin/comments/80441.html</wfw:comment><comments>http://www.blogjava.net/guobin/articles/80441.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/guobin/comments/commentRss/80441.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/guobin/services/trackbacks/80441.html</trackback:ping><description><![CDATA[
		<p>如何快速建立Subversion服务器，并且在项目中使用起来，这是大家最关心的问题，与CVS相比，Subversion有更多的选择，也更加的容易，几个命令就可以建立一套服务器环境，可以使用起来，这里配套有<u><font color="#0000ff"><a href="http://www.subversion.org.cn/media/all.swf">动画教程</a></font></u>。 <br />本文是使用Subversion最快速的教程，在最短的时间里帮助您建立起一套可用的服务器环境，只需略加调整就可以应用到实际项目当中。 <br />本教程分为以下几个部门，不仅仅是快速入门，最后我们还有一些高级功能的说明，为了说明简单，教程是在windows下使用的方式，以方便资源有限的项目使用，对于UNIX环境下，区别并不大。</p>
		<p>软件下载</p>
		<p>服务器和客户端安装</p>
		<p>建立版本库（Repository） </p>
		<p>配置用户和权限</p>
		<p>运行独立服务器 </p>
		<p>初始化导入 </p>
		<p>基本客户端操作</p>
		<h1>1，软件下载 </h1>
		<h3>下载Subversion服务器程序。 </h3>
		<p>到<a href="http://subversion.tigris.org/">官方网站</a>的下载二进制安装文件，来到<a href="http://subversion.tigris.org/project_packages.html#binary-packages">二进制包下载部分</a>，找到 Windows NT, 2000, XP and 2003部分，然后选择" <a href="http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91">this directory </a>"，这样我们可以看到许多下载的内容，目前可以下载 <a href="http://subversion.tigris.org/files/documents/15/34093/svn-1.4.0-setup.exe">svn-1.4.0-setup.exe</a> 。 </p>
		<h3>下载Subversion的Windows客户端TortoiseSVN。 </h3>
		<p>TortoiseSVN是扩展Windows Shell的一套工具，可以看作Windows资源管理器的插件，安装之后Windows就可以识别Subversion的工作目录。 <br />官方网站是<a href="http://tortoisesvn.net/">TortoiseSVN </a>，下载方式和前面的svn服务器类似，在<a href="http://tortoisesvn.net/downloads">Download</a>页面的我们可以选择下载的版本，目前的最高稳定版本的安装文件为<a href="http://prdownloads.sourceforge.net/tortoisesvn/TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi?download"><u><font color="#0000ff">TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi</font></u></a>。</p>
		<h1>2，服务器和客户端安装 </h1>
		<p>服务器安装，直接运行<a href="http://subversion.tigris.org/files/documents/15/34093/svn-1.4.0-setup.exe">svn-1.4.0-setup.exe</a> ，根据提示安装即可，这样我们就有了一套服务器可以运行的环境。 </p>
		<p>安装TortoiseSVN，同样直接运行<a href="http://prdownloads.sourceforge.net/tortoisesvn/TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi?download"><u><font color="#0000ff">TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi</font></u></a>按照提示安装即可，不过最后完成后会提示是否重启，其实重启只是使svn工作拷贝在windows中的特殊样式生效，与所有的实际功能无关，这里为了立刻看到好的效果，还是重新启动机器。<br />  </p>
		<h1>3，建立版本库（Repository）</h1>
		<p>运行Subversion服务器需要首先要建立一个版本库（Repository），可以看作服务器上存放数据的数据库，在安装了Subversion服务器之后，可以直接运行，如： </p>
		<pre>svnadmin create E:\svndemo\repository</pre>
		<p>就会在目录E:\svndemo\repository下创建一个版本库。 </p>
		<p>我们也可以使用TortoiseSVN图形化的完成这一步： <br />在目录E:\svndemo\repository下"右键-&gt;TortoiseSVN-&gt;Create Repository here...“， 然后可以选择版本库模式， 这里使用默认即可， 然后就创建了一系列目录和文件。 </p>
		<h1>
				<br />4，配置用户和权限 </h1>
		<p>来到E:\svndemo\repository\conf目录，修改svnserve.conf： <br /># [general] <br /># password-db = passwd <br />改为： <br />[general] <br />password-db = passwd 然后修改同目录的passwd文件，去掉下面三行的注释： <br /># [users] <br /># harry = harryssecret <br /># sally = sallyssecret <br />最后变成： <br />[users] <br />harry = harryssecret <br />sally = sallyssecret </p>
		<p> </p>
		<h1>5，运行独立服务器 </h1>
		<p>在任意目录下运行： <br />svnserve -d -r E:\svndemo\repository 我们的服务器程序就已经启动了。<span class="ontab">注意不要关闭命令行窗口，关闭窗口也会把svnserve停止。 </span></p>
		<h1>
				<br />6，初始化导入 </h1>
		<p>来到我们想要导入的项目根目录，在这个例子里是E:\svndemo\initproject，目录下有一个readme.txt文件： </p>
		<p>
				<br />右键-&gt;TortoiseSVN-&gt;Import... <br />URL of repository输入“svn://localhost/” <br />ok <br />完成之后目录没有任何变化，如果没有报错，数据就已经全部导入到了我们刚才定义的版本库中。 </p>
		<p>需要注意的是，这一步操作可以完全在另一台安装了TortoiseSVN的主机上进行。例如运行svnserve的主机的IP是133.96.121.22，则URL部分输入的内容就是“svn://133.96.121.22/”。</p>
		<h1>
				<br />7，基本客户端操作 </h1>
		<p>取出版本库到一个工作拷贝： <br />来到任意空目录下，在本例中是E:\svndemo\wc1，运行右键-&gt;Checkout，在URL of repository中输入svn://localhost/，这样我们就得到了一份工作拷贝。 <br />在工作拷贝中作出修改并提交： <br />打开readme.txt，作出修改，然后右键-&gt;Commit...，这样我们就把修改提交到了版本库，我们可以运行。 </p>
		<p>察看所作的修改： <br />readme.txt上右键-&gt;TortoiseSVN-&gt;Show Log，这样我们就可以看到我们对这个文件所有的提交。在版本1上右键-&gt;Compare with working copy，我们可以比较工作拷贝的文件和版本1的区别。 </p>
<img src ="http://www.blogjava.net/guobin/aggbug/80441.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/guobin/" target="_blank">蝈蝈</a> 2006-11-10 16:58 <a href="http://www.blogjava.net/guobin/articles/80441.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows下Subversion配置管理员指南（二）Subversion的权限控制</title><link>http://www.blogjava.net/guobin/articles/80440.html</link><dc:creator>蝈蝈</dc:creator><author>蝈蝈</author><pubDate>Fri, 10 Nov 2006 08:57:00 GMT</pubDate><guid>http://www.blogjava.net/guobin/articles/80440.html</guid><wfw:comment>http://www.blogjava.net/guobin/comments/80440.html</wfw:comment><comments>http://www.blogjava.net/guobin/articles/80440.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/guobin/comments/commentRss/80440.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/guobin/services/trackbacks/80440.html</trackback:ping><description><![CDATA[
		<p>在阅读本文之前，请确定你已经知道了Subversion基本的服务器管理，知道了svnserve或Apache的配置，清楚如何设置用户和密码。关于svnserve的配置可以看我们的《<a class="mostread" href="http://www.subversion.org.cn/index.php?option=com_content&amp;task=view&amp;id=56&amp;Itemid=9">Subversion快速入门教程</a>》和《<a class="mostread" href="http://www.subversion.org.cn/index.php?option=com_content&amp;task=view&amp;id=78&amp;Itemid=9">用Apache 和Subversion 搭建安全的版本控制环境</a>》，对于一些细节情参考<a href="http://www.subversion.org.cn/svnbook/">《使用Subversion进行版本控制》。</a></p>
		<p>作为一个配置管理员，需要管理用户的权限，本文主要介绍了使用Subversion的授权文件“authz-db”，同时为了叙述的清晰，我首先澄清一些概念。</p>
		<h3>1，认证（Authentication）和授权（Authorization）</h3>
		<p>这两个术语经常一起出现。其中认证的意思就是鉴别用户的身份，最常见的方式就是使用用户名和密码，授权就是判断用户是否具备某种操作的权限，在Subversion里提供了“authz-db”文件，实现了以路径为基础的授权，也就是判断用户是否有操作对应路径的权限，在Subversion 1.3之后，svnserve和Apache一样都可以使用“authz-db”文件。</p>
		<h3>
				<br />2. svnserve下的配置文件</h3>
		<p>因为本文是以svnserve为例的，所以先介绍一下版本库目录的结构：</p>
		<p>D:\SVNROOT\PROJECT1<br />├─conf<br />├─dav<br />├─db<br />│  ├─revprops<br />│  ├─revs<br />│  └─transactions<br />├─hooks<br />└─locks</p>
		<p>其中conf下面有三个文件：</p>
		<p>    authz<br />    passwd<br />    svnserve.conf</p>
		<p>其中的“svnserve.conf”是这个版本库的配置文件，当使用svnserve时，这个配置文件决定了使用什么认证和授权文件：</p>
		<p>    password-db = passwd<br />    authz-db = authz</p>
		<p>上面的配置说明使用“svnserve.conf”同目录的passwd和authz，其中的password-db指定了用户密码文件，authz-db是我们的授权文件，也就是我们本文主要介绍的文件。</p>
		<p>
				<font color="#ff0000">注意：使用Apache作为服务器时，根本就不会参考“svnserve.conf”文件的内容，而是会参考Apache的配置。</font>
		</p>
		<h3>
				<br />3，基于svnserve的版本库文件布局</h3>
		<p>使用svnserve时，为了管理的方便，应该使用相同的认证和授权文件，所以应该让所有版本库的配置文件svnserve.conf指向同一个password-db和authz-db文件。下面是一个多版本库的目录：<br />D:\SVNROOT<br />├─project1<br />│  ├─conf<br />│  ├─dav<br />│  ├─db<br />│  │  ├─revprops<br />│  │  ├─revs<br />│  │  └─transactions<br />│  ├─hooks<br />│  └─locks<br />└─project2<br />    ├─conf<br />    ├─dav<br />    ├─db<br />    │  ├─revprops<br />    │  ├─revs<br />    │  └─transactions<br />    ├─hooks<br />    └─locks<br />    <br />D:\SVNROOT下有两个目录project1和project2，都已经创建了版本库，所以我们修改每个conf目录下的svnserve.conf，使之指向同一个password-db和authz-db文件。</p>
		<pre>password-db = ..\..\passwd
authz-db = ..\..\authz</pre>
		<p>这样，D:\SVNROOT\passwd和D:\SVNROOT\authz就控制了所有版本库的svnserve访问。另外在后面的操作中要关闭匿名访问，应该去掉“anon-access = none”前的“#”号，保证只有认证用户可以访问。</p>
		<p>
				<font color="#ff0000">注意：还有一点需要注意，那就是svnserve的“realm”的值，在上面的设置下，应该保证所有的版本库使用相同的realm值，这样，对版本库的密码缓存可以在多个版本库之间共享，更多细节见<span class="sect2"><a href="http://www.subversion.org.cn/svn-ch-6-sect-2.html#svn-ch-6-sect-2.2"><u><font color="#0000ff">客户端凭证缓存</font></u></a></span>。</font>
		</p>
		<h3>4，测试用户和组说明</h3>
		<p>版本库禁止任何匿名用户的访问，只对认证用户有效。</p>
		<p>root:配置管理管理员，对版本库有完全的管理权限。</p>
		<p>p1_admin1:project1的管理员，对project1有完全权限。<br />p1_d1:project1的开发者，对project1的trunk有完全的权限，但是对其中的/trunk/admin目录没有任何权限。<br />p1_t1:project1的测试者，对project1的trunk有完全的读权限，但是对其中的/trunk/admin目录没有任何权限。</p>
		<p>p2_admin1:project2的管理员，对project2有完全权限。<br />p2_d1:project2的开发者，对project2的trunk有完全的权限，但是对其中的/trunk/admin目录没有任何权限。<br />p2_t1:project2的测试者，对project2的trunk有完全的读权限，但是对其中的/trunk/admin目录没有任何权限。</p>
		<p>
				<br />对应的组及组的用户：<br />p1_group_a:p1_admin1<br />p1_group_d:p1_d1<br />p1_group_t:p1_t1<br />p2_group_a:p2_admin1<br />p2_group_d:p2_d1<br />p2_group_t:p2_t1</p>
		<p>
				<br />5，修改D:\SVNROOT\passwd文件</p>
		<p>前面已经说过了，用户和密码文件应该是在D:\SVNROOT\passwd，所以我们为每一位用户设置权限，文件内容如下：</p>
		<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
				<pre>
						<span style="COLOR: #66cc66">[</span>users<span style="COLOR: #66cc66">]</span>
p1_admin1 = p1_admin1
p1_d1 = p1_d1
p1_t1 = p1_t1
         
p2_admin1 = p2_admin1
p2_d1 = p2_d1
p2_t1 = p2_t1</pre>
		</blockquote>
		<p>为了便于验证，所有密码和用户名一致，如果你使用的是其他认证方式，这一步可能不同，但是用户名应该都是一样的。</p>
		<p>6，配置授权，修改D:\SVNROOT\authz</p>
		<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
				<p>[groups]<br /># 定义组信息</p>
				<p>p1_group_a = p1_admin1<br />p1_group_d = p1_d1<br />p1_group_t = p1_t1</p>
				<p>p2_group_a = p2_admin1<br />p2_group_d = p2_d1<br />p2_group_t = p2_t1</p>
				<p>
						<br />[/]<br /># 指定所有的版本库默认只读，root可读写<br />* = r<br />root = rw</p>
				<p>
						<br />[project1:/]<br /># 指定对版本库project1根目录的权限<br />@p1_group_a = rw<br />@p1_group_d = rw<br />@p1_group_t = r</p>
				<p>[project1:/trunk/admin]<br /># 指定对版本库project1的/trunk/admin根目录的权限，<br /># p1_group_a读写，p1_group_d和p1_group_t没有任何权限。<br />@p1_group_a = rw<br />@p1_group_d = <br />@p1_group_t = </p>
				<p>
				</p>
				<p>[project2:/]<br /># 指定对版本库project2根目录的权限<br />@p2_group_a = rw<br />@p2_group_d = rw<br />@p2_group_t = r</p>
				<p>[project2:/trunk/admin]<br /># 指定对版本库project1的/trunk/admin根目录的权限<br />@p2_group_a = rw<br />@p2_group_d = <br />@p2_group_t = </p>
		</blockquote>
		<p>
				<br />经过以上设置以后，你会发现一些有趣的事情。当使用用户“p1_d1”，检出project1的trunk时，目录是空的，好像admin目录根本不存在一样，当使用p1_d1用户浏览版本库时，能够看到admin目录，但是其中的内容却无法看到。</p>
		<p>关于中文目录，也是没有问题的，只是注意要把authz文件转化为UTF-8格式，在我的WINXP的UltraEdit里显示的文件格式为U8-DOS，具体的做法是用UltraEdit打开authz文件，然后选择“文件-&gt;转换-&gt;ASCII转UTF-8”，然后保存。</p>
		<p>再复杂的情况也不过如此，在实际的工作中要首先规划好权限，只赋给用户最小的权限，保证以最小的配置实现最复杂的权限控制。</p>
<img src ="http://www.blogjava.net/guobin/aggbug/80440.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/guobin/" target="_blank">蝈蝈</a> 2006-11-10 16:57 <a href="http://www.blogjava.net/guobin/articles/80440.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows下Subversion配置管理员指南（一）Subversion安装成service</title><link>http://www.blogjava.net/guobin/articles/80438.html</link><dc:creator>蝈蝈</dc:creator><author>蝈蝈</author><pubDate>Fri, 10 Nov 2006 08:56:00 GMT</pubDate><guid>http://www.blogjava.net/guobin/articles/80438.html</guid><wfw:comment>http://www.blogjava.net/guobin/comments/80438.html</wfw:comment><comments>http://www.blogjava.net/guobin/articles/80438.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/guobin/comments/commentRss/80438.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/guobin/services/trackbacks/80438.html</trackback:ping><description><![CDATA[
		<p>以前的svnserve要想成为windows服务，必须依赖于svnservice或其他工具。从Subversion1.4开始，Subversion本身就集成Windows服务的工具。<br /></p>
		<h3>1，安装svnservice</h3>
		<p>在Windows NT中（包括Windows XP, Windows 2000, Windows 2003 Server）本身包含了一个安装服务的工具，叫做"Service Control"，也就是sc.exe。</p>
		<p>例如我的Subversion安装在"D:\Subversion"，版本库在"D:\svnroot"，而我希望对应的Subversion服务名为svnservice，安装这个svn服务的命令就可以这样写：</p>
		<p>      sc create svnservice<br />      binpath= "D:\Subversion\bin\svnserve.exe --service -r D:\svnroot"<br />      displayname= "SVNService"<br />      depend= Tcpip<br />      <br />请注意，因为便于察看，上面的命令分为多行，但在实际执行时应该在一行里。另外，在以前启动svnserve时会使用"-d"选项，也就是守护进程模式，在这里不能使用，会导致服务无法启动。同样，"-i"和"-t"选项也不能使用。</p>
		<p>在命令行窗口执行完这个命令之后，服务还没有启动，你可以继续运行"net start svnservice"启动这个服务，然后使用"net stop svnservice"停止服务。</p>
		<p>另外还有两点需要小心处理。首先，如果路径中包括空格，一定要用“\”处理“"”号，例如上面的例子中如果svnserve.exe在“c:\program files\subversion\”中，则命令应该写为“binpath= "\"c:\program files\subversion\bin\svnserve.exe\"”（“”中的内容），整个命令如下，红色部分是改变部分：</p>
		<p>      sc create svnservice<br />      binpath= "<font color="#ff0000">\"D:\program files\Subversion\bin\svnserve.exe\"</font> --service -r D:\svnroot"<br />      displayname= "SVNService"<br />      depend= Tcpip<br />      <br />其次，sc对选项的格式还有要求，例如“depend= Tcpip”不能写为“depend = Tcpip”或“depend=Tcpip”，也就是“=”前不能有空各，而后面必须有空格。</p>
		<h3>
				<br />2，删除服务</h3>
		<p>如果服务安装的有问题，你可能需要删除服务。要删除前面添加的服务，只需要运行"net start svnservice"，"svnservice"就是我们创建服务时使用的名字。</p>
		<h3>
				<br />3，配置服务是自动启动</h3>
		<p>默认情况下安装的服务不会随Windows的启动而启动，为了使svn服务能够随Windows启动而启动，需要修改一下"sc create"命令（首先要删除），增加"start= auto"选项：</p>
		<p>      sc create svnservice<br />      binpath= "D:\Subversion\bin\svnserve.exe --service -r D:\svnroot"<br />      displayname= "SVNService"<br />      depend= Tcpip<br />      start= auto<br />      <br />当然你也可以使用图形化的工具修改服务的属性，你可以在“开始-&gt;运行...”中执行"services.msc"，然后在界面中修改。</p>
<img src ="http://www.blogjava.net/guobin/aggbug/80438.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/guobin/" target="_blank">蝈蝈</a> 2006-11-10 16:56 <a href="http://www.blogjava.net/guobin/articles/80438.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>