subversion svn

subversion

2011年5月10日 #

Linux下 只允许用户修改自己的svn日志的钩子脚本

本钩子实现用户可以修改自己的svn日志,脚本适用于Linux。

操作方法:

1、将版本库的hooks文件夹中的pre-revprop-change.tmp修改成pre-revprop-change

2、为pre-revprop-change加上执行权限:使用命令chmod +x

3、将pre-revprop-change内容改成下面的样子。

#!/bin/sh
REPOS="$1"
REV="$2"
USER="$3"
PROPNAME="$4"
ACTION="$5"
if [ "$USER" != $(/usr/local/subversion/bin/svnlook author -r "$2" "$1") ]; then   //判断不是自己提交的文件及日志
echo "author error!" >$2
exit 1
elif [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then    //只能修改日志,不能编辑作者
exit 0
fi
echo "Changing revision properties other than svn:log is prohibited" >&2
exit 1

注:黑体部分/usr/local/subversion/bin/svnlook 根据自己的存储路径不同而做相应的改变

posted @ 2011-05-10 16:33 subversion 阅读(1219) | 评论 (0)编辑 收藏

2008年11月12日 #

强制svn 提交代码者 添加注释信息

打开你建立的项目,里面有个hooks目录,更改 pre-commit.tmpl 为pre-commit
编辑pre-commit 文件内容,找到下面3行,用#注释掉。

 $SVNLOOK log -t "$TXN" "$REPOS" | \
 grep "[a-zA-Z0-9]" > /dev/null || exit 1
 commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1

然后再修改处下面增加一下内容。

LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
if [ "$LOGMSG" -lt 5 ];#........5.........
then
 echo -e "\nLog message cann't be empty! you must input more than 5 chars as comment!." 1>&2
exit 1
fi

保存退出。 设置pre-commit文件权限可执行 使用如下命令chomd +x pre-commit

完毕

posted @ 2008-11-12 13:28 subversion 阅读(2735) | 评论 (0)编辑 收藏

2008年5月15日 #

trac, subversion and apache on Fedora

trac, subversion and apache on Fedora 8

Prepare:
# yum install svn mod_dav_svn trac

Subversion:
# useradd svn -d /svn
# chmod g+rwx /svn
# su svn
$ cd
$ mkdir repos trac .conf
$ cd repos
$ mkdir proj0
$ svnadmin create --fs-type fsfs proj0

The commands start with "#" should be excuted as root. About the repository filesystem type, you can choose either FSFS or Berkelay-DB, I'd like the simple one...

Trac:
$ cd ~/trac
$ mkdir proj0
$ cd proj0
$ trac-admin proj0 initenv

Then the program will ask you some questions about the project, if you are using SQLite as the DB, just make sure the path of subversion repository is correct, /svn/repos/proj0 in this example.

Apache:
$ su
# cd /etc/httpd

Setup svn:

# vim conf.d/subversion.conf

Modify the Location section:

<Location /svn>

DAV svn
SVNParentPath /svn/repos
AuthType Basic
AuthName "SVN repos"
AuthUserFile /svn/.conf/userlist
AuthzSVNAccessFile /svn/.conf/authfile
Require valid-user

</Location>

Setup trac:

# vim conf.d/trac.conf

Comment all settings and modify the Location section:

<Location /trac>

SetEnv TRAC_ENV /svn/trac
SetEnv PYTHON_EGG_CACHE /tmp
SetHandler mod_python
PythonHandler trac.web.modpython_frontend
PythonInterpreter main_interpreter
PythonOption TracEnvParentDir /svn/trac
AuthType Basic
AuthName "Trac Projects"
AuthUserFile /svn/.conf/userlist

</Location>

Because I will manage the accouts with the trac plugin, the "Require valid-user" option doesn't need be here.

Then, setup the httpd:

# usermod -G svn apache
# chkconfig --level 5 httpd on
# htpasswd -c /svn/.conf/userlist test

Account Management:
# su svn
$ cd ~/.conf
$ vim authfile

For more details about the svn authz module, please read the svn-book.pdf in official web site, it's pretty good. Now make the authfile looked like this:

[proj0:/]
* = r
test = rw

At last, we need install easy_install to install the trac plugins packaged as the python eggs:

$ cd
$ wget http://peak.telecommunity.com/dist/ez_setup.py
$ su
# python ez_setup.py -U setuptools
# easy_install http://trac-hacks.org/svn/accountmanagerplugin/0.10
# easy_install http://svn.edgewall.com/repos/trac/sandbox/webadmin
# vim trac/proj0/conf/trac.ini

Add these:

[components]
webadmin.* = enabled
trac.web.auth.LoginModule = disabled
acct_magr.* = enabled

Then start the httpd service:

# service httpd restart

Open your browser and type the address: http://localhost/trac/proj0, DO HAVE FUN.

posted @ 2008-05-15 23:41 subversion| 编辑 收藏

2006年9月15日 #

用 Apache 和 Subversion 搭建安全的版本控制环境 ---ibm

     摘要: 级别: 中级 吴 玥...  阅读全文

posted @ 2006-09-15 14:36 subversion 阅读(1784) | 评论 (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,在文件最后面加上以下几行:
<Location /svn>
    DAV svn
    SVNParentPath d:/svn
</Location>
其中d:/svn为你要建的仓库的父目录(必须为本地目录),最好用双引号引一下.

第三步,创建仓库
根据apache的配置文件的设置建立目录:d:/svn.然后我们就可以在下面建立仓库了,创建方法如下:
c:\>svnadmin create d:/svn/repository
命令执行成功之后,会在d:/svn/repository下面生成很多的文件和目录

第四步,使用
重新启动Apache Server
在浏览器中输入网址:
http://localhost/svn/repository/
这时候,看到页面显示:

Revision 0: /
Powered by Subversion 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配置:
<Location /svn>
DAV svn
SVNParentPath /svn
AuthType Basic
AuthName “Subversion repository”
AuthUserFile /svn-auth-filename (保存用户名和密码)
Require valid-user
AuthzSVNAccessFile /svn-access-filename(保存用户访问的权限策略)
</Location>
(注:)
 /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 阅读(1200) | 评论 (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仓库的负责人规划好仓库的目录结构。推荐的目录结构如下图所示。

仓库的一级目录只有两个,分别为codedoc。其中,doc主要用来放置先期的文档,code主要用来放置工程的代码,也可以包含后期的文档。

仓库的二级目录只可以是branchtrunk两个目录,分别存放主干与分支。trunk目录下直接存放工程文件。branch目录下包括一些子目录分别对应各个分支。

2.4

SVN仓库中取出代码时,一定不要把整个仓库取出来而应该只取出trunk目录或只取出branch下的某个分支目录(比如上图中的svn:\\code\branch\xw_051206

一个项目会有多个人共同合作开发完成。基本流程是:

l        各开发成员建立自己的分支,并在此分支上开发;

l        各开发成员把分支合并到主干上并形成较为稳定的版本;

l        各个成员重新从主干上建立新的分支,在此分支上开发(即回到第一步)

l        循环往复,直到工程结束。

下面我用一个例子来说明合作开发的基本流程。

现在xblzj两个开发人员要共同开发一个工程onlytest,其这个工程的主干的SVN仓库地址如下图。

2.5

xblzj分别在onlytest这个工程中建立两个分支,分别为xb _051115lz_051115

在这里分支命名要采用[姓名缩写_6个数的日期_后缀(可选)]的形式,比如xb_051208_1xb_051212之类的。创建完分支后我们可以看到这个工程的目录结构如下图所示:

2.6分支目录

建完之后, xblzj分别在本地取出对应的分支进行开发。

程序到达一个比较稳定的阶段,就需要把分支合并到主干上,下面讲述一下合并的流程。

在本节中继续使用上一节中所示的工程与SVN仓库讲解。

1.2.3.1 xblzj分别修改自己分支上的代码

现在主干上的test_SVN.txt是空文档。

xblzj修改提交后两个分支中test_SVN.txt分别如下两图所示

2.7 xb_051129分支下的test_SVN.txt

2.8 lzj_051129分支下的test_SVN.txt

1.2.3.2 xbxb_051129分支合并到主干

xb先把主干check out到本地。然后在主干的目录上右键选择svn->merge,弹出如下窗口:

2.9合并对话框

此对话框的含义是把From指定的分支版本到To指定的分支版本之间的差异合并到主干上。

在这里分支选的是xb_051129。版本号的选定方法是点击From中的Show Log,在Log窗口中按住Ctrl键,点击选择”made a copy”之上的那个版本,以及最顶上的那个版本,如2.11所示。然后点击确定回到上图中的对话框,会自动填写FromTo中的Revision号。

2.10选择需要合并的版本

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

2.11合并后,主干上的test_SVN.txt

 

1.2.3.3 lzjlzj_051129分支合并到主干,解决冲突

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

2.12

l        首先比较第一个窗口与第二个窗口,把结果修改合并到第二个窗口。

l        然后确保光标处于第二个窗口时,点击上图中红色圈圈所示的按钮。这样会把第二个窗口的内容全部复制到第三个容口。之后保存,退出。

l        然后在工程目录上点右键,进行SVN->Resolved。这样会删除无用的临时文件。

l        最后提交所作的修改,并添加详细的注释。

中的标签

CVS不同,使用SVN时不用专门为目录添加标签,因为SVN也对目录进行版本管理。

我们在提交时写好注释(比如重要的版本提交时使用051201之类的日期作为开头),就可以通过注释来查找比较重要的目录版本号,相当于CVSVSS中的标签。

另外,每个工程都会有一个版本说明文件,通过此文件可以查找关键版本。

你可以重命名、移动或删除你的文件或文件夹,但请使用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的版本覆盖你的最新的版本,这样你就可以不丢失你新建的文件,同时获得headSVN控制文件。

13

 

每个工程会有很多个小模块,当某个模块达到稳定的时候,你就需要提交一次,以免写下个模块代码的时候出现不可恢复的错误。

每一次提交需要前,需要通过pclint检查,保证是一个编译没有错误的版本。当提交比较稳定的版本的时候,同时要修改你的版本号。

1.3.5 版本说明文件

版本说明文件为xml表格,可用excel编辑,它会记录下关键的版本信息。

版本说明文件内容如下表。发布版本是指用户对外公布的版本号,后文中有详细描述;RevisionSVN内部的工程文件夹的版本号。一个发布版本可能对应多个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 by yeyuboy (没有被验证) 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 by xmpp (没有被验证) on 星期六, 九月 9, 2006 - 22:59

TortoiseSVN和资源管理器整合在一起,有时候更新有问题,我觉得subclipse(eclipse的svn插件)更好用。

posted @ 2006-09-12 16:05 subversion 阅读(3820) | 评论 (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 阅读(840) | 评论 (0)编辑 收藏

Subversion的Repository列表完美解决方案

我的SVN项目都放在h:/svn下,在Apache中只是把这个目录设置成了虚拟目录,这样我可以方便的通过http: //localhost/svn/project1访问这个目录下的所有Repository,但如果我想访问http: //localhost/svn/,是得不到所有Repository列表的,只是一个403 Forbidden错误,在TortorseSVN的帮助中有这么一篇文章中提到了解决的方法,下面是我的具体实施和一点心得。

SVN在Apache中的配置段一般都用<Location>,我尝试过使用<Directory>,好像也可以,但不管用那个,在配置中无法使用AllowOverride指令,也就是说.htaccess文件无法使用。因此,若想把http: //localhost/svn/转向到调用其它文件,只能使用Rewrite module,并且必须写在<Location>段之外。我就是在这里试了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]
<Location /svn>
DAV svn
SVNParentPath h:/svn
</Location>

先用Alias定义到h:/svn/svntools的虚拟目录,这样就可以访问到svn_index.php文件了,然后打开 RewriteEngine,使用RewriteRule将到/svn/的访问重定向到/svntools/svn_index.php文件,通过执行这个文件就会产生Repository列表了;最后是SVN虚拟目录的配置。


posted @ 2006-09-11 22:49 subversion 阅读(999) | 评论 (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 阅读(6914) | 评论 (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)

  1. Go to http://www.sleepycat.com/download/db/index.shtml to download the latest version of Berkeley DB (db-4.X.X.tar.gz)
  2. Unpack it using the following command:
    tar zxvf db-4.X.X.tar.gz
    
  3. Download any new patches from the website and apply using the following:
    cd /path/to/db-4.X.X
    patch -p0 < patchfile
    
  4. 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

  1. Go to http://httpd.apache.org/download.cgi to download the latest version of Apache server (httpd-X.X.X.tar.gz)
  2. Unpack it using the following command:
    tar zxvf httpd-X.X.X.tar.gz
    
  3. 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
    
  4. 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

  1. Go to http://www.webdav.org/neon/ and download neon library 0.24.6 or better.
  2. Unpack it and rename the directory from "./neon-0.24.6/" to "./neon/".
  3. 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

  1. Go to http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=260 to download the latest source tar ball for Subversion (subversion-X.X.X.tar.gz
  2. Unpack it using the following command:
    tar zxvf subversion-X.X.X.tar.gz
    
  3. 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)

  1. 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

  1. 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

  1. 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
    
  2. 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
    </Location>
    
  3. Fix the ServerName, username, etc. as appropriate in both httpd.conf and ssl.conf
  4. 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

  1. Start up Apache server with SSL option:
    $HOME/local/bin/apachectl -f $HOME/local/conf/httpd.conf -DSSL
    

Creating a Repository in Subversion

  1. To create a repository called "test_repos" (requires administrator privileges):
    svnadmin create /path/to/test_repos
    
  2. 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"
    
  3. 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 阅读(487) | 评论 (0)编辑 收藏

仅列出标题  下一页