subversion svn - IT博客网

来源:百度文库 编辑:神马文学网 时间:2024/04/29 04:08:41
用 Apache 和 Subversion 搭建安全的版本控制环境 ---ibm
摘要: 级别: 中级 吴 玥...  阅读全文posted @2006-09-15 14:36 subversion 阅读(299) |评论 (1) | 编辑 收藏
2006年9月12日
Apache2+Subversion1.3.x安装手记
一、安装
第一次安装Subversion,在昨天的安装过程中,出现了一些问题:
第一步,安装Apache+Subversion
首先,我选择了apache_2.2.3+svn-1.3.2的组合。开始安装Apache server就报错,提示http.conf第133行出错,打开在前面加了个#,启动成功。接着安装svn-1.3.2,配置好httpd.conf之后发现apche的服务无法启动,说是无法加载mod_dav_svn.so。baidu之后发现是svn无法在apache2.2下面安装,其官方下载页面也有提示说:Note that the Apache modules included in this package was compiled against Apache HTTP Server 2.0, and thus will not work with Apache HTTP Server 2.2.下载的过程中,没注意这个东西!下次得多留意这些细节。
只好重新下载安装apache_2.0.59版本,把Subversion/bin下面所有.dll文件复制到Apache Group\Apache2\bin下,提示有文件覆盖,选择不覆盖;再将Subversion/bin下的.so文件复制到Apache Group\Apache2\modules下。
第二步,修改apache的配置文件
接著打开Apache HTTP Server 的 httpd.conf(在 /conf/ 目录下),先找到以下两行:
#LoadModule dav_module modules/mod_dav.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
把這两行最前面的 '#' 字符刪除,然后把下面这行加到这些 LoadModule 指令的后面:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
用记事本打开 Apache HTTP Server 的 httpd.conf,在文件最后面加上以下几行:

DAV svn
SVNParentPath d:/svn

其中d:/svn为你要建的仓库的父目录(必须为本地目录),最好用双引号引一下.
第三步,创建仓库
根据apache的配置文件的设置建立目录:d:/svn.然后我们就可以在下面建立仓库了,创建方法如下:
c:\>svnadmin create d:/svn/repository
命令执行成功之后,会在d:/svn/repository下面生成很多的文件和目录
第四步,使用
重新启动Apache Server
在浏览器中输入网址:
http://localhost/svn/repository/
这时候,看到页面显示:
Revision 0: /
Powered bySubversion version 1.3.2 (r19776).
安装成功,接下来将进行进一步的设置。
二、配置
1.  以两种方式运行
(1) 以apache方式运行
svn使用apache的权限管理对档案库及目录进行读写管理。
建立保存用户名和密码的文件
htpasswd -c  /svn-auth-filename username1
然后,会提示输入密码,这里就加入了一个用户了。然后再加一个用户:
htpasswd -m  /svn-auth-filename username2
建立控制用户访问权限的文件svn-access-filename
[svn1:/]               //这表示,仓库svn1的根目录下的访问权限
harry = rw             // svn1仓库harry用户具有读和写权限
sally = r               // svn1仓库sally用户具有读权限
[svn2:/]               //svn2仓库根目录下的访问权限
harry = r               // harry用户在svn2仓库根目录下只有读权限
sally =               // sally用户在 svn2仓库根目录下无任何权限
[svn2:/src]           //svn2仓库下src目录的访问权限
harry=rw
sally=r
[/]                  // 这个表示在所有仓库的根目录下
* = r               // 这个表示对所有的用户都具有读权限
[groups]               // 这个表示群组设置
svn1-developers = harry, sally           // 这个表示某群组里的成员
svn2-developers = sally
[svn1:/]
@svn1-developers = rw       // 如果在前面加上@符号,则表示这是个群组权限设置
然后修改httpd.conf配置:

DAV svn
SVNParentPath /svn
AuthType Basic
AuthName “Subversion repository”
AuthUserFile /svn-auth-filename (保存用户名和密码)
Require valid-user
AuthzSVNAccessFile /svn-access-filename(保存用户访问的权限策略)

(注:)
/svn-auth-filename 文件直接可以放到C:\Program Files\Apache Group\Apache2\下,这也是默认的目录,置于其他目录下,启动apache server出现错错误。
AuthUserFile文件需要用htpasswd工具创建、维护;AuthzSVNAccessFile 文件可以用Subversion创建仓库以后,生成的conf文件夹下面的authz文件加以修改。
如果已经有一个apache服务,希望两个apache服务同时运行,则修改其中一个的服务端口。
修改httpd.conf中的一行: Listen 80 将80改成其他不用的端口号
启动apahce就可以通过
http://svnmachine-ip/svn/svn1
http://svnmachine-ip/svn/svn2
这两个URL来访问仓库了,当然,要受权限的限制,必须是合法用户才能访问且具有相应的权限
(2) svnserve方式运行
这种方式的运行又可以分为以下两种(这和vsftp有些相似)
1) standalone mode
直接运行 #svnserve –d
运行 lsof -i :3690可以看到SVN服务器已经在运行
2) xinetd mode
在/etc/xinetd.d/下生成svnserve文件,内容如下
service svnserve
{
disable = no
socket_type = stream
protocol = tcp
wait = no
user = svnpub  (最好建一个这样的用户管理svn)
server = /usr/local/bin/svnserve
server_args = -i
}
编辑 /etc/services 檔,加入底下两行:
svnserve 3690/tcp # Subversion svnserve
svnserve 3690/udp # Subversion svnserve
重启xinetd服务,运行 netstat -a|grep svnserve 可以看到SVN服务器已经在运行
默认下客户可以以匿名方式通过svn://方式任意访问档案库,为了限制其权限,比如只允许读操作,可以通过修改档案库conf子目录中的svnseve.conf文件来实现。
#vi /svn1/conf/svnseve.conf
将下面三行前的#去掉
anon-access = none            //则匿名用户不可以通过svn://方式访问档案库
auth-access = write
password-db = passwd          //使用passwd中的用户名和密码进行认证,有一点不好的是这里面的密码输的是明文
authz-db = authz              //使用authz中的权限控制策略,写法如同apache中的svn-access-filename
如果想更强的安全性可以使用svn+ssh://访问机制。
首当用户通过svn+ssh://访问时,服务器会自动启动ssh认证机制,要求用户输入密码,对于window用户来说还需要安装第三方软件openssh,才可以采用这种机制。
2.  将代码导入项目仓库。在要导入仓库的目录上面点击右键,点击TortoiseSVN项的子菜单Import…在URl里面填写http://服务器IP/svn/project,这里project就是刚刚建立的项目仓库,
在下面填入注释,点击OK,弹出提示输入用户名密码对话框,填入flmn和password,就可以把代码导入仓库了。刚刚导入的文件并没有显示被svn管理,现在把这个目录里文件都删除,再在右键菜单里选择SVN Checkout…就可以导出代码,再看这个目录,就有个小图标在文件夹图标下面了。
3.  对于其它操作,和CVS差不多,这里就不赘述了。可以参考TortoiseSVN帮助文件。
posted @2006-09-12 18:54 subversion 阅读(245) |评论 (0) | 编辑 收藏
SVN使用技巧
Submitted by xyz黑板 on 星期一, 一月 9, 2006 - 11:17随笔
这里不好排版,大家可以在附件中下载排好版的教程。
程序员编写程序的过程中,每个程序都会有很多不同的版本,这就需要程序员很好的管理代码,在需要的时间可以取出需要的版本,并且每个版本都有一个完整的说明。
我们使用Sub Version(简称SVN)作为版本管理工具。这里着重介绍SVN作为跨平台的多人协作使用方法。在多个程序员管理同一段代码的过程中,版本的管理显得尤为重要,使用SVN可以方便的进行分支、合并,记录下所有的版本。
基本配置在开始某项软件、文档的开发与撰写时,首先由配置管理负责人建立SVN仓库、用户名及其权限,并通知相关人员SVN仓库地址、SVN仓库负责人。
SVN仓库的负责人把工程的tsvn:logminisize设置为1,以便强制注释。设置方法:在你的工程文件夹右键->属性中,进入Subversion标签,选中tsvn: logminisize,确保复选框recursive选中,然后点击Set按钮把它的值设为1,其意思是指提交的注释最短长度为一个字。如图:

