Subversion的配置和使用说明<o:p></o:p>
<o:p></o:p>
john
2007-08-18<o:p></o:p>
<o:p></o:p>
1. 软件下载
2. 服务器和客户端安装
3. 建立版本库(Repository)
4. 配置用户和权限
5. 运行独立服务器
6. 初始化导入
7. 基本客户端操作<o:p></o:p>
8. 分支与合并<o:p></o:p>
1,软件下载<o:p></o:p>
* 下载Subversion服务器程序。<o:p></o:p>
到官方网站的下载二进制安装文件,目前可以下载svn-1.4.4-setup.exe。<o:p></o:p>
下载地址:http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91<o:p></o:p>
此版本支持Apache2.0.x <o:p></o:p>
* 下载Subversion的Windows客户端TortoiseSVN。<o:p></o:p>
TortoiseSVN是扩展Windows Shell的一套工具,可以看作Windows资源管理器的插件,安装之后Windows就可以识别Subversion的工作目录。
官方网站是TortoiseSVN,下载方式和前面的svn服务器类似,在下载页面选择目前的最高稳定版本的安装文件TortoiseSVN-1.4.4.9706-win32-svn-1.4.4.msi,还可以sourceforge的语言下载页面中,下载简体中文语言包。<o:p></o:p>
下载地址:http://tortoisesvn.net/downloads<o:p></o:p>
<o:p></o:p>
2,服务器和客户端安装<o:p></o:p>
* 服务器安装,直接运行svn-1.4.4-setup.exe,根据提示安装即可,这样我们就有了一套服务器可以运行的环境。(由于subversion已有自带的svnserver服务器,如果需要使用Apache服务器的特性则再将其集成到apache上即可,此处我们暂时使用它自带的服务器)<o:p></o:p>
(注:apache的配置在文档最后边的附录中可以找到)
* 安装TortoiseSVN,同样直接运行TortoiseSVN-1.4.4.9706-win32-svn-1.4.4.msi按照提示安装即可,不过最后完成后会提示是否重启,其实重启只是使svn工作拷贝在windows中的特殊样式生效,与所有的实际功能无关,为了立刻看到好的效果,还是重新启动机器。<o:p></o:p>
3,建立版本库(Repository)<o:p></o:p>
运行Subversion服务器需要首先要建立一个版本库(Repository),可以看作服务器上存放数据的数据库,在安装了Subversion服务器之后,可以直接运行,如:<o:p></o:p>
svnadmin create E:\svn\sise_repository<o:p></o:p>
就会在目录E:\svn\sise_repository下创建一个版本库。<o:p></o:p>
我们也可以使用TortoiseSVN图形化的完成这一步:<o:p></o:p>
在目录E:\svn\sise_repository下"右键->TortoiseSVN->Create Repository here...“, 然后可以选择版本库模式, 这里使用默认即可, 然后就创建了一系列目录和文件。<o:p></o:p>
如图所示:<o:p></o:p>
<v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><v:shape id="_x0000_i1025" style="WIDTH: 339.75pt; HEIGHT: 300pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:/DOCUME~1/john/LOCALS~1/Temp/msoclip1/01/clip_image001.png"></v:imagedata></v:shape><o:p></o:p>
在弹出的数据仓库类型我们选择默认的FSFS,点击OK。<o:p></o:p>
<v:shape id="_x0000_i1026" style="WIDTH: 228pt; HEIGHT: 148.5pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:/DOCUME~1/john/LOCALS~1/Temp/msoclip1/01/clip_image003.png"></v:imagedata></v:shape><o:p></o:p>
4,配置用户和权限<o:p></o:p>
来到E:\svn\sise_repository\conf目录,修改svnserve.conf:<o:p></o:p>
# auth-access = write
# password-db = passwd<o:p></o:p>
改为:<o:p></o:p>
auth-access = write //通过验证的用户才能有读写的权限
password-db = passwd //验证用户所使用的文件passwd<o:p></o:p>
然后修改同目录的passwd文件,去掉下面三行的注释:<o:p></o:p>
# [users]
# harry = harryssecret
# sally = sallyssecret<o:p></o:p>
最后变成:<o:p></o:p>
[users]<o:p></o:p>
harry = 123456 //以名值的方式存储用户名和密码 “用户名=密码”
sally = 654321<o:p></o:p>
(注:以路径为授权的文件的配置)<o:p></o:p>
[groups]<o:p></o:p>
# harry_and_sally = harry,sally<o:p></o:p>
admin=john<o:p></o:p>
developer=peter<o:p></o:p>
<o:p></o:p>
# [/foo/bar]<o:p></o:p>
# harry = rw<o:p></o:p>
# * =<o:p></o:p>
[/]<o:p></o:p>
*=r<o:p></o:p>
@admin=rw<o:p></o:p>
# [repository:/baz/fuz]<o:p></o:p>
# @harry_and_sally = rw<o:p></o:p>
# * = r<o:p></o:p>
[SISEWebServices:/]<o:p></o:p>
@developer=rw<o:p></o:p>
}
5,运行独立服务器<o:p></o:p>
在任意目录下运行:(如果提示找不到svnserve则检查,%Subversion安装目录%\bin是否已添加至环境变量PATH)<o:p></o:p>
svnserve -d -r E:\svn\sise_repository\ <o:p></o:p>
我们的服务器程序就已经启动了。<o:p></o:p>
(注:可通过执行 svnserve –help 来得到svnserve的帮助信息)<o:p></o:p>
附:将svnserve安装为系统服务<o:p></o:p>
sc create svnserve binpath= "C:\developertools\Subversion\bin\svnserve.exe --service --root D:\svn\sise_repository" displayname= "Subversion" depend= Tcpip start= auto <o:p></o:p>
另外还有两点需要小心处理。首先,如果路径中包括空格,一定要用“\”处理“"”号,例如上面的例子中如果svnserve.exe在“c:\program files\subversion\”中,则命令应该写为“binpath= "\"c:\program files\subversion\bin\svnserve.exe\"”(“”中的内容),整个命令如下,红色部分是改变部分:<o:p></o:p>
sc create svnservice<o:p></o:p>
binpath= "\" C:\developertools\Subversion\bin\svnserve.exe \" --service -r D:\svnroot"
displayname= "Subversion" depend= Tcpip start= auto
其次,sc对选项的格式还有要求,例如“depend= Tcpip”不能写为“depend = Tcpip”或“depend=Tcpip”,也就是“=”前不能有空各,而后面必须有空格。<o:p></o:p>
如果服务安装的有问题,你可能需要删除服务。要删除前面添加的服务,只需要运行"sc delete svnservice","svnservice"就是我们创建服务时使用的名字。
6,初始化导入<o:p></o:p>
来到我们想要导入的项目根目录,在这个例子里是D:\MyWork \Sample,目录下有若干个文件:<o:p></o:p>
1. 右键->TortoiseSVN->Import...<o:p></o:p>
<v:shape id="_x0000_i1027" style="WIDTH: 260.25pt; HEIGHT: 267pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:/DOCUME~1/john/LOCALS~1/Temp/msoclip1/01/clip_image005.png"></v:imagedata></v:shape>
2. URL of repository输入“svn://localhost/Sample”,点击OK。<o:p></o:p>
<v:shape id="_x0000_i1028" style="WIDTH: 4in; HEIGHT: 217.5pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:/DOCUME~1/john/LOCALS~1/Temp/msoclip1/01/clip_image007.png"></v:imagedata></v:shape><o:p></o:p>
3、系统提示输入用户名和密码,这里输入harry 密码123456<o:p></o:p>
<v:shape id="_x0000_i1029" style="WIDTH: 351pt; HEIGHT: 192.75pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:/DOCUME~1/john/LOCALS~1/Temp/msoclip1/01/clip_image009.png"></v:imagedata></v:shape><o:p></o:p>
出现如下窗口表示已添加成功:<o:p></o:p>
<v:shape id="_x0000_i1030" style="WIDTH: 342pt; HEIGHT: 188.25pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:/DOCUME~1/john/LOCALS~1/Temp/msoclip1/01/clip_image011.png"></v:imagedata></v:shape>
至此初始的数据就已经全部导入到了我们刚才定义的版本库中。<o:p></o:p>
7. 基本客户端操作 <o:p></o:p>
CheckOut我们所需要的项目。在我们打算用来存放检出后的项目的文件夹上边右键点击,选择“SVN CheckOut…”。如图:<o:p></o:p>
<v:shape id="_x0000_i1031" style="WIDTH: 126pt; HEIGHT: 124.5pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:/DOCUME~1/john/LOCALS~1/Temp/msoclip1/01/clip_image013.png"></v:imagedata></v:shape><o:p></o:p>
在弹出的窗口中输入repository的URL地址和checkout后文件的存放路径,如图所示:<o:p></o:p>
<v:shape id="_x0000_i1032" style="WIDTH: 279pt; HEIGHT: 196.5pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:/DOCUME~1/john/LOCALS~1/Temp/msoclip1/01/clip_image015.png"></v:imagedata></v:shape><o:p></o:p>
点击OK,如果没有报错则表示我们已成功将文件从版本库中检出。<o:p></o:p>
检出后的文件夹将被打了特殊的标记,至此,Sample文件夹和其子目录和文件都被收纳到Subversion的管理中。<o:p></o:p>
未有改动<v:shape id="_x0000_i1033" style="WIDTH: 87.75pt; HEIGHT: 48.75pt" type="#_x0000_t75"> <v:imagedata o:title="" src="file:///C:/DOCUME~1/john/LOCALS~1/Temp/msoclip1/01/clip_image017.png"></v:imagedata></v:shape> 已有文件发生改变<v:shape id="_x0000_i1034" style="WIDTH: 116.25pt; HEIGHT: 46.5pt" type="#_x0000_t75"> <v:imagedata o:title="" src="file:///C:/DOCUME~1/john/LOCALS~1/Temp/msoclip1/01/clip_image019.png"></v:imagedata></v:shape><o:p></o:p>
1、 提交变更了的文件<o:p></o:p>
一旦我们改变了文件夹下边的某个文件时,TortoiseSVN将文件的标志换成感叹号的标记,此时如果我们希望将变更的文件提交到版本库中时,只需在文件上点击右键,选择“SVN Commit..”,在弹出的窗口中输入些次提交的信息和选择需要提交的文件(建议在所有修改过的文件的顶层目录做提交,将某一次的修改一次性提交,利用subversion的原子性可以保证项目不会存在不完整的版本)。如图所示:<o:p></o:p>
<v:shape id="_x0000_i1035" style="WIDTH: 345pt; HEIGHT: 369pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:/DOCUME~1/john/LOCALS~1/Temp/msoclip1/01/clip_image021.png"></v:imagedata></v:shape><o:p></o:p>
点击OK之后文件的变更信息便保存到了Subversion的版本库中去了。<o:p></o:p>
为了确认我们的修改已被提交到版本库,我们可以通过右键点击文件,选择“TortoiseSVN-àShow Log”,结果如图。<o:p></o:p>
<v:shape id="_x0000_i1036" style="WIDTH: 333pt; HEIGHT: 156pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:/DOCUME~1/john/LOCALS~1/Temp/msoclip1/01/clip_image023.png"></v:imagedata></v:shape><o:p></o:p>
2、 更新本地拷贝<o:p></o:p>
在文件夹或文件上右键点击选择“SVN Update”,系统将默认的将所选择的文件夹或文件更新至最新的版本。如果更新到特定的版本,可以使用“TortoiseSVN-àUpdate to revision”,在弹出的窗口中选择“Revision 并输入需更新至的版本号” <o:p></o:p>
<v:shape id="_x0000_i1037" style="WIDTH: 225pt; HEIGHT: 175.5pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:/DOCUME~1/john/LOCALS~1/Temp/msoclip1/01/clip_image025.png"></v:imagedata></v:shape> <v:shape id="_x0000_i1038" style="WIDTH: 171pt; HEIGHT: 123pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:/DOCUME~1/john/LOCALS~1/Temp/msoclip1/01/clip_image027.png"></v:imagedata></v:shape><o:p></o:p>
(注:Subversion的每一次提交对应一颗版本库树的快照,所以update至某一个revision,则是update 至某一颗版本库树的快照。)<o:p></o:p>
3、 添加新的文件或文件夹<o:p></o:p>
在新文件或文件上右键点击选择“TortoiseSVN-àAdd..”<o:p></o:p>
<v:shape id="_x0000_i1039" style="WIDTH: 287.25pt; HEIGHT: 180pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:/DOCUME~1/john/LOCALS~1/Temp/msoclip1/01/clip_image029.png"></v:imagedata></v:shape><o:p></o:p>
系统弹出确认窗口<o:p></o:p>
<v:shape id="_x0000_i1040" style="WIDTH: 233.25pt; HEIGHT: 176.25pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:/DOCUME~1/john/LOCALS~1/Temp/msoclip1/01/clip_image031.png"></v:imagedata></v:shape><o:p></o:p>
点击OK,文件夹会被标上加号,这个时候还未将其加入至版本库中去,需将其提交,右键“SVN Commit..”,此时所选择的文件或文件夹将被全部添加到版本库中去。<o:p></o:p>
4、 删除文件或文件夹<o:p></o:p>
在欲删除的文件或文件夹上右键点击,选择“TortoiseSVN-àdelete”,然后再提交,则所选择的文件或文件夹便从版本库删除了。<o:p></o:p>
5、 重命名<o:p></o:p>
如需重命名,需由需由Tortoise来做,不能直接在操作系统上重命名。在欲重命名的文件或文件上右键点击,选择“TortoiseSVN-àrename..”,在弹出的窗口中输入新的文件或文件夹名称,点击OK,将会多出一个新命名后的文件或文件夹,再将它们提交。如图(重命名是一个将原文件夹做一次复制然后删除旧文件夹将新的文件夹提交上去的过程,保留历史记录)。<o:p></o:p>
<v:shape id="_x0000_i1041" style="WIDTH: 244.5pt; HEIGHT: 68.25pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:/DOCUME~1/john/LOCALS~1/Temp/msoclip1/01/clip_image033.png"></v:imagedata></v:shape><o:p></o:p>
6、 撤销所做更改<o:p></o:p>
在编缉了某些文件或文件后,如果需要返回修改前的版本,则右键点击,选择“TortoiseSVN-àRevert..”进行撤销,将文件恢复到修改前的版本。<o:p></o:p>
7、 文件更新的冲突处理<o:p></o:p>
当你Update出现了冲突时,Subversion会产生三个文件如图,<o:p></o:p>
Filename.mine<o:p></o:p>
你更新前的文件,没有冲突标志,只是你最新更改的内容。(如果Subversion认为这个文件不可以合并,.mine文件不会创建,因为它和工作文件相同。)<o:p></o:p>
Filename.rOLDREV<o:p></o:p>
这是你做更新操作以前的BASE版本文件,就是你在上次更新之后未作更改的版本。<o:p></o:p>
Filename.rNEWREV<o:p></o:p>
这是你的Subversion客户端从服务器刚刚收到的版本,这个文件对应版本库的HEAD版本。<o:p></o:p>
这里的OLDREV是你的.svn目录中的修订版本号,NEWREV是版本库中HEAD的版本号。<o:p></o:p>
<v:shape id="_x0000_i1042" style="WIDTH: 145.5pt; HEIGHT: 69pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:/DOCUME~1/john/LOCALS~1/Temp/msoclip1/01/clip_image035.png"></v:imagedata></v:shape><o:p></o:p>
冲突的文件内容,在冲突的地方将被使用“>>>>”标志出来,用户自己进行合并的取舍。<o:p></o:p>
<v:shape id="_x0000_i1043" style="WIDTH: 354.75pt; HEIGHT: 107.25pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:/DOCUME~1/john/LOCALS~1/Temp/msoclip1/01/clip_image037.png"></v:imagedata></v:shape><o:p></o:p>
解决冲突之后,右键选择“TortoiseSVN-à resolved..”,Subversion删除冲突所产生三个文件删除,此时你才可以进行提交。( 也可以手动删除此三个文件。)<o:p></o:p>
8、 其它<o:p></o:p>
如图所示,分别对应<o:p></o:p>
Show log 显示文件或文件夹的日志信息<o:p></o:p>
Repo-browser 浏览版本库<o:p></o:p>
Check for modifications 检查出所有修改过的文件的信息<o:p></o:p>
Revision graph 图形化的版本显示<o:p></o:p>
<v:shape id="_x0000_i1044" style="WIDTH: 247.5pt; HEIGHT: 62.25pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:/DOCUME~1/john/LOCALS~1/Temp/msoclip1/01/clip_image039.png"></v:imagedata></v:shape><o:p></o:p>
9、 更改验证的用户<o:p></o:p>
在我们保存验证信息后,如果需要更换另一个用户登录,则需右键点击,选择“TortoiseSVN-à setings”,然后从左边的选项中选择“Save Data”,点击后边的Authentication data 旁边的Clear按钮清楚缓存的认证信息,下次访问时便会要求重新输入用户名和密码。<o:p></o:p>
<v:shape id="_x0000_i1045" style="WIDTH: 369pt; HEIGHT: 242.25pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:/DOCUME~1/john/LOCALS~1/Temp/msoclip1/01/clip_image041.png"></v:imagedata></v:shape><o:p></o:p>
<o:p></o:p>
附录:使用Apache Web Server 作为Subversion的服务器<o:p></o:p>
1、 在Apache的网站上下载apache 2.0.x版本;<o:p></o:p>
下载地址:http://httpd.apache.org/<o:p></o:p>
2、 安装Apache Web服务器。<o:p></o:p>
一旦你有了Apache2安装程序,你可以双击它,然后它会指导你的安装过程,请确认你输入的server的URL正确(如果你的服务器没有DNS名称,请直接输入IP地址)。我建议安装Apache为所有用户,在80端口,作为一个服务。注意:如果你已经有了IIS或其他监听80段口的程序,安装会失败,如果发生这种情况,直接到程序的安装目录\Apache Group\Apache2\conf,打开httpd.conf。编辑文件的Listen 80为其他可用的端口,例如Listen 81,然后重新启动-这样就不会那个问题了。<o:p></o:p>
现在可以测试Apache服务器了,将浏览器指向http://localhost/-将会看到一个预先配置的网站。<o:p></o:p>
3、 将Subversion集成到Apache Web Server<o:p></o:p>
首先,使用Windows资源管理器,来到Subversion的安装目录(如C:\developertools\Subversion),找到文件/httpd/mod_dav_svn.so和mod_authz_svn.so,拷贝这些文件到Apache的模块目录,(例如:C:\developertools\Apache Group\Apache2\modules)。<o:p></o:p>
接着,使用记事本之类的文本编辑器修改Apache的配置文件(例如 C:\developertools\ApacheGroup\Apache2\conf\httpd.conf),做出如下修改:<o:p></o:p>
去掉如下几行的注释(删除 '#'标记):<o:p></o:p>
#LoadModule dav_module modules/mod_dav.so<o:p></o:p>
#LoadModule dav_fs_module modules/mod_dav_fs.so<o:p></o:p>
将下面几行添加至尾部<o:p></o:p>
LoadModule dav_svn_module modules/mod_dav_svn.so<o:p></o:p>
LoadModule authz_svn_module modules/mod_authz_svn.so<o:p></o:p>
4、 配置<o:p></o:p>
现在你已经设置了Apache和Subversion,但是Apache不知道如何处理Subversion客户端,例如TortoiseSVN。为了让Apache知道哪个目录是用来作为Subversion版本库,你需要编辑Apache的配置文件<o:p></o:p>
(例如:C:\developertools\ApacheGroup\Apache2\conf\httpd.conf)<o:p></o:p>
在配置文件最后添加如下几行:<o:p></o:p>
<Location /svn> //Subversion版本库的URL是http://Server/svn/
<o:p></o:p>
DAV svn //告诉Apache是哪个模块响应那个URL的请求-此刻是Subversion模块<o:p></o:p>
SVNListParentPath on //显示所有SVNParentPath下的版本库。<o:p></o:p>
SVNParentPath D:\SVN //告诉Subversion需要查看的版本库位于D:\SVN<