1 下载并解压 apache subversion for windows “svn-win32-1.6.5.zip” (我用的是 v1.6.5),解压的目录下 readme.txt 最后部分有最 update 的安装 svn 的步骤
其实 svn 完全不需要 apache 也可以使用。下面我们先讲解下如何单独使用 svn 。
1) Add %svn_home%/bin to the SYSTEM PATH and reboot DOS窗口 (这使得在任何路径下都可以调用svn/bin 里的命令,同时也可以使得 all SVN DLLs are visible to the Apache service )
2) DOS窗口执行命令
svnadmin.exe create D:\svn_repositories\project1
它在 svn_repositories目录下创建了一个 svn库“ proejct1”,你可以看到 project1目录里生成了一系列的文件,说明创建成功。
svn_repositories还可以通过 TortoiseSVN tool来创建
3) 启动 project1的 svn
svnserve.exe -d -r D:\svn_repositories\project1
该命令将启动 project1的 svn服务
4)测试下步骤 3 svn服务是否已经启动:新开一个 DOS 窗口 ,执行:
svn info svn://127.0.0.1
若输入结果类似下列信息,表示启动成功
路径 : 127.0.0.1
URL: svn://127.0.0.1
版本库根 : svn://127.0.0.1
版本库 UUID: f0275f17-92f9-6042-b7eb-1e4b931ad31b
版本 : 0
节点种类 : 目录
最后修改的版本 : 0
最后修改的时间 : 2010-06-08 00:15:55
5)执行下列命令来尝试往 svn里 upload一个 test.txt file。(假设 d盘下有一个 test.txt file)
svn import d:/test.txt svn://127.0.0.1/test.txt -m "ADD: test file"
输出结果是 svn: 认证失败
说明 SVN的权限不对。修改 project1/conf目录下的 3个文件
svnserve.conf file:
去掉下列 4行的 #
#anon-access = read
#auth-access = write
#password-db = passwd
#authz-db = authz
注意:去掉 # 的同时,必须把这 4 行的所有前置空格也去掉,否则 upload 时就会出现错误: svnserve.conf:12: Option expected
passwd file:
在 [users]下添加:
superman = 123
authz file:
在文件最后添加
[/]
* = r
superman = rw
这样我们就创建了一个具有读写权限的 superman (pwd is 123)的帐号。
然后在步骤 3)的 dos窗口里通过 Ctrl + C来停止 svn服务,然后再执行一次步骤 3)的命令来重启 svn服务,这样才能令上面的修改生效。重启 svn服务之后再执行一次命令:
svn import d:/test.txt svn://127.0.0.1/test.txt -m "ADD: test file"
然后按提示输入用户名和密码,就会看到成功 upload test file to svn project repository。输出结果为
增加 test.txt
提交后的版本为 1 。
Check svn log command:
svn log svn://127.0.0.1/test.txt
svn 不依赖 apache. 配置 apapche, 主要时为了在线浏览代码 .
Subversion(SVN)作为一个单独的版本管理软件是不具备网页浏览功能的 。就是说,你可以用版本管理的客户端比如: TotoriseSVN 来和 SVN 服务器进行连接 。这样如果你的电脑没有安装 SVN客户端就不能使用 SVN服务器提供的服务了。为了实现请客户端的目标,就想通过网页来进行访问浏览。所以就将网页浏览的功能通过 Apache服务器来实现。而通过 Apache的插件来和 SVN进行连接后,用户可以通过浏览器访问 SVN服务器。
现在有不少的 SVN服务器软件直接提供网页功能,而且支持图形界面。我个人使用的是 VisualSVN,感觉不错,很容易管理,图形化的界面。你可以尝试下,至于 SVN 客户端你可以用 TotoriseSVN 。
NetBeans,Eclipse等开发 IDE都内置了 SVN插件,很容易用的。
下面的步骤是采用 apache来控制 svn的访问。首先必须先 stop 之前启动的 svnserve.exe 服务 ,因为我们通过 apache来访问 subversion,而不再通过 svnserve来访问
2 安装 Apache2.2 (both non-ssl and ssl are ok)
3 Copy %svn_home%/bin/mod_dav_svn.so and %svn_home%/bin/mod_authz_svn.so to the %Apache%/modules directory
4 打开 apache conf/httpd.conf,作下列修改
1)去掉下列 2行的注释
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule dav_module modules/mod_dav.so
2) add following 2 lines to the end of the LoadModule section
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
5 restart apache, 你可以在 Apache console的 status bar里出现 svn的信息,如: Apache/2.2.15(Win32)SVN/1.6.5DAV/2,这说明已经成功将 svn集成到 apache中
6 在 conf/httpd.conf里为 svn 设置虚拟目录 。 svn分为多库和单库,由于我需要为多个 project提供 svn,所以使用多库,下列的虚拟目录设置是针对多库的 。(单库和多库的区别见后面 )
<Location /svn>
DAV svn
SVNListParentPath on
SVNParentPath D:\SVN
AuthType Basic
AuthName "Subversion repositories"
AuthUserFile D:\Apache\bin\passwd
AuthzSVNAccessFile D:\Apache\bin\svnaccessfile
Require valid-user
#SSLRequireSSL
</Location>
上面的设置表示:你设置 Apache的虚拟目录 "svn",可以通过 http://localhost/svn来访问在 svn根目录 D:\SVN下的所有 svn库。 SVNParentPath是设置多个 svn库的根目录。注意:根目录下的所有 snv 库都必须通过步骤 1 > 2) 的 svnadmin.exe create 命令来创建 。
注意 :如果使用了 AuthzSVNAccessFile 设置,就无法在浏览器里显示根目录下的 svn repository list,即当你尝试访问 http://localhost/svn 时,就会出现下列错误:
You don't have permission to access /svn/ on this server
但如果你尝试访问具体某个 svn库(例如 http://localhost/svn/shorturl )则不会出错。
若你没有使用 AuthzSVNAccessFile 设置,访问 http://localhost/svn 时不会出错,它会显示 svn repository list
对上述设置逐一解释:
<Location /svn> 表示通过 URL(http://MyServer/svn)来访问 svn库,例如在 svn根目录下有一个库叫 ”shorturl”,那么可以通过 http://MyServer/svn/shorturl 访问
DAV svn 告诉 Apache哪个模块负责服务像那样的 URL--在这里就是 Subversion模块 (这个设置是固定的 )
SVNListParentPath on 在 svn 1.3及更高版本中,这个指示器使得 Subversion列出由 SVNParentPath指定的目录下所有的 svn库
SVNParentPath D:\SVN 设置 svn的根目录,所有 svn库都放在该目录下
AuthType Basic 启用基本的验证,比如用户名 /密码对
AuthName "Subversion Repository" 当一个验证对话框弹出时,告诉用户这个验证是用来做什么的
AuthzSVNAccessFile D:\Apache\bin\svnaccessfile 非常重要,指定 svn 库的访问控制文件,该文件可以使得对 svn 库的访问控制更为细致 ,比如分 group,哪些 group可以访问哪些 svn库,拥有什么权限等。 SVNAccessFile文件后面会有讲解。
AuthUserFile d:\apache\bin\passwd 指定密码文件的 path,该文件用来存储验证用户的用户名及密码。创建用户密码以及存储的文件后面会有讲解
Require valid-user 限定用户只有输入正确的用户名及密码后才能访问这个路径
SSLRequireSSL 禁用无 SSL的 http访问方式,而只允许通过 https访问
· 创建“ AuthUserFile ”设置所需的用户密码以及存储的文件
使用 apache bin/htpasswd 命令来创建。命令的格式为
htpasswd [-cmdpsD] passwordfile username
若第一次创建用户,我们必须使用参数“ c”来同时创建用户密码文件
htpasswd -c passwd robert
上述命令创建的一个文件“ passwd”,同时在文件里添加了一个 user named “robert”,执行该命令时会要求输入密码。
注意:创建第二或之后的用户时,一定不能用参数“ c ”,否则之前的用户就会被删除。
如果想要删除某个用户,我们可以使用下列命令:
htpasswd -D passwd robert
这样, robert就被从 passwd中删除了。
· 创建“ AuthzSVNAccessFile ”设置所需的分组权限管理文件 。
用户密码文件只是用来控制是否给用户访问,但并没有权限控制,分组权限管理文件则起到分组权限控制的功能。
例如有时,我们希望能够将多个开发人员编为一组,使用组的方式来为项目设定权限。比如 projectA项目只有属于 groupA的成员才可以存取 .
下面是一个典型的 svnaccessfile例子
//define groups
[groups]
developers = user1,user2,user3,user4
docs = user5,user6,user7
team1=user1,user2,user7
#to allow everyone read access
#allow all developers complete access
[/]
* = r
@developers = rw
#give the doc people write access to the docs folder
[/project/trunk/doc]
@docs = rw
#give team 1 people write access to svn “project1” repository under svn root folder
[project1:/]
@team1 = rw
上面设置表示:
1. 定义了3个 groups “developers”, “docs” and “team1”
2. [/] 表示对于整个 svn 下的目录, * = r 表示所有 user 都有只读权限, @developers = rw 表示 developers group 具有读写权限。
3. docs group 只对于 [/project/trunk/doc] 目录具有读写权限
4. [project1:/] 表示 svn 根目录下的“ project1” svn repository ( is it correct?? )
注意:对组设置权限需加 @ ,用户不需要。
TortoiseSVN --- SVN Client Side Tool for windows
安装很简单:下载,运行然后重启电脑即可。
使用 TortoiseSVN大多数都是通过 right click来完成的。
详见
http://www.uml.org.cn/pzgl/200904246.asp
http://www.subversion.org.cn/tsvndoc/
用TortoiseSVN创建branch/tag/trunk
http://blog.miniasp.com/post/2010/01/Subversion-Branches-and-Merging-using-TortoiseSVN.aspx
http://www.seo-help.cn/blog/id/54
http://www.svn8.com/svnjs/20081216/1713.html
TortoiseSVN animiation guide:
http://www.jiayun.org/tutorials/tortoisesvn.htm
SVN 基本指令教學
http://plog.longwin.com.tw/my_note-programming/2007/07/10/svn_tutorial_2007
用TortoiseSVN来进行svn的最简单的流程操作:
1. 现在svn server为一个project创建一个repository
2. 如果还没有往svn repository放东东,那么就用TortoiseSVN的"import"来首次放入,version is 1
3. 这样所有的developer都可以在本地创建一个workspace目录,然后使用TortoiseSVN的"SVN Checkout",来从svn server repository下载最新版本的东东
4. 每次在本地修改代码之前,养成习惯先run TortoiseSVN的 "SVN update"来先获取最新版本的东东
5. 修改了代码之后,通过TortoiseSVN的"SVN Commit"来上传新版本
SVN 单库与多库的比较 (来自网上)
|
单库 |
多库 |
描述 |
N个项目 放在一个版本库管理 ,任何一个项目有提交,整体版本号随之增长。 |
N个项目独立管理,他们分别由自己的用户 和权限设置文件 ,任何一个版本库的修改不会影响到任何其他版本库。 |
权限的配置 |
是对单库中每一个文件夹对每组人员进行权 限设置。单库中项目不断增加,客户端 使用人员的数量也在不断增长,而配置权限的工作 又是手工来完成,难免会出现一些错误,那么安全性就受到了威胁。但出现错误毕竟只是一种假设,不能因为一种假设的后果就放弃他潜在的诸多便利。 |
每一个库都单独配置权限,由于是多库,必 然使用每个库的人员相对单一,配置每个库的权限的时候就只是在最顶层目录 开放读写权限。 |
备份 |
不管是完全备份还是增量备份,单库之需要 执行一次就完成了所有项目的备份,每次只生成一个备份文件。我所提倡的是完全备份,每次完全备份后,把上次的备份文件删除 即可。 |
定期要对 n个版本库进行备份,版本库数量太大,每次要生成 n个版本库,未免显得凌乱。如果采用完全备份,那 么每次备份后都要逐一把每个版本库上一次所生成的备份文件删掉,很麻烦。如果采用增量备份,在几个月后每个版本库都有好多个备份文件,更凌乱。 |
用户登录问题 |
|
需要访问 多个版本库的用户不存在跳转于几个版本库间重复身份 验证的问题。 |
版本号 |
A项目的版本号随着其它项目提交的修改而增长,我认为这对于 A 项目的程序员不会造成任何的不便。因为他在察看日志 或者版本库浏览器 的时候只能看到属于自己项目的目录和文件,和提 交日志。只要提交修改的时候日志信息足够细致就不会对日后查找某次变更造成困难。 |
每个版本库互不相扰。 |
恢复修改 |
假设现在版本号为 100,程序员认为 NO.50处的修改有误,想要撤销,他撤销自己曾经 修改过的,并不会把 NO.51~NO.100的修改也撤销掉,所以他的撤销不影响其他项目工作。 |
|
下面的部分可能与上面的表格的讲解有冲突。
多库
一般都是指在一个根目录下创建多个子目录,每个子目录作为一个库,但这些库又共用根目录(也可以是其它目录)下的配置文件
优点:不需要修改 apche 的配置文件,也不需要重新启动 apache ,每次要添加新的库的时候只要在根目录下创建一个新的子目录,然后修改根目录下的配置文件就可以了,并且各个库的版本号是独立的 。
缺点:如果不是 apache 的服务器,可能看不到根目录,也就是说不能浏览到所有的库列表,另外就是备份、配置起来要复杂些。
单库
一个根目录就是一个库,下面的子目录对应不同的项目,只有一个配置文件,所以对项目的控制也就是对子目录的控制。
优点:不需要修改 apche 的配置文件,也不需要重新启动 apache,每次要添加新的库的时候只要在根目录下创建一个新的子目录,然后修改根目录下的配置文件就可以了,并且备份起来方便。
缺点:版本号更新不是独立的,所有的项目共用一个版本号,只要有一个项目更新,版本号就会更新,不利于单独项目的版本控制和操作。
多个单库
则是每个目录是一个库,对应一个项目,包括一个配置文件。
优点:把目录、配置、版本号与项目统一起来
缺点:添加库的时候需要修改 apache 的配置文件