图2.1
软件配置l        忽略文件
在SVN 的[Setting]的[General]中,设置需要忽略的文件以便忽略掉一些临时的、无用的文件,常被忽略的文件有*.opt *.ncb *.suo *.plg *.pch *.idb *.pdb *.scc *.obj Debug Release *.o *.bin *.out *.ilk *.aps debug release *.clw *.bak。每个程序员可以根据自己的需要进行修改忽略文件,上面只是使用VC++与Tornado编程时常用的一些忽略文件。
图2.2
以上说的忽略文件是指全局的忽略文件。SVN还能在特定的目录中指定需要忽略的文件。忽略文件支持通配符。
l        合并比较工具
在Merge Tool中可以选择用来合并的工具,强烈推荐用Araxis Merge。在[Setting]->[Diff]中填入"C:\Program Files\Araxis\Araxis Merge v6.5\Merge.exe";在[Setting]->[Merge]的选项中,填入"C:\Program Files\Araxis\Araxis Merge v6.5\Merge.exe" %theirs %mine %merged ;其中"C:\Program Files\Araxis\Araxis Merge v6.5\Merge.exe"是指合并工具的路径,%theirs %mine %merged分别指..将要合并到主干的分支,主干,及合并后的结果。

图2.3
仓库目录结构SVN仓库的负责人规划好仓库的目录结构。推荐的目录结构如下图所示。
仓库的一级目录只有两个,分别为code和doc。其中,doc主要用来放置先期的文档,code主要用来放置工程的代码,也可以包含后期的文档。
仓库的二级目录只可以是branch与trunk两个目录,分别存放主干与分支。trunk目录下直接存放工程文件。branch目录下包括一些子目录分别对应各个分支。

图2.4
从SVN仓库中取出代码时,一定不要把整个仓库取出来,而应该只取出trunk目录,或只取出branch下的某个分支目录(比如上图中的svn:\\code\branch\xw_051206)。
一个项目会有多个人共同合作开发完成。基本流程是:
l        各开发成员建立自己的分支,并在此分支上开发;
l        各开发成员把分支合并到主干上并形成较为稳定的版本;
l        各个成员重新从主干上建立新的分支,在此分支上开发(即回到第一步)
l        循环往复,直到工程结束。
下面我用一个例子来说明合作开发的基本流程。
现在xb与lzj两个开发人员要共同开发一个工程onlytest,其这个工程的主干的SVN仓库地址如下图。

图2.5
xb与lzj分别在onlytest这个工程中建立两个分支,分别为xb _051115和lz_051115。
在这里分支命名要采用[姓名缩写_6个数的日期_后缀(可选)]的形式,比如xb_051208_1,xb_051212之类的。创建完分支后我们可以看到这个工程的目录结构如下图所示:

图2.6分支目录
建完之后, xb和lzj分别在本地取出对应的分支进行开发。
当程序到达一个比较稳定的阶段,就需要把分支合并到主干上,下面讲述一下合并的流程。
在本节中继续使用上一节中所示的工程与SVN仓库讲解。
1.2.3.1 xb与lzj分别修改自己分支上的代码现在,主干上的test_SVN.txt是空文档。
由xb与lzj修改提交后,两个分支中test_SVN.txt分别如下两图所示:

图2.7 xb_051129分支下的test_SVN.txt

图2.8 lzj_051129分支下的test_SVN.txt
1.2.3.2 xb将xb_051129分支合并到主干xb先把主干check out到本地。然后在主干的目录上右键选择svn->merge,弹出如下窗口:

图2.9合并对话框
此对话框的含义是把From指定的分支版本到To指定的分支版本之间的差异合并到主干上。
在这里分支选的是xb_051129。版本号的选定方法是点击From中的Show Log,在Log窗口中按住Ctrl键,点击选择”made a copy”之上的那个版本,以及最顶上的那个版本,如图2.11所示。然后点击确定回到上图中的对话框,会自动填写From与To中的Revision号。

2.10选择需要合并的版本
然后直接点击merge进行合并,你也可以通过dry run来看是不是两者之间有差异。由于没有其它人修改主干,所以合并的很顺利,下图是xb_051115与主干合并后的结果。合并完毕之后,由xb对主干进行提交。

图2.11合并后,主干上的test_SVN.txt
1.2.3.3 lzj将lzj_051129分支合并到主干,解决冲突xb合并完毕之后,lzj要将他的分支合并到主干上去,方法同上。但是由于xb已经修改过主干,所以产生了冲突,会弹出一个冲突对话框。双击对话框中的产生冲突的文件名,就可以调出工具对此文件进行合并,下图是我们用merge工具显示的界面。

图2.12
l        首先比较第一个窗口与第二个窗口,把结果修改合并到第二个窗口。
l        然后确保光标处于第二个窗口时,点击上图中红色圈圈所示的按钮。这样会把第二个窗口的内容全部复制到第三个容口。之后保存,退出。
l        然后在工程目录上点右键,进行SVN->Resolved。这样会删除无用的临时文件。
l        最后提交所作的修改,并添加详细的注释。
中的标签与CVS不同,使用SVN时不用专门为目录添加标签,因为SVN也对目录进行版本管理。
我们在提交时写好注释(比如重要的版本提交时使用051201之类的日期作为开头),就可以通过注释来查找比较重要的目录版本号,相当于CVS或VSS中的标签。
另外,每个工程都会有一个版本说明文件,通过此文件可以查找关键版本。
你可以重命名、移动或删除你的文件或文件夹,但请使用SVN进行这些操作,否则之前的版本信息会丢失。
使用SVN删除、移动与重命名文件夹的方法是在文件/文件夹上点右键进行SVN操作,或直接在资源浏览器中使用右键拖放(会弹出SVN选项)。
文件的删除、移动与重命名之前,必须保证工作目录是最新的版本;进行这些操作之后,需要进行提交。
1.3.3 版本的回退在代码的编写过程中,难免会有不尽人意的地方,你也许需要回退到某一个版本,但是在这个过程中可能有一些文件你想保留,也有一些文件你不想保留,这就牵扯到很复杂的版本管理过程,在这里给大家推荐几种方法。
1.        若是你编辑了工程,在没有提交的前提下,你想放弃这些修改,你可以直接选择revert就可以更新到工程的最新的版本。
2.        若是你想退回到某一个版本,你就可以直接选择update to reversion如图,这样我们就可以把我们的版本回退到你选中的版本去,这种情况下SVN并没有显示出有什么冲突,并且新建立的文件也还在,但是在这种情况下你并不能直接在你回退后的版本上进行编辑,因为SVN的版本控制还是在最新的主干上。我们需要update并解决冲突。
3.        你可以直接选择revert changes from this revision如图,这样的话你可以直接解决冲突并提交。不过这种方法的不足是,你新建的文件都没有了,整个工程都回退到之前的版本了。
4.        我推荐的一种方法是,直接export一个你需要的版本,然后用你export的版本覆盖你的最新的版本,这样你就可以不丢失你新建的文件,同时获得head的SVN控制文件。

图13
每个工程会有很多个小模块,当某个模块达到稳定的时候,你就需要提交一次,以免写下个模块代码的时候出现不可恢复的错误。
每一次提交需要前,需要通过pclint检查,保证是一个编译没有错误的版本。当提交比较稳定的版本的时候,同时要修改你的版本号。
1.3.5 版本说明文件版本说明文件为xml表格,可用excel编辑,它会记录下关键的版本信息。
版本说明文件内容如下表。发布版本是指用户对外公布的版本号,后文中有详细描述;Revision是SVN内部的工程文件夹的版本号。一个发布版本可能对应多个Revision:
发布版本
Revision
详细说明
1,0,0,12
76
加入了抗干扰日志,需长时间测试
程序代码进行了重构,已经调试通过
77
xxx @#$%^&
78
啥...
1,0,0,13
81
测试过的稳定版本
1,0,0,14
99
fix some bug,没有测试
附件 大小
svn版本管理教程.rar 474.51 KB
7674 reads
So Good! Your Article.
Submitted by ALLKILL (没有被验证) on 星期四, 四月 13, 2006 - 23:31
So Good! Your Article.
回复
Thank you. And The New Ver
Submitted by xyz黑板 on 星期五, 四月 14, 2006 - 00:05
Thank you.
And The New Version of TSVN has a little good change, I will rebuild this article when I have time
回复
very well and thank you !
Submitted by Anonymous (没有被验证) on 星期四, 四月 20, 2006 - 14:30
very well and thank you !
回复
Thank you for your Article.It
Submitted by Anonymous (没有被验证) on 星期四, 六月 8, 2006 - 16:08
Thank you for your Article.It's very userful.
回复
不错的文章,但我对你
Submitted byyeyuboy (没有被验证) on 星期日, 七月 9, 2006 - 00:36
不错的文章,但我对你所说的多人开发的基本流程不太赞同,SubVersion Book 上说,分支是在对项目有长期或试验性的更改时才使用.
成员应该是在主干上进行修改的,这样使用分支不会导致合并时冲突频繁吗?将分支合并进主干很麻烦(相对于简单地一个commit),这不就会导致成员不再极积频繁地进行合并呢(这导致一旦进行合并冲突的可能性会更大,成员间的交流不畅,恶性循环.)?
回复
thanks
Submitted by Anonymous (没有被验证) on 星期五, 八月 11, 2006 - 14:52
thanks
回复
对我非常有用的文档
Submitted by summer rain (没有被验证) on 星期一, 八月 28, 2006 - 15:22
对我非常有用的文档。
请问如何才能在虚拟机上进行SVN操作呢?
回复
好东东,Many Thanks
Submitted by Jelly (没有被验证) on 星期四, 九月 7, 2006 - 17:50
好东东,Many Thanks
回复
TortoiseSVN和资源管理器
Submitted byxmpp (没有被验证) on 星期六, 九月 9, 2006 - 22:59
TortoiseSVN和资源管理器整合在一起,有时候更新有问题,我觉得subclipse(eclipse的svn插件)更好用。
posted @2006-09-12 16:05 subversion 阅读(247) |评论 (0) | 编辑 收藏
2006年9月11日
svn学习笔记
Subversion 系统
多年来,并发版本系统(CVS)一直是在Linux上管理代码或者文本的标准。作为基于RCS上建立但却允许多用户协作的系统而言,CVS记录所有文件的修改信息。这对于程序开发者、网络设计者和系统管理员而言,是非常有用的。
然而,CVS逐渐显示出它的衰老,出现了相似的源代码管理软件。然而大多这种东西都是以牟利为主要目的的。
Subversion就是一种相对新鲜的源代码管理系统。虽然事实上它还在不断的反展之中,但是Subversion已经是一个非常稳定而且成熟的产品。它是一个全新的系统,其功能可以和CVS媲美,同时,它要比CVS更直观,更容易操作。本文就Subversion的安装和一些特殊功能作一个介绍。
安装服务器端
下载Apache和SVN源码包
从官方网站台下载httpd-2.0.52.tar.gz,subversion-1.1.1.tar.gz
(因为redhat 9默认安装的Apache没有并包含--enable-so选项,所以无法产生mod_dav_svn.没有这个模块,SVN就无法采用http方式运行,所以必须重新编译新的Apache)
以root身份执行:
#tar zxvf httpd-2.0.52.tar.gz
#cd httpd-2.0.52
#./configure --enable-dav --enable-so --enable-maintainer-mode
#make
#make install
此时会产生/usr/local/apache2目录,接着执行:
#tar zxvf subversion-1.1.1.tar.gz
#./configure --with-apxs=/usr/local/apache2/bin/apxs
# rm /usr/local/lib/libsvn*
# make clean && make && make install
此时会自动在/usr/local/apache2/conf/httpd.conf添加
LoadModule dav_svn_module modules/mod_dav_svn.so
安装完成后,运行svnserver --version确认版本为1.1.1。
SVN服务器安装结束.
安装客户机端
window客户机:
直接安装TortoiseSVN-1.1.1-UNICODE_svn-1.1.1.msi,方法同一般软件安装相同。
Linux客户机:
方法舆安装服务器相同。
(注意redhat 9默认安装的SVN版本为0.17.1,它的客户端命令svn无法舆新的SVN服务器通讯,必须重新安装)
建立仓库Repository
Subversion 的档案库是个中央仓储, 用来存放任意数量项目的受版本控管资料,建立方法很简单
#svnadmin create path/to/repos
举个例子:
#svnadmin create /home/mysvn
#chown ?R nobody /home/mysvn
运行服务器
Subversion服务器有两种运行方式,一是可以作为Apache 2.0的一个模块, 以WebDAV/DeltaV协议与外界连通;另外,也可使用Subversion 自带的小型服务器程序svnserve。该程序使用的是自带的通讯协议,可以很容易地透过SSH以
以http方式运行
在/usr/local/apache2/conf/httpd.conf中加入:
;
DAV svn
SVNPath /home/mysvn
;
在服务器的浏览器中输入网址:
http://localhost/svn/repository/
这时候,你会看到这样的显示:
这表明服务器已经以http方式正常运行了.
以svnserve方式运行
这种方式的运行又可以分为以下两种(这和vsftp有些相似)
1) standalone mode
直接运行 #svnserve ?d
运行 lsof -i :3690可以看到SVN服务器已经在运行
2) xinetd mode
在/etc/xinetd.d/下生成svnserve文件,内容如下
service svnserve
{
disable = no
socket_type = stream
protocol = tcp
wait = no
user = apache
server = /usr/local/bin/svnserve
server_args = -i
}
编辑 /etc/services ?,加入底下两行:
svnserve 3690/tcp # Subversion svnserve
svnserve 3690/udp # Subversion svnserve
重启xinetd服务,运行 lsof -i :3690可以看到SVN服务器已经在运行
客户机访问
客户机的访问方法舆服务器的运行方式有直接关系
window客户机:
1) 服务器以http方式运行
安装完TortoiseSVN-1.1.1-UNICODE_svn-1.1.1.msi后,在你想工作的目录下点击右键,执行checkout,按上图输入即可。
2) 服务器以svnserve方式运行
同上的区别只是URL of repository变为 svn://svn服务器ip/home/mysvn
或者 svn+ssh://svn服务器ip/home/mysvn
(注意不是//svn服务器ip//svn/repository)
linux客户机:
1) 服务器以http方式运行
执行 #svn checkout http: //svn服务器ip/svn/repository
2) 服务器以svnserve方式运行
执行 #svn checkout svn://svn服务器ip/home/mysvn
或者 #svn checkout svn+ssh://svn服务器ip/home/mysvn
客户认证机制
这舆服务器的运行方式有关
服务器以http方式运行
比如我们想给 Sally 与 Harry 送交存取档案库的权限. 首先, 我们必须把它们加入到密码档案.
# ### 第一次: 以 -c 建立档案
# htpasswd -c /etc/svn-auth-file harry
New password: *****
Re-type new password: *****
Adding password for user harry
# htpasswd /etc/svn-auth-file sally
New password: *******
Re-type new password: *******
Adding password for user sally
#
接着,在/usr/local/apache2/conf/httpd.conf的加入:
;
DAV svn
SVNPath /home/mycvs
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /etc/svn-auth-file
Require valid-user
;
重新激活 Apache后,如果有人要访问SVN服务器,系统会要求他输入用户名和密码。 只有输入Sally 或Harry的用户名和相应的密码,才可以对档案库进行修改和访问
服务器以svnserve方式运行
默认下客户可以以匿名方式通过svn://方式任意访问档案库,为了限制其权限,比如只允许读操作,可以通过修改档案库conf子目录中的svnseve.conf文件来实现。
#vi /home/mysvn/conf/svnseve.conf
修改[general]字段下内容为:
anon-access = read
如果设为anon-access = none,则匿名用户不可以通过svn://方式访问档案库
为了实现用户认证,我们一般采用svn+ssh://访问机制。
首先在svnseve.conf文件设置anon-access = none禁止匿名用户通过svn://方式访问档案库,然后在其后加入
auth-access = write
auth-access 是限制有援权的使用者(使用svn+ssh:// 来登入) 的存取权限,我们设为是可以读写。
当用户通过svn+ssh://访问时,服务器会自动激活ssh认证机制,要求用户输入密码,对于window用户来说还需要安装第三方软件openssh,才可以采用这种机制
Hook scripts
挂勾 (hook) 是改动档案库时所触发的程序, 比如当你提交更动前,会先触发pre-commit,提交更动后,则会触发post-commit,我们可以利用hook来实现一些自动控制。档案库的hook 子目录中, 预设是放置各个档案库挂勾的模板:
post-commit.tmpl
pre-revprop-change.tmpl
post-revprop-change.tmpl
start-commit.tmpl
pre-commit.tmpl
如果要使用这些hook,就必须把它的后缀名.tmpl去掉,拷贝为
post-commit
pre-revprop-change
post-revprop-change
start-commit
pre-commit
这里主要介绍pre-commit和post-commit(事实上它们就是在特定的情况下被触发的普通的shell程序,至于shell的内容由用户自己随意编写,但是要保证名称不能改动)
pre-commit
本挂勾执行的时间为异动完成之后, 送交之前.档案库会传递两个自变量给这个程序: 档案库的路径, 以及准备送交的异动名称. 如果程序传回一个非零的结束值, 送交会被中止, 而异动会被删除.
如何应用pre-commit我们不妨举个例子:
假如有一个项目由Mail Team,Login Team和PHP Team三个Team共同通过SVN系统开发完成。当项目准备发布的时候, PM人员发现Mail功能方面存在一些 bug,需要Mail Team去修改,为了防止其它Team的人员修改系统,我们可以在任何改动档案库的企图之前用pre-commit去检查log message信息,(因为任何更动档案库的操作都必须提供log message信息,PM可以事先舆 Mail Team约定好一个log message),如果舆pre-commit中设定的log message不相符,则不能提交更动。
pre-commit源程序如下:
#!/bin/sh
REPOS="$1"
TXN="$2"
SVNLOOK=/usr/local/bin/svnlook
$SVNLOOK log -t "$TXN" "$REPOS" | \
grep ?w "bug1234" >; /dev/null || exit 1
exit 0
本例中的log message为”bug1234”,任何人想要提交更动就必须用 ?m “bug1234”参数,采用-m “bug123”,-m “bug12345”都会提交失败。
post-commit
本挂勾执行的时间是在异动送交, 新修订版被建立之后. 大多数的人用这个挂勾来寄出关于本次送交的电子邮件, 或是建立档案库的备份. 档案库会传递两个自变量给这个程序: 档案库的路径, 以及新建立的修订版号. 本程序的结束码会被忽略.
Subversion 源码树的 tools/hook-script 目录中包含了一个 commit-email.pl 命令,可以用来寄送包含描述指定送交的电子邮件. 这个邮件包含了更动路径列表, 该送交所对应的记录讯息, 使用者, 送交的日期,以及一个以 GNU diff 样式表示的本次更动差异. 我们可以将这个程序舆post-commit这个hook搭配起来使用来实现档案库更动后自动mail给相关人员的功能。
post-commit源程序如下:
#!/bin/sh
REPOS="$1"
REV="$2"
commit-email.pl "$REPOS" "$REV" PM@yourdomain.com
##需要指明commit-email.pl的绝对路径
特殊性质
除了对你的目录与档案进行版本控制之外, Subversion 还提供了一个接口, 可用来新增, 修改, 以及移除已纳入版本控制的目录与档案的版本控制描述资料. 我们称这个描述资料为性质,在这里我主要介绍以下几个比较重要的特殊性质
svn:mime-type
svn:mime-type 性质在 Subversion 中有很多作用. 除了作为储存档案的多用途网际网络邮件延伸语法 (MIME) 分类之外, 这个性质的内容还会决定几项 Subversion 的行为特征.
举个例子, 如果 svn:mime-type 性质设为文字的 MIME 类别 , Subversion 会假设该档的内容是二进制(也就是人类看不懂的资料). Subversion 提供的功能中, 其中一项是在从服务器收到工作档的更新中, 依文字内容与文字列进行合并. 但是对含有二进制资料的档案, 根本就没有 “文字列” 的概念. 因此, Subversion 对这些档案在更新时, 不会试着进行内文合并. 它改用另一种方式。
一般来说Subversion 在执行 svn import 与 svn add 子命令时, 会使用二进制侦测运算法的方式来协助使用者. 但是如果 Subversion 猜错了, 或是你希望将 svn:mime-type 设定成更为明确的值(可能是 image/png)你都可以移除或是手动编辑这个性质.
svn:ignore
svn:ignore 性质包含了档案样式的列表, Subversion 处理时会忽略. 它可以与执行时期设定的 global-ignores 选项一起工作, 以便在类似 svn status 的命令中过滤掉未纳入版本控制的目录与档案.
我们知道新增的文件和目录必须透过 svn add 命令, 才会被纳入 Subversion 的管理. svn status 命令会将工作复本中未纳入版控制目录与档案显示出来.
$ svn status calc
M calc/button.c
calc/calculator
calc/data.c
calc/debug_log
calc/debug_log.1
在这个范例中, 用?标注出来的文件就是未纳入版控制的档案.如果你不想每次执行 svn status 时, 都看到这些档案, 那幺svn: ignore 性质就是解决方案。你可以透过 svn propedit svn:ignore calc 对 calc 目录加上一些忽略样式. 举个例子,将以下的值作为 svn:ignore 性质的新内容:
calculator
debug_log*
加上这个性质后再执行你的 svn status 输出便会不同:
$ svn status
M calc
M calc/button.c
calc/data.c
现在, 所有不想看到的东西都从输出中消失了!
svn:keywords
Subversion 具有取代关键词(有关纳入版本控制档案的有用信息)进入档案内容的功能.
举个例子, 假设你有个文件, 想要在里面显示最近一次修改的日期. 你可以把这个负担加诸文件的作者身上, 让他们每一次送交更动之前, 顺便添加最近一次修改日期的部份. 但是迟早有人会忘记这件事. 换个方式, 只要叫 Subversion 对 LastChangedDate 关键词进行关键词取代即可.
Subversion 定义了可用来进行取代的关键词列表. 这个列表包含了以下五个关键词:
LastChangedDate
LastChangedRevision
LastChangedBy
HeadURL
Id
如果只把关键词定位锚加进档案里的话, 什幺事也不会发生.要告诉 Subversion 是否该对某一个档案进行关键词取代,得使用svn:keywords这个性质。当它被设定时, 它会控制该档案哪个关键词应该被取代.
举个例子, 假设你有一个纳入版本控制的档案, 名为 weather.txt, 看起来像这样:
Here is the latest report from the front lines.
$LastChangedDate$
$Rev$
Cumulus clouds are appearing more frequently as summer approaches.
如果没有设定该档案的 svn:keywords 性质, Subversion 什幺事也不会作. 让我们开启关键词 LastChangedDate 的内容取代.
$ svn propset svn:keywords "LastChangedDate Author" weather.txt
property `svn:keywords' set on 'weather.txt'
$
在你送交了这个性质更动之后, Subversion 会显示为:
Here is the latest report from the front lines.
$LastChangedDate: 2002-07-22 21:42:37 -0700 (Mon, 22 Jul 2002) $
$Rev$
Cumulus clouds are appearing more frequently as summer approaches.
这样不管谁提交这个文件,都会在里面显示最近一次修改的日期。
svn:eol-style
除非另外指定版本控制档案的 svn:mime-type 性质, Subversion 会假设档案包含人类可读的资料.这对于列尾符号 (EOL) 是很不幸地, 因为不同的操作系统会使用不同的符号来表示一列的结尾. 举个例子, 一般用在 Windows 平台上的列尾符号是两个 ASCII 控制字符 :返回字符 (CR) 与换行字符 (LF). 但是 Unix 软件就只使用 LF 字符来表示一列的结尾.这样以来 window客户提交的档案中的CR 字符在 linux客户端会显示成 ^M, 而linux客户提交的档案中CR 字符在 Windows 客户端会被忽略。结果将档案里的所有文字列合并成一个超长的文字列, 这是因为没有返回CRLF字符组合的存在来表示一个换行。 解决的方法是 svn:eol- style 性质. 当这个性质设定为native时, Subversion 会根据系统的类型来决定是否对该档案的结尾进行自动处理。.
svn:externals
有的时候, 一个工作复本可能包含了数个不同来源的工作复本. 举个例子, 你可能想要有数个不同的目录, 各来自不同的档案库.我们可以通过 svn:externals 性质来宣告这一对对应关系。内容是子目录对应至 Subversion 档案库 URL 的多行表格.
$ svn propget svn:externals calc
third-party/sounds http://sounds.red-bean.com/repos
third-party/skins http://skins.red-bean.com/repositories/skinproj
third-party/skins/toolkit http://svn.red-bean.com/repos/skin-maker
当有人取出 calc 目录的工作复本, Subversion 还会继续取出在外部定义里的项目.
$ svn checkout http://svn.example.com/repos/calc
A calc
A calc/Makefile
A calc/integer.c
A calc/button.c
Checked out revision 148.
Fetching external item into calc/third-party/sounds
A calc/third-party/sounds/ding.ogg
A calc/third-party/sounds/dong.ogg
A calc/third-party/sounds/clang.ogg
Checked out revision 14.
Fetching external item into calc/third-party/skins

小结
Subversion有一份很好的文???《Version Control with Subversion》(http://svnbook.red-bean.com/)。它提供了有关Subversion的各方面内容,如使用、管理和开发等。
经过数年的开发,以替代CVS为目标的Subversion,相信以其强大的功能,对CVS良好的继承性,一定会有很好的发展。
作者简介
姓名:雷凯
工作单位:升技主板(苏州)研发中心
联系地址:苏州市新区马运路罗礼科技有限公司研发中心 邮编 215000
E-mail: tigerleihm@yahoo.com.cn
参考资料:Version Control with Subversion (http://svnbook.red-bean.com/)
“本文作者是雷凯 升技主板(苏州)研发中心工程师。他目前在中国苏州 升技主板(苏州)研发中心工作。可以通过tigerleihm@yahoo.com.cn 与他联系。”
posted @2006-09-11 22:50 subversion 阅读(114) |评论 (0) | 编辑 收藏
Subversion的Repository列表完美解决方案
我的SVN项目都放在h:/svn下,在Apache中只是把这个目录设置成了虚拟目录,这样我可以方便的通过http: //localhost/svn/project1访问这个目录下的所有Repository,但如果我想访问http: //localhost/svn/,是得不到所有Repository列表的,只是一个403 Forbidden错误,在TortorseSVN的帮助中有这么一篇文章中提到了解决的方法,下面是我的具体实施和一点心得。
SVN在Apache中的配置段一般都用,我尝试过使用,好像也可以,但不管用那个,在配置中无法使用AllowOverride指令,也就是说.htaccess文件无法使用。因此,若想把http: //localhost/svn/转向到调用其它文件,只能使用Rewrite module,并且必须写在段之外。我就是在这里试了N久 :( 。
(Apache一般配置和PHP、Rewrite module安装略过)
为了方便管理,用于显示Repository列表的PHP文件放在了h:/svn/svntools/目录,也就是在SVN的根目录下 :-) 。因此,Apache中的这段配置如下:
Alias /svntools "h:/svn/svntools"
RewriteEngine on
RewriteRule ^/svn/$ /svntools/svn_index.php [PT]

DAV svn
SVNParentPath h:/svn

先用Alias定义到h:/svn/svntools的虚拟目录,这样就可以访问到svn_index.php文件了,然后打开 RewriteEngine,使用RewriteRule将到/svn/的访问重定向到/svntools/svn_index.php文件,通过执行这个文件就会产生Repository列表了;最后是SVN虚拟目录的配置。
posted @2006-09-11 22:49 subversion 阅读(89) |评论 (0) | 编辑 收藏
Subversion简明命令手册
Subversion简明命令手册
allen | 06 五月, 2006 13:06
之前的subversion尝试后,一直没有很好的总结一下经验,总觉得subversion和CVS没什么两样,仔细想来,Subversion和CVS还是有很多区别的,具体的比较且不去在这里说了,这儿总结一下几个常用的命令,这几条几乎是Linux/Unix下用SVN肯定用的着的命令,还是和CVS有些不同的,具体的东西还是要真的用了才可以想明白。
创建仓库(Repository)
svnadmin create /path/to/repository
svnadmin是有用的subversion系统管理命令,使用svnadmin help查看在线帮助
信息。
添加新的项目(import new project)
subversion的手册推荐的项目目录结构,
project/
+ branches/
+ tags/
+ trunk/
+ dir1/
+ file1
+ file2
+ dir2/
svn import project file:///repository_name/project -m "Comment"
svn import project http://host/svn_dir/repository_name/project -m "Comment"
检出(checkout)项目
svn checkout file:///repository_name/project/trunk project
svn checkout http://host/svn_dir/repository_name/project/trunk project
列出仓库中的项目(list)
svn list --verbose file:///repository_name/project
svn list --verbose http://host/svn_dir/repository_name/project
状态查询(status)
svn status
给出新文件,已经改变的文件和被删除的文件列表;
添加文件或目录(add)
svn add
删除文件或目录(delete)
svn delete
svn delete http://host/svn_dir/repository/project_dir 这条命令刚好可以用来删除
错误的import的某些项目!!
提交(commit)
svn commit http://host/svn_dir/repository/project_dir
更新(update)
svn update
更新仓库中的文件到本地。
标签和特殊版本项目
使用copy命令
svn copy http://host/repos/project/trunk http://host/repos/project/tags/1.0.0
用于创建某个特定版本的快照(snapshot);
svn list http://host/repos/project/tags/1.0.0
查看某个版本的内容
posted @2006-09-11 22:48 subversion 阅读(332) |评论 (0) | 编辑 收藏
Installation instructions for Subversion 1.0.3 server in Linux(in non-usual places)
Installation instructions for Subversion 1.0.3 server in Linux(in non-usual places)
The following programs are required to install Subversion server: Autoconf 2.5 or newer Libtool 1.4 or newer Python 2.0 PkgConfig 0.15.0 OpenSSL 0.9.7d
These instructions will assume that all applications are installed in the $HOME/local directory and with the library path of $HOME/local/lib.
The $HOME/local/lib directory needs to be added to the LD_LIBRARY_PATH variable.
Installing Berkeley DB 4.2 (or newer)
Go tohttp://www.sleepycat.com/download/db/index.shtml to download the latest version of Berkeley DB (db-4.X.X.tar.gz) Unpack it using the following command: tar zxvf db-4.X.X.tar.gz Download any new patches from the website and apply using the following: cd /path/to/db-4.X.X patch -p0 < patchfile Configure and compile using the following: cd /path/to/db-4.X.X/build_unix ../dist/configure --prefix=$HOME/local make make install
Installing Apache Server
Go tohttp://httpd.apache.org/download.cgi to download the latest version of Apache server (httpd-X.X.X.tar.gz) Unpack it using the following command: tar zxvf httpd-X.X.X.tar.gz Build APR utilities using custom Berkeley DB path cd /path/to/httpd-2.X.X/srclib/apr ./configure --prefix=$HOME/local cd ../apr-util ./configure --prefix=$HOME/local --with-berkeley-db=$HOME/local --with-apr=../apr make make install Build Apache using the custom built APR utilities cd /path/to/httpd-2.X.X ./configure --prefix=$HOME/local --enable-dav --enable-http --enable-dav-fs --enable-so --enable-ssl --with-ssl=$HOME/local/lib --with-apr-util=$HOME/local make make install
Installing Neon
Go tohttp://www.webdav.org/neon/ and download neon library 0.24.6 or better. Unpack it and rename the directory from "./neon-0.24.6/" to "./neon/". Configure and compile using the following: cd /path/to/neon ./configure --prefix=$HOME/local --with-ssl --with-lib=$HOME/local/openssl-0.9.7d make make install
Installing the Subversion Server
The following instructions describe the steps involved in setting up the subversion server with user authentication Compiling Subversion
Go tohttp://subversion.tigris.org/servlets/ProjectDocumentList?folderID=260 to download the latest source tar ball for Subversion (subversion-X.X.X.tar.gz Unpack it using the following command: tar zxvf subversion-X.X.X.tar.gz Configure and compile using the following: cd /path/to/subversion-X.X.X ./configure --prefix=$HOME/local --enable-maintainer-mode --with-ssl=$HOME/local/lib --enable-ssl --with-berkeley-db=$HOME/local --with-dbm=db42 --with-apxs=$HOME/local/bin/apxs make make install
Create a user's file using htpasswd (comes with Apache)
Use the following command to enter a password for each user (-c to create the file) $HOME/local/htpasswd -cm /path/to/svn-auth-file username
Creating an Authorized SVN Access file
The access file is used to determine which users have which access to which directories. The sections of the file is of the form [repos-name:path]. The following is an example file: #Gives harry read and write permissions to /branches/calc/bug-142 and all directories below #it in the calc repository #Gives sally read-only permissions [calc:/branches/calc/bug-142] harry = rw sally = r # give sally write access only to the 'testing' subdir [calc:/branches/calc/bug-142/testing] sally = rw # Denies any permissions to harry [calc:/branches/calc/bug-142/secret] harry = #Gives all users read access to all repositories [/] * = r #Permissions can be given to entire groups by defining the members of groups [groups] calc-developers = harry, sally, joe paint-developers = frank, sally, jane everyone = harry, sally, joe, frank, sally, jane [calc:/projects/calc] @calc-developers = rw [paint:/projects/paint] @paint-developers = rw jane = r
Configuring httpd.conf and ssl.conf
Add the following lines to http.conf to instruct Apache to load the mod_dav_svn module. These lines must be added before any Subversion-related configuration items: LoadModule dav_svn_module modules/mod_dav_svn.so Add the following lines to httpd.conf somewhere AFTER the LoadModule commands to tell Apache where you keep your Subversion repositories: # To access a repository type in the URL "SERVER/svn/REPOSITORYNAME" < Location /svn> DAV svn SVNParentPath /usr/local/svn # our access control policy AuthzSVNAccessFile /path/to/access/file # try anonymous access first, resort to real # authentication if necessary. Require valid-user # how to authenticate a user AuthType Basic AuthName "Subversion repository" AuthUserFile /path/to/svn-auth-file
Fix the ServerName, username, etc. as appropriate in both httpd.conf and ssl.conf Create an SSL certificate, get it signed, and add the following lines to httpd.conf to identify the location of server.key and server.crt: SSLCertificateFile /h/45/villegas/local/conf/ssl.crt/server.crt SSLCertificateKeyFile /h/45/villegas/local/conf/ssl.key/server.key
Starting Subversion server with SSL
Start up Apache server with SSL option: $HOME/local/bin/apachectl -f $HOME/local/conf/httpd.conf -DSSL
Creating a Repository in Subversion
To create a repository called "test_repos" (requires administrator privileges): svnadmin create /path/to/test_repos To import a tree of data called project into the repository: svn import /path/to/project https://domainname.com/svn/test_repos -m "Initial import" To checkout the files into a working directory called "project": svn checkout https://domainname.com/svn/test_repos/trunk project
The repository can now be viewed by pointing your web browser at https://domainname.com/repos/test_repos $Id: subversion_linux.html,v 1.4 2004/06/22 15:51:40 wvillegas Exp $
posted @2006-09-11 22:37 subversion 阅读(63) |评论 (0) | 编辑 收藏
如何在Fedora 5 安装subversion Apache 2.2-----How to setup SVN using HTTPS on FC5
How to setup SVN using HTTPS on FC5
I got my latest SVN 1.3.2 working on FC5 with Apache 2.2.0 over SSL,
so decided to just share the same with all.
Here we go,
1) To install SVN do
yum install subversion.
2) To create a SSL certificate for Apache do -
Step one - create the key and request:
openssl req -new > new.cert.csr
Step two - remove the passphrase from the key (optional):
openssl rsa -in privkey.pem -out new.cert.key
Step three - convert request into signed cert:
openssl x509 -in new.cert.csr -out new.cert.cert -req -signkey new.cert.key -days 1024
place the keys to following locations & edit the /etc/httpd/conf.d/ssl.conf as follows -
SSLCertificateFile /etc/pki/tls/certs/new.cert.cert
SSLCertificateKeyFile /etc/pki/tls/private/new.cert.key
Test the certificate.
3) create /home/subversion/repository & /home/subversion/permissions
chown -R apache:apache /home/subversion/repository
svnadmin create /home/subversion/repository
svn import /tmp/project1 file:///home/subversion/repository/project1 -m "initial import"
svn checkout file:///home/subversion/repository/project1 project1
4) Edit httpd.conf as follows
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule dav_module modules/mod_dav.so
LoadModule authz_svn_module modules/mod_authz_svn.so

DAV svn
SVNPath /home/subversion/repository/
# our access control policy
AuthzSVNAccessFile /home/subversion/permissions/svnauthorz.conf
#how to authenticate the users
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /var/www/.htpasswd
# only authenticated users access the SVN
Require valid-user
SSLRequireSSL

use following command to create users for authentication
htpasswd /var/www/.htpasswd john
& put following style entry in svnauthorz.conf
[/]
john = rw
liza = r
thats it, restart the httpd service & your SVN is ready to use for developers.
Regards
posted @2006-09-11 22:21 subversion 阅读(268) |评论 (0) | 编辑 收藏
2006年9月10日
Subversion之路--实现精细的目录访问权限控制(v0.4.1)
Subversion之路--实现精细的目录访问权限控制(v0.4.1)
(7月7日,发布0.4版本,顺便纪念一下卢沟桥事变)
================
Subversion之路
================
----------------------------
实现精细的目录访问权限控制
----------------------------
:作者: 郑新星
:联系: zhengxinxing gmail com
:状态: 草稿,编写中
:版本: 0.4.1
:修订: $Id: The.Road.to.Subversion_authz.txt 149 2006-07-07 14:32:12Z michael $
:版权:  作者保留对本文的一切修改、发布等权力。任何人想要转载本文部分或全部内容时,必须保留包括作者、联系、状态、版本、修订、版权,共六项信息,并给出出处。对本文的参考引用,则不受限制。
:关键词: Subversion 目录访问 权限
:献辞:
仅以本文,献给中国广大的自由软件爱好者们
:摘要:
本文从一个实际的例子入手,介绍了如何利用 Subversion 自带的目录管理功能,来实现对项目目录的精细访问权限的控制。同时描述了在配置的过程中,需要注意的一些地方,如对中文的处理等。
.. section-numbering::
.. contents:: 目 录
:backlinks: none
to-do list
==========
- 描述初始建立代码库时候,导入的细节区别
- 关于passwd.conf 文件明文密码的问题,及其处理办法
- 有关使用apache代替svnserve.exe做服务器,从而实现非明文密码,以及实现SSL的问题
- 有关使用apache之后,部门经理想要通过web查看日志的问题
- 调整文章结构,将“背景假设”改为“故事背景”或者“需求背景”,给“前言”添加 subversion 权限简介。
前言
====
在实际的使用中,由于项目的目录本身就是作为版本库的一个部分被svn所收管,所以我们无法利用服务器操作系统的访问权限,来实现项目目录的访问控制。因此,这个问题就只有让svn自己来解决了。
Subversion 1.3以前的版本,只能利用 mod_authz_svn.so 模块,结合Apache服务器来实现目录访问控制,这对Apache的配置与使用不是很熟悉的人来说(比如说鄙人)就不是很方便了。而Subversion终于在 1.3 版本上,在 svnserve.exe 服务器里面添加了这一功能。本文就是介绍如何配置代码库配置文件,以便让 svnserve.exe 实现精细的目录访问权限控制。
本文是基于 Subversion 1.3.2、MS Windows 2003 Server Edition 平台来编写的,且 Subversion 服务器是利用 svnserve.exe 来架设的。不过,本文讲述到的绝大多数内容,都是不仅与平台无关,而且与是采用 svnserve(.exe) 还是使用apache来作为 Subversion 服务器也基本无关。
本文是利用 reST 格式来编写的,如果你对它感兴趣,请访问http://docutils.sourceforge.net/rst.html。如果想要看到更好的html格式,你可以通篇复制本文到一个文本文件里,然后利用 docutils 的 rst2html.py 脚本编译它,当然,首先你必须安装 python。或者直接访问http://swjr.blog.com.cn/archives ... version1authz.shtml ,不过在最终版本发布之前,我不能保证它的内容一定会是最新的。
本文面向那些 Subversion 的管理员,或者任何对 Subversoin 有兴趣的人们。本文假定读者对Subversion有一定的了解,因此不打算对所有涉及到的安装、使用,做一个细节性的描述。若对于文章中描述的技术细节有疑问,请访问“参考”一节里面的参考资料。如果你对本文任何地方有什么意见,或者发现本文有着大大小小的错误,请联系 zhengxinxing gmail com 。
致谢
====
非常感谢所有给本文提出宝贵意见的人,虽然文章是我主笔编写的,但是如果没有他们的帮助,文章肯定会失色不少。请允许我在这儿记录下他们的名字或代号:PCplayer (目前只有一个人 :-) )
实战
====
本章先直接给出需求及其最终的结果,如果你觉得对配置有什么疑问,或者看不懂,请不要着急,我会在后面的章节详细描述的。
背景假设
--------
厦门央瞬公司是一家电子元器件设备供应商,其中有个ARM部门,专门负责ARM芯片的方案设计、销售,并在北京、上海各设立了一个办事处。对于工作日志,原先采用邮件方式发给经理,但是这种方式有个缺点,那就是不具备连续性,要看以前的日志必须一封一封邮件去查看,很麻烦。于是就想到利用 Subversion, 让员工在自己电脑上编辑日志,然后利用svn传送回来,既方便员工自己编写日志,又方便对日志的归档处理,而且提交日志的时候只需要执行一下 svn commit 即可,比发送邮件还要简单的多。
- svn服务器相关信息
- 服务器地址: 192.168.0.1
- 服务器OS: MS Windows 2000 Server Edition 中文版
- 代码库本地目录: ``D:\svn\arm``
- arm部门文档的目录结构如下::
arm                 部门名称
├─diary           工作日志目录
│  ├─headquarters    总部工作日志目录
│  ├─beijing         北京办日志目录
│  └─shanghai        上海办日志目录
├─ref             公司公共文件参考目录
└─temp            临时文件目录
- 人员情况
- morson,公司总经理,其实他不必亲自看任何东西,就连部门经理们的每周总结都不一定看。但是为了表示对他的尊敬,以及满足一下他的权力欲,还是给他开放了“阅读所有文档”的权限
- michael,arm事业部的部门经理,没事的时候喜欢弄点儿新技术,用svn来管理日志,就是他想出来的主意
- scofield,北京办人员,老员工,为人油滑难管
- lincon,上海办人员,老员工,大老实人一个
- linda,总部协调员、秘书,文笔不错,长得也不错
- rory,单片机技术员,技术支持
- 访问权限需求分析
- 允许总经理、部门经理读取所有文件。顺便给他们开放写权限,以便体现对他们职位的尊重,虽然对于某些文件来说,他们若拥有“写”权限其实也没什么用处
- 除部门经理外,所有其他人员,均只能看到本办事处人员工作日志
- 不允许匿名访问
- ref目录只允许经理和秘书读写,对其他人只读
- temp目录人人都可以随意读写
建立代码库
----------
在服务器 ``D:\svn`` 目录下,建立 arm 代码库,命令如下::
D:\svn>svnadmin create arm
在客户机 ``F:\temp`` 目录下,建立好上述目录结构
用命令 ``F:\temp>svn import arm svn://192.168.0.1/arm`` 导入结构
【注意点:关于导入时候的细微差别】
编辑代码库基础配置文件
----------------------
编辑代码库 ``arm\conf\svnserve.conf`` 文件,如下::
[general]
password-db = passwd.conf
anon-access = none
auth-access = write
authz-db = authz.conf
管理用户帐号
------------
新建代码库 ``arm\conf\passwd.conf`` 文件,如下::
[users]
morson = ShowMeTheMoney
michael = mysecretpassword
scofield = hellolittilekiller
lincon = asyouknows111
rory = 8809117
linda = IlikeWorldCup2006
建立目录访问权限控制文件
------------------------
新建代码库 ``arm\conf\authz.conf`` 文件,内容如下::
[groups]
g_vip = morson
g_manager = michael
g_beijing = scofield
g_shanghai = lincon
g_headquarters = rory, linda
g_docs = linda
[arm:/]
@g_manager = rw
* = r
[arm:/diary/headquarters]
@g_manager = rw
@g_headquarters = rw
@g_vip = r
* =
[arm:/diary/beijing]
@g_manager = rw
@g_beijing = rw
@g_vip = r
* =
[arm:/diary/shanghai]
@g_manager = rw
@g_shanghai = rw
@g_vip = r
* =
[arm:/ref]
@g_manager = rw
@g_docs = rw
* = r
[arm:/temp]
* = rw
测试
----
在服务器上,打开一个 DOS Prompt 窗口,输入如下指令::
svn co svn://127.0.0.1/arm --no-auth-cache --username rory --password 8809117
我们应该得到如下目录结构::
arm
├─diary
│  └─headquarters
├─ref
└─temp
然后修改ref目录下任意文件并提交,服务器将会报错“Access deni”
深入
====
本章将详细介绍前一章所涉及的两个配置文件, svnserve.conf 和 authz.conf,通过对配置逐行的描述,来阐明其中的一些细节含义。
这里首先要注意一点,任何配置文件的有效配置行,都不允许存在前置空格,否则程序会无法识别。也就是说,如果你直接从本文的纯文本格式中拷贝了相关的配置行过去,需要手动将前置的4个空格全部删除。当然了,如果你觉得一下子要删除好多行的同样数目的前置空格是一件苦差使,那么也许 UltraEdit 的“Column Mode”编辑模式,可以给你很大帮助呢。
svnserve.conf
-------------
``arm\conf\svnserve.conf`` 文件,是 svnserve.exe 这个服务器进程的配置文件,我们逐行解释如下。
首先,我们告诉 svnserve.exe,用户名与密码放在 passwd.conf 文件下。当然,你可以改成任意的有效文件名,比如默认的就是 passwd::
password-db = passwd.conf
接下来这两行的意思,是说只允许经过验证的用户,方可访问代码库。 那么哪些是“经过验证的”用户呢?噢,当然,就是前面说那些在 passwd.conf 文件里面持有用户名密码的家伙。这两行的等号后面,目前只允许 read write none 三种值,你如果想实现一些特殊的值,比如说“read-once”之类的,建议你自己动手改源代码,反正它也是自由软件::
anon-access = none
auth-access = write
接下来就是最关键的一句呢,它告诉 svnserve.exe,项目目录访问权限的相关配置是放在 authz.conf 文件里::
authz-db = authz.conf
当然,svn 1.3.2 引入本功能的时候,系统默认使用 authz 而不是 authz.conf 作为配置文件。不过由于鄙人是处女座的,有着强烈的完美主义情结,看着 svnserve.conf 有后缀而 passwd 和 authz 没有就是不爽,硬是要改了。
authz.conf 之用户分组
---------------------
``arm\conf\authz.conf`` 文件的配置段,可以分为两类,``[group]`` 是一类,里面放置着所有用户分组信息。其余以 ``[arm:/]`` 开头的是另外一类,每一段就是对应着项目的一个目录,其目录相关权限,就在此段内设置。
首先,我们将人员分组管理,以便以后由于人员变动而需要重新设置权限时候,尽量少改动东西。我们一共设置了5个用户分组,分组名称统一采用 ``g_`` 前缀,以方便识别。当然了,分组成员之间采用逗号隔开::
[groups]
# 任何想要查看所有文档的非本部门人士
g_vip = morson
# 经理
g_manager = michael
# 北京办人员
g_beijing = scofield
# 上海办人员
g_shanghai = lincon
# 总部一般员工
g_headquarters = rory, linda
# 小秘,撰写文档
g_docs = linda
注意到没有, linda 这个帐号同时存在“总部”和“文档员”两个分组里面,这可不是我老眼昏花写错了,是因为 svnserve.exe 允许我这样设置。它意味着,这个家伙所拥有的权限,将会比他的同事 rory 要多一些,这样的确很方便。具体多了哪些呢?请往下看!
authz.conf 之项目根目录
-----------------------
接着,我们对项目根目录做了限制,该目录只允许arm事业部的经理才能修改,其他人都只能眼巴巴的看着::
[arm:/]
@g_manager = rw
* = r
- ``[arm:/]`` 表示这个目录结构的相对根节点,或者说是 arm 项目的根目录
- 这里的 ``@`` 表示接下来的是一个组名,不是用户名。你当然也可以将 ``@g_manager = rw`` 这一行替换成 ``michael = rw`` ,而表达的意义完全一样。
- ``*`` 表示“除了上面提到的那些人之外的其余所有人”,也就是“除了部门经理外的其他所有人”,当然也包括总经理那个怪老头
- ``* = r`` 则表示“那些人只能读,不能写”
authz.conf 之项目子目录
-----------------------
然后,我们要给总部人员开放日志目录的读写权限::
[arm:/diary/headquarters]
@g_manager = rw
@g_headquarters = rw
@g_vip = r
* =
- 我敢打赌,设计svn的家伙们,大部分都是在 unix/linux 平台下工作,所以他们总喜欢使用 ``/`` 来标识子目录,而完全忽视在 MS Windows 下是用 ``\`` 来做同样的事情。所以这儿,为了表示 ``arm\diary\headquarters`` 这个目录,我们必须使用 ``[arm:/diary/headquarters]`` 这样的格式。
- 这里最后一行的 ``* =`` 表示,除了经理、总部人员、特别人士之外,任何人都被禁止访问本目录。这一行是否可以省略呢?
- 之所以这儿需要将 ``@g_vip = r`` 一句加上,就是因为存在上述这个解释。如果说你没有明确地给总经理授予读的权力,则他会和其他人一样,被 ``*`` 给排除在外。
- 如果众位看官中间,有谁玩过防火墙配置的话,可能会感觉上述的配置很熟悉。不过这里有一点与防火墙配置不一样,那就是各个配置行之间,没有 **先后顺序** 一说。也就是说,如果我将本段配置的 ``* =`` 这一行挪到最前面,完全不影响整个配置的最终效果。
- 请注意这儿,我们并没有给 ``arm\diary`` 目录设置权限,就直接跳到其子目录下进行设置了。我当然是故意这样的,因为我想在这儿引入“继承”的概念。
- **权限具备继承性** 任何子目录,均可继承其父目录的所有权限,除非它自己被明确设置了其他的权限。也就是说,在 arm 目录设置权限后, ``arm\diary`` 目录没有进行设置,就意味着它的权限与 arm 目录一样,都是只有经理才有权读写,其他人只能干瞪眼。
- 【 * =  是否可以省略】【用例子引入覆盖】【单用户权限的继承问题】【父目录权限集成与全面覆盖问题】
现在来看看
好了,我们现在掌握了“继承”的威力,它让我们节省了不少敲键盘的时间。可是现在又有一个问题了,
属性具备覆盖性质
子目录若设置了属性,则完全覆盖父目录。
authz.conf 的其他注意点
-----------------------
1. 父目录的 ``r`` 权限,对子目录 ``w`` 权限的影响
把这个问题专门提出来,是因为在1.3.1及其以前的版本里面,有个bug,即为了子目录的写权限,项目首目录必须具备读权限。因此现在使用了1.3.2版本,就方便了那些想在一个代码库存放多个相互独立的项目的管理员,来分配权限了。比如说央舜公司建立一个大的代码库用于存放所有员工日志,叫做 diary,而arm事业部只是其中一个部门,则可以这样做::
[diary:/]
@g_chief_manager = rw
[diary:/arm]
@g_arm_manager = rw
@g_arm = r
这样,对于所有arm事业部的人员来说,就可以将 svn://192.168.0.1/diary/arm 这个URL当作根目录来进行日常操作,而完全不管它其实只是一个子目录,并且当有少数好奇心比较强的人想试着 checkout 一下 svn://192.168.0.1/diary 的时候,马上就会得到一个警告“Access deni”,哇,太酷了。
2. 默认权限
如果说我对某个目录不设置任何权限,会怎样?马上动手做个试验,将::
[diary:/]
@g_chief_manager = rw
改成::
[diary:/]
# @g_chief_manager = rw
这样就相当于什么都没有设置。在我的 svn 1.3.2 版本上,此时是禁止任何访问。也就是说,如果你想要让某人访问某目录,你一定要显式指明这一点。这个策略,看起来与防火墙的策略是一致的。
3. 只读权限带来的一个小副作用
若设置了::
[arm:/diary]
* = r
则svnserve认为,任何人,都不允许改动diary目录,包括删除和改名,和新增。
也就是说,如果你在项目初期创建目录时候,一不小心写错目录名称,比如因拼写错误写成 dairy,以后除非你改动 authz.conf 里面的这行设置,否则无法利用 svn mv 命令将错误的目录更正。
改进
====
对中文目录的支持
----------------
上午上班的时候,Morson 来到 Michael 的桌子前面,说道:“你是否可以将我们的北京办、上海办目录,改成用中文的,看着那些拼音我觉得很难受?” Michael 心想,还好这两天刚了解了一些与 unicode 编码相关的知识,于是微笑地回答:“当然可以,你明天下午就可以看到中文目录名称了。”
1. 使用 svn mv 指令,将原来的一些目录改名并 commit 入代码库,改名后的目录结构如下::
arm
├─工作日志
│  ├─总部人员
│  ├─北京办
│  └─上海办
├─公司公共文件参考目录
└─临时文件存放处
2. 修改代码库的 authz.conf 文件,将相应目录逐一改名
3. 使用 UltraEdit 将 authz.conf 文件转换成不带 BOM 的 UTF-8 格式
将配置文件转换成 UTF-8 格式之后,Subversion 就能够正确识别中文字符了。但是这里需要注意一点,即必须保证 UTF-8 文件不包含 BOM 。BOM 是 Byte Order Mark 的缩写,指 UNICODE 文件头部用于指明高低字节排列顺序的几个字符,通常是 ``FF FE`` ,而将之用 UTF-8 编码之后,就是 ``EF BB BF`` 。由于 UTF-8 文件本身不存在字节序问题,所以对 UTF-16 等编码方式有重大意义的 BOM,对于 UTF-8 来说,只有一个作用——表明这个文件是 UTF-8 格式。由于 BOM 会给文本处理带来很多难题,所以现在很多软件都要求使用不带 BOM 的 UTF-8 文件,特别是一些处理文本的软件,如 PHP、 UNIX 脚本文件等,svn 也是如此。
目前常用的一些文本编辑工具中,MS Windows 自带的“记事本”里面,“另存为”菜单保存出来的 UTF-8 格式文件,会自动带上 BOM 。新版本 UltraEdit 提供了选项,允许用户选择是否需要 BOM,而老版本的不会添加 BOM。请各位查看一下自己常用的编辑器的说明文件,看看它是否支持这个功能。
利用 UltraEdit ,我们可以将 BOM 去掉。方法是,首先利用“UTF-8 TO ASCII”菜单将文件转换成本地编码,通常是GB2312码,然后再使用“ASCII TO UTF-8(UNICODE Editing)”来转换到 UTF-8 即可。
参考文献
========
- Subversion官方文档,http://svnbook.red-bean.com/en/1 ... svn-ch-6-sect-4.4.2
- Subversion 1.3变更记录,http://subversion.tigris.org/svn_1.3_releasenotes.html
- Subversion FAQ,http://subversion.tigris.org/faq.html
- UTF-8 常见问题,http://unicode.org/faq/utf_bom.html
posted @2006-09-10 21:51 subversion 阅读(212) |评论 (0) | 编辑 收藏
Subversion安装手记
STEP 1:下载和安装
首先在Subversion的官方网站去下载windows安装包,最新版是1.3.1,可惜在项目树上只更新到了1.3.0的二进制包。
下载后安装在本地机器上,这里注意的是最好将安装目录指定为纯英文名目录,安装在中文目录下天知道哪天会冒出一个让你想破头也想不出的错误来。
下载TortoiseSVN进行本地安装,我安装的是最新的1.3.2 for svn 1.3.0,这是一个将SVN集成到windows shell中的GUI管理工具,推荐使用。
STEP 2:创建储存库
安装完TortoiseSVN后提示要重启机器,其实启不启都可以正常使用了,首先创建SVN储存库(repository),可以选择命令行方式或者通过TortoiseSVN插件进行GUI操作,命令行运行如下:
svnadmin create E:\svn\repository
e:\svn\repository就是我指定的储存库目录,如果用GUI方式,可以在这个目录下点击右键选择[TotoiseSVN]->[Create Repository href...]进行创建,版本库模式指定为默认的即可。
repository创建完毕后会在目录下生成若干个文件和文件夹,dav目录是提供给Apache与mod_dav_svn使用的目录,让它们存储内部数据;db目录就是所有版本控制的数据文件;hooks目录放置hook脚本文件的目录;locks用来放置Subversion文件库锁定数据的目录,用来追踪存取文件库的客户端;format文件是一个文本文件,里面只放了一个整数,表示当前文件库配置的版本号;
STEP 3:配置
打开/conf/目录,打开svnserve.conf找到一下两句:
# [general]
# password-db = passwd
去之每行开头的#,其中第二行是指定身份验证的文件名,即passwd文件
同样打开passwd文件,将
# [users]
# harry = harryssecret
# sally = sallyssecret
这几行的开头#字符去掉,这是设置用户,一行一个,存储格式为“用户名 = 密码”,如可插入一行:admin = admin888,即为系统添加一个用户名为admin,密码为admin888的用户
STEP 4:运行SVN服务
在命令行执行
svnserve --daemon --root E:\svn\repository
服务启动,--daemon可简写为-d,--root可简写为-r,可以建立一个批处理文件并放在windows启动组中便于开机就运行SVN服务,或者在这个地址http://clanlib.org/~mbn/svnservice/下载那个svnservice.exe文件,拷贝到E:\svn\bin目录下,再从命令行下执行:
svnservice -install --daemon --root "E:\svn\Repository"
sc config svnservice start= auto
net start svnservice
此文件会将SVN变成windows系统的一个服务,并默认为自启动,注意:执行第三句时确保前面以命令行方式运行的SVN服务已经停止,如果没停止可在其窗口中按Ctrl+C中止运行。
STEP 5:创建项目版本树
确定SVN服务(命令行或windows服务)运行后,在你需要导入储存库的目录下单击右键选择[TortoiseSVN]-> [Import...],在弹开的窗口的URL框中输入 "svn://localhost/myproject" 点击 "OK" 执行导入,如果没有报错,数据就全部加入SVN储存库目录树上了。用命令行也可以完成这些操作,这需要你在系统变量中新建一个“SVN_EDITOR”的系统变量,变量值为本地的一个文本编辑器执行文件路径,一般指到windows的记事本上就行了 "c:\windows\notepad.exe" ,然后新开一个CMD窗口,执行
svn mkdir svn://localhost/myproject
随即关闭记事本打开的log文件窗口后按"c"键继续后生成项目树。一般情况,我们在创建文件根路径后应该在创建三个目录:branches、tags、 trunk,这三个目录是Subversion需要的三个目录。对于check out、commit、update等操作可以通过svn命令行方式执行,也可以用TortoiseSVN的windows菜单完成,非常简单咯。