`

SVN环境下应用开发指导手册

阅读更多

                             目 录

一、       引言... 3

1     SVN是什么... 3

2     SVN功能特性... 3

二、       应用环境安装配置... 4

1     SVN基础安装(Windows下)... 4

1.1      基于svnserve. 4

1.2      基于apache. 6

2     SVN基础安装(Linux下)... 8

2.1       基于svnserve. 8

2.2       基于apache. 12

3     SVN权限管理... 14

3.1      基于svnserve. 14

3.2      基于apache. 15

4     SVN备份... 16

4.1       在windows下的备份... 16

4.2       在Linux下备份... 18

5     和Ant一起使用... 19

三、       项目开发实战应用... 19

1     项目简介... 19

2     团队开发管理... 22

3     IDE集成... 24

四、       SVN常用命令参考用法... 25

1     Svn. 25

2     Svn co. 26

3     Svn add. 27

4     Svn import. 27

5     Svn export. 27

6     Svn merge. 28

五、       参考文献... 30

 

 


 

一、           引言
1          SVN是什么
Subversion(以下简称SVN)是一个自由、开放源码、跨平台的版本控制系统.

SVN能替代 CVS,项目主页是http://subversion.tigris.org,它的初始目标很明确,实现绝大部分CVS的已有功能,充分考虑现有的CVS用户,在使用方式上模仿CVS,同时开发了一系列工具,使得基于CVS的项目能够顺利迁移到SVN上,和CVS相比,它有很多优点,例如目录版本控制、不可分割的提交、一致的数据处理方式和更有效率的分支与标记等,它们都支持多项目多用户并发版本控制。

SVN有两种运行方式,一种是基于Apache Http Server,另外一种是svnserve。一般推荐使用基于Apache Http Server的SVN,这样做几个好处:

A.能使用WebDAV协议。

B.能使用浏览器作为客户端工具浏览源码仓库。

C.可以很容易的支持 到SSPI(Windows域认证)和LDAP,这些都是Apache本身就支持的。

D.能得到比较完善的Apache安全认证系统,比如 SSL加密连接。

 

2          SVN功能特性
2.1    保留大多数CVS 特性

SVN意味着比CVS更好,它拥有CVS的大多数特性.

2.2    提交是真实的原子操作

在整体提交之前不会有部分提交起作用的情况出现,修订号对应每次提交而不是对应每个文件,log信息与修订号附在一起,并没有和CVS一样需要冗余的地方存放。

2.3    可以通过 WebDAV/DeltaV协议 选择Apache作为网络服务器

SVN可以使用HTTP为基础的WebDAV/DeltaV协议用来网络通讯,Apache服务器提供版本库端的网络服务,这给了SVN更好的协同性,也轻易获得许多关键特性:认证、路径为基础的授权,数据压缩和基本的版本库浏览。

2.4   可以选择独立服务器模式

SVN也提供了独立服务器选项,这时使用自定义的协议(并不是所有的人希望运行Apache 2.x),独立服务器模式可以作为inetd的一个服务运行,或者以守护进程模式,提供了基本的认证和授权,也可以使用SSH作为通道。

2.5   本地化的客户端/服务器,分层的库设计

SVN从一开始就是设计为客户端/服务器模式,从而免去了许多折磨着CVS的维护问题,代码是有一系列结构化的模块组成,有定义良好的接口,设计为被别的程序调用。

2.6 消耗和修改部分的大小成比例,而不是数据的大小

通常情况下,SVN操作所耗费的时间与此次操作引起的变化成比例,而不是对这个项目改变的绝对值,这个是SVN版本库模型的特性。

2.7 可以选择数据库和纯文件的版本库实现

版本库可以使用嵌入的数据库后端也可以使用定义格式的纯文件的后端

2.8 处理二进制文件的高效性

SVN对于二进制文件具备同文本文件一样的高效性,这是因为它在传输和存储连续的修订版本中使用二进制的文件交换算法。

2.9 可解析的输出

SVN所有的命令行客户端输出的内容都经过精心的设计,适合人们读取和自动解析;脚本化也具备较高的优先级。

2.10 本地化信息

SVN会根据本地设置使用gettext()来显示传输错误、报告和帮助信息。

二、           应用环境安装配置
1          SVN基础安装(Windows下)
 

1.1      基于svnserve
 

       1.1.1下载安装程序

 

服务端安装程序下载地址:

http://subversion.tigris.org/files/documents/15/39559/svn-1.4.5-setup.exe

            客户端安装程序下载地址:

        http://prdownloads.sourceforge.net/tortoisesvn/

        TortoiseSVN-1.4.5.10425-win32-svn-1.4.5.msi?download

安装过程使用默认配置即可。

服务端安装好后软件会自动在系统的环境变量中增加相应的值,测试是安装完成可以在cmd命令行中输入“svn”或者“svnadmin”来测试能否运行。

客户端安装好后重新启动计算机。

 

      1.1.2部署存储库运行服务端

 

建立svn存储库,路径自选,以E:\svn为例,创建好该文件夹后,进行windows服务绑定,以便以后每次重启服务器都能自动运行,这里用的是windows自带的服务创建命令sc,在命令行模式下执行:

sc  create SVNService binpath= “C:\Program Files\Subversion\bin\svnserve.exe –service –r  E:\svn” displayname= “SVNService” depend= Tcpip start= auto

其中,C:\Program Files\为svn服务端安装路径,E:\svn为svn存储库路径,“=”后面必须要有一个空格,否则会出现错误。

在提示建立成功后,可以直接输入“net start SVNService”来启动服务,或者可以直接在“管理工具”的“服务”中直接启动。

 

           1.1.3创建项目

 

进到svn存储库目录下E:\svn,鼠标右键选择,totoiseSVN—>create repository here进行创建,创建之前保证该目录下没有任何文件,创建成功后会在里面自动生成几个文件夹:

dav目录是提供给Apache与 mod_dav_svn使用的目录,让它们存储内部数据;

db目录就是所有版本控制的数据文件;

hooks目录放置hook脚本文件的目录;

locks用 来放置Subversion文件库锁定数据的目录,用来追踪存取文件库的客户端;

format文件是一个文本文件,里面只放了一个整数,表示当前文件库配 置的版本号;

conf存放的是配置文件。

 

           1.1.4设置访问权限

 

在conf目录下打开svnserve.conf文件,找到general标签,做如下修改:

[general]

anon-access = none

autn-access = write

password-db = passwd

第一个用来设置匿名用户的权限 none为设置存储库不允许匿名访问

第二个用来设置经过授权的用户的权限 write为可以写入

第三个用来指定授权用户的密码存放文件

 

在同一目录下打开passwd文件,做如下设置:

[users]

user1 = pass1

这里就是指定授权访问用户名和密码,格式为:用户名 = 密码

多个用户就写多行。

 

接下去就可以开始使用TotoiseSVN进行Import、Update、Checkout、Commit等操作了。

 

           1.1.5使用TotoiseSVN将项目文件导入存储库

 

在要导入的项目文件上单击右键,选择TotoiseSVNàadd,将文件添加到版本控制,会弹出对话框要求输入url,输入:svn://10.10.40.221(服务器ip),然后输入用户名,密码,完成之后,会在文件夹上多一个加号图标,然后在同一文件夹上单击右键选择SVN Commit,文件就会被添加到svn存储库。

 

             1.1.6使用TotoiseSVN将项目文件导出存储库

 

在本地文件加上单击右键,选择SVN Update,svn存储库中的文件就会被导出到本地文件夹。

 

1.2      基于apache
 

1.2.1安装Apache


安装Apache前,你要有一台运行Windows2000、Windows XP + sp1或Windows2003的电脑。

http://apache.mirror.phpchina.com/httpd/binaries/win32/ 下载最新版本的Apache Web服务器。确保你下载的版本大于2.0.54。2.0.54版本的Apache将不能与Subversion 1.3.xx配合工作。而且,小于2.0.54的Apache也因为在windows上的编译存在一个bug而导致不能与subversion1.2配合使用。另外SVN1.4.3以上提供的so文件只支持Apache2.0,并不支持2.2版本的。

一旦你已经有了Apache2的安装程序,你可以双击它,它将引导你完成整个安装过程。请确保你输入正确的服务器URL(如果你的服务器没有DNS名称,你可以直接输入IP地址)。建议将Apache安装成 for all Users,on Port 80,as a service。注意:如果你已经有一个IIS或者其它的程序使用80端口,安装可能会失败。如果是这样,你可以到程序目录下的Apache Group\Apache2\conf目录中找到文件httpd.conf,将其中的Listen 80改成一个不用的端口,比如Listen 81。然后重新运行这个安装程序,这次应该不会再有问题了。

现在你可以在你的浏览器中键入 http://loccalhost/,如果呈现了一个已经配置好的网站,那么你的Apache就安装成功了。

 

1.2.2安装Subversion


http://subversion.tigris.org/servlets/ProjectDocumentList?

    folderID=91下载最新版本的Subversion。

运行Subversion安装程序,如果安装程序能够识别你已经安装了Apache,那么你的安装基本上就OK了。如果它不能,那么你要做一些额外的步骤。
注:如果你先安装Apache,再安装Subversion,正常情况下下面的工作(配置前)Subversion安装程序已经帮你完成了。使用资源管理器,进入Subversion的安装目录(通常为c:\program files\Subversion),找到bin目录下的文件mod_dav_svn.so和mod_authz_svn.so,将它们拷贝到Apache的modules目录(通常为c:\program files\apache group\apache2\modules)。

从Subversion的安装目录拷贝文件libdb43.dll到Apache的modules目录。

使用如记事本之类的文本编辑器编辑Apache的配置文件(通常为c:\program files\apache group\apache2\conf\httd.conf),修改以下内容:

去掉以下行的注释(将开头的#删除):

#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule dav_module modules/mod_dav.so

 

在LoadModule节的最后添加以下两行:

LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

 

1.2.3   配置


现在,已经安装了Apache和Subversion,但是Apache还不知道如果处理像TortoiseSVN一样的Subversion客户端。要让Apache知道哪个URL将被Subversion使用,你要像下面这样编辑Apache的配置文件(通常在c:\program files\apache group\apache2\conf\httpd.conf):

在配置文件的最后添加下面这些行:

<Location /svn>
DAV svn
SVNPath D:\svnhome
AuthType Basic
AuthName “Subversion repositories”
AuthUserFile D:\svnhome\passwords
#AuthzSVNAccessFile D:\svnaccessfile
Require valid-user
</Location>

这样配置表示:所有的版本库将位于D:\svnhome目录下,要访问版本库可以使用这样的URL:http://MyServer/svn/,访问权限将由passwords文件中的用户名/密码来限制。

 

要创建用户,可以打开命令行(DOS窗口),将当前目录切换到apache2目录 (通常为c:\program files\apache group\apache2),然后打入以下命令以创建文件: bin\htpasswd -c D:\svnhome\passwords myloginame 表示在版本库D:\svnhome中创建一个存放用户信息的文件passwords,然后在这个文件中添加了一个叫myloginame的用户,回车后就可以设置该用户的密码了,这是创建第一个用户的方法,之后再创建用户切记一定要将-c改了,可以改成-m,如htpasswd -m D:\svnhome\passwords myloginame2,这样就可以创建很多个用户。重启Apache服务。

将你的浏览器指向http://MyServer/svn/MyNewRepository(MyNewRepository是你之前创建的Subversion版本库)。如果一切正常,你将被提示输入用户名密码,输入正确的用户名密码后你就可以看到版本库中的内容了。

对刚刚输入的apache配置作一些简短的说明:

<Location /svn>
意味着可以通过像这样的URL(http://MyServer/svn)来访问Subversion版本库
DAV svn
告诉Apache哪个模块负责服务像那样的URL--在这里就是Subversion模块
SVNListParentPath on
在Subversion 1.3及更高版本中,这个指示器使得Subversion列出由SVNParentPath指定的目录下所有的版本库
SVNParentPath D:\SVN
告诉Subversion在目录D:\SVN下寻找版本库
AuthType Basic
启用基本的验证,比如用户名/密码对
AuthName "Subversion repositories"
当一个验证对话框弹出时,告诉用户这个验证是用来做什么的
AuthUserFile D:\passwd
指定D:\passwd用为密码文件用来验证用户的用户名及密码
AuthzSVNAccessFile D:\svnaccessfile
指定D:\svnaccessfile来限定各个用户或组在版本库中目录的访问权限
Require valid-user
限定用户只有输入正确的用户名及密码后才能访问这个路径

 

2          SVN基础安装(Linux下)
 

2.1      基于svnserve
 

2.1.1 安装svnserve

 

安装包获取:

http://subversion.tigris.org/downloads/subversion-1.4.5.tar.gz

http://subversion.tigris.org/downloads/subversion-deps-1.4.5.tar.gz

以root用户登录 ,执行一下命令:

  tar xfvz subversion-1.4.5.tar.gz
  tar xfvz subversion-deps-1.4.5.tar.gz
  cd subversion-1.4.5
  ./configure --prefix=/opt/svn --without-berkeley-db –with-zlib
  (注:以svnserve方式运行,不加apache编译参数。以fsfs格式存储版本库,  不

   编译berkeley-db)
  make clean
  make
  make install

  vi /etc/profile,在/etc/profile最后加入:
  PATH=$PATH:/opt/svn/bin

 

2.1.2 配置svn

                  

                       建立版本库目录,可建多个:

  mkdir -p /opt/svndata/repos1

  mkdir -p /opt/svndata/repos2

  建立版本库:

  svnadmin create /opt/svndata/repos1

  svnadmin create /opt/svndata/repos2

 

  修改版本库配置文件:

  版本库1:

  vi /opt/svndata/repos1/conf/svnserve.conf内容修改为:

  [general]

  anon-access = none

  auth-access = write

  password-db = /opt/svn/conf/pwd.conf

  authz-db = /opt/svn/conf/authz.conf

  realm = repos1

  版本库2:

  vi /opt/svndata/repos2/conf/svnserve.conf内容修改为:

  [general]

  anon-access = none

  auth-access = write

  password-db = /opt/svn/conf/pwd.conf

  authz-db = /opt/svn/conf/authz.conf

  realm = repos2  

  即除realm = repos2外,其他与版本库1配置文件完全相同。如果有更多的 

  版本库,依此类推。

 

  配置允许访问的用户:

  vi /opt/svn/conf/pwd.conf  

  为了简化配置,2个版本库共用1个用户配置文件。如有必要,也可以分开。

  注意:对用户配置文件的修改立即生效,不必重启svn。

 

  文件格式如下:

  [users]

  <用户1> = <密码1>

  <用户2> = <密码2>  

  其中,[users]是必须的。下面列出要访问svn的用户,每个用户一行。

  示例:

  [users]

  alan = password

  king = hello

 

  配置用户访问权限:

  vi /opt/svn/conf/authz.conf  

  为了简化配置,3个版本库共用1个权限配置文件/opt/svn/conf/authz.conf。

  如有必要,也可以分开。

  文件中定义用户组和版本库目录权限。注意:

  * 权限配置文件中出现的用户名必须已在用户配置文件中定义。

  * 对权限配置文件的修改立即生效,不必重启svn。

 

  用户组格式:

  [groups]

  <用户组名> = <用户1>,<用户2>

  其中,1个用户组可以包含1个或多个用户,用户间以逗号分隔。

  版本库目录格式:

  [<版本库>:/项目/目录]

  @<用户组名> = <权限>

  <用户名> = <权限>  

 

  其中,方框号内部分可以有多种写法:

  /,表示根目录及以下。根目录是svnserve启动时指定的,我们指定为 

  /opt/svndata。这样,/就是表示对全部版本库设置权限。

  repos1:/,表示对版本库1设置权限

  repos2:/occi, ,表示对版本库2中的occi项目设置权限

  repos2:/occi/aaa, ,表示对版本库2中的occi项目的aaa目录设置权限   

  权限主体可以是用户组、用户或*,用户组在前面加@,*表示全部用户。权限

  可以是w、r、wr和空,空表示没有任何权限。示例:

  [groups]

  admin = alan[/]

  @admin = rw[repos1:/occi/aaa]

  king = rw[repos2:/pass]

  king =

 

  删除无用文件:

  rm /opt/svndata/repos1/conf/authz

  rm /opt/svndata/repos1/conf/passwd

  rm /opt/svndata/repos2/conf/authz

  rm /opt/svndata/repos2/conf/passwd

 

2.1.3 启动svn

 

建立启动svn的用户:

useradd svn

passwd svn

根据提示为用户svn设置密码允许用户svn访问版本库:

chown –R svn:svn /opt/svndata

chown –R svn:svn /opt/data启动svn:

su - svn -c "svnserve -d -r /opt/svndata"其中:

su – svn表示以用户svn的身份启动svn

-d表示以daemon方式(后台运行)运行

-r /opt/svndata指定根目录是/opt/svndata

 

检测服务是否开启:netstat -ntlp如果看到3690的端口正常开放了,证明SVN启动了。

下面是机器上的端口显示:

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address         Foreign Address              State        PID/Program name

tcp         0       0 0.0.0.0:32769         0.0.0.0:*                    LISTEN       2611/rpc.statd

tcp         0       0 0.0.0.0:111           0.0.0.0:*                    LISTEN       2591/portmap

tcp         0       0 0.0.0.0:113           0.0.0.0:*                    LISTEN       2827/xinetd

tcp         0       0 127.0.0.1:631         0.0.0.0:*                    LISTEN       4860/cupsd

tcp         0       0 127.0.0.1:25          0.0.0.0:*                    LISTEN       2846/sendmail: acce

tcp         0       0 :::3690               :::*                        LISTEN       5513/svnserve

tcp         0       0 :::22                 :::*                        LISTEN       2812/sshd

 

如果开启了linux防火墙,需要设置开放3690端口:

输入以下命令:

vi /etc/sysconfig/iptables

在最后添加以下内容:

-A RH-Firewall-l-INPUT –m state -–state NEW –m tcp –-dport 3690 –j ACCEPT

保存后,重新启动防火墙:

service iptales restart

 

2.2         基于apache
 

        2.2.1 安装apache

 

Apache安装程序下载地址:

http://apache.mirror.phpchina.com/httpd/httpd-2.0.61.tar.gz

在命令行中输入以下命令:

# tar zxvf apache2.0.58.tar.gz //解压压缩包

进入解压后生成的目录,执行:

# ./configure --enable-dav --enable-so --prefix=/usr/local/apache2/ --enable-maintainer-mode --enable-rewrite    --enable-MODULE=shared    --with-mpm=worker

# make 

# make install

 

2.2.2 安装subversion

 

     在命令行中输入以下命令:

             # tar jxvf subversion-1.4.2.tar.bz2

             进入解压后生成的目录,执行:

             # ./configure --with-apxs=/usr/local/apache2/bin/apxs

             --prefix=/usr/local/subversion --with-apr=/usr/local/apache2

             --with-apr-util=/usr/local/apache2

             # make 

             # make intall

 

       2.2.3 创建svn 帐户

 

新建一个用户:svnroot

# groupadd svn

# useradd svnroot -g svn

# passwd svn

              用svnroot登录,创建库文件所在目录:

              $ mkdir /home/svnroot/repository

              创建项目根目录:

              $ mkdir /home/svnroot/repository/myproject

              创建项目myproject的存储仓库:

  $/usr/local/subversion/bin/svnadmin

   create home/svnroot/repository/myproject

              查看svn是否安装成功
              $ /usr/local/subversion/bin/svnadmin --version
              //不让其他人有该目录的权限
              $ chmod 700 /home/svnroot/repository
              (svnroot用户操作结束)

             

        2.2.4 修改apache配置文件

 

              # vi /usr/local/apache2/conf/httpd.conf
                //找到下列语句,如果没有则自行添加
                LoadModule dav_svn_module modules/mod_dav_svn.so
                LoadModule authz_svn_module modules/mod_authz_svn.so
                //在后面添加
                <Location /svn>
                DAV svn
                SVNParentPath /home/svnroot/repository/ //svn父目录
                AuthzSVNAccessFile /home/svnroot/repository/authz.conf //权限配置文件
                AuthType Basic //连接类型设置
                AuthName "Subversion.zoneyump" //连接框提示
                AuthUserFile /home/svnroot/repository/authfile //用户配置文件
                Require valid-user //采用何种认证
                </Location>

 

        2.2.5 创建用户分配权限

             

增加用户
# htpasswd -c /home/svnroot/repository/authfile 用户名
第一次设置用户时使用-c表示新建一个用户文件。回车后输入用户密码,完   成对用户的增加
# htpasswd    /home/svnroot/repository/authfile 用户名(加入新的用户,就不用-c了)

 

 

权限分配

# vi /home/svnroot/repository/authz.conf

[groups]

admin=useradmin

devteamcs = useradmin,user1,user2//这里定义了一个用户组

[/]//对所有的项目,所有的用户都有读权限,admin用户有读写权限

@admin = rw

* = r

[test:/]//对test项目,

@devteamcs = rw

 

 

在 /usr/local/apache2/conf/httpd.conf 文件中配置,找到文件中的这两行:

User daemon

Group daemon

将daemon改为svnroot,组也做相应更改,让apache进程以svnroot的身份运行

改完后是这个样子

User svnroot

Group svn

 

重启apache
# /usr/local/apache2/bin/apachectl restart
打开浏览器访问http://localhost/svn/myproject/,要求输入用户名和密码,登录后即可看到svn项目内容。

 

3          SVN权限管理
 

3.1      基于svnserve
 

 

打开conf目录下的svnserver.config文件,找到authz-db = authz项,去掉前面的      注释#号,authz文件是svn目录权限配置文件,在同一目录下打开authz文件,修改如下:

 
               [groups]

               g_develop = user4,user3

               g_manager = user1

               g_test = user2

 

 

              [/]

               @g_develop = rw

               @g_test = r

               * = r

               [/workspace/PFMS-CRM]

               @g_develop = r

               @g_test = r

               * = r

 

                   Groups对应的是分组信息,例如,上面的配置分为三个组:g_develop,g_manager, 

g_test 。其中,g_develop组中有两个用户user3,user,g_manager组中有一个用户user1,g_test组中有一个用户user2,接下来是设置对目录的访问权限,[/]表示对根目录的访问权限,@g_develop = rw表示g_develop组可以对根目录进行读写操作,@g_test = r表示g_test组只能读根目录,* = r表示除了g_develop,g_test组,其他用户组的权限是只读。

 

                [/workspace/PFMS-CRM]

               @g_develop = r

               @g_test =r w

               * =

 

                表示如下信息:

对于目录/workspace/PFMS-CRM,g_develop组拥有读权限,g_test组拥有读写权限, 其他用户组没有权限访问该目录。

                一个用户可以同时在几个不同的用户组,如:

               [groups]

               g_develop = user4,user3

               g_manager = user1,user3

               g_test = user2

               user3同时在g_develop,g_manager两个用户组,他拥有两个组所赋予的权限。

       

3.2      基于apache
 

打开conf目录下的httpd.conf文件。

如果你想让所有用户对版本库都有读的权限而只有特定的用户才有写的权限,你可以将这行 Require valid-user

改为

<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>

上面的配置使用了passwords文件将你所有的版本库作为一个单元来限定访问权限。如果你想获得更多的控制,如限定某个用户可以访问版本库中的哪个目录,可以把下面这行的#去掉:

#AuthzSVNAccessFile D:\svnhome\svnaccessfile

然后用文本编辑器创建一个Subversion授权文件。Apache将确保只有有效的用户可以访问你的/svn位置,然后将用户名传到AuthzSVNAccessFile模块,这样可以依据Subversion授权文件得到更精细的权限控制。注意,路径将被指定为[库路径]或者简单的[路径]。如果你不明确指定一个库,访问规则将应用到由SVNParentPath指定的目录下所有的版本库中。一个授权文件例子可能像这样:

[groups]
admin = john, kate
devteam1 = john, rachel, sally
devteam2 = kate, peter, mark
docs = bob, jane, mike
training = zak

# 为所有库指定默认访问规则
# 所有人可以读,管理员可以写,危险分子没有任何权限
[/]
* = r
@admin = rw
dangerman =

# 允许开发人员可以完全访问他们的项目版本库
[proj1:/]
@devteam1 = rw
[proj2:/]
@devteam2 = rw
[bigproj:/]
@devteam1 = rw
@devteam2 = rw
trevor = rw

# 文档编写人员对所有的docs目录有写权限
[/trunk/doc]
@docs = rw

# 培训人员可以完全访问培训版本库
[TrainingRepos:/]
@training = rw

 

4          SVN备份
 

4.1       在windows下的备份
 

建立自动备份脚本:

项目都放在f:\svn_repo目录下,备份目录为svndump,下面的三个文件都放在该目录下。

svndump.bat

@echo off

rem set logfile=svndump.log

set SVN_HOME=D:\YHCM\svn\bin

set SVN_ADMIN=D:\YHCM\svn\bin\svnadmin.exe

set SVN_LOOK=D:\YHCM\svn\bin\svnlook.exe

set SVN_REPO=f:\svn_repo

set RAR="C:\Program Files\WinRAR\Rar.exe"

@chcp 850

if not exist z:\nul net use z: \\192.168.2.226\g$\svndump

FOR /f %%C IN (projectlist.conf) DO  @call dump.bat %%C

 

dump.bat

@ECHO OFF

if "%1"=="" goto no_args

set PROJECT=%1

if not exist %PROJECT% mkdir %PROJECT%

cd %PROJECT%

SET LOWER=0

if exist last_revision.txt FOR /f %%C IN (last_revision.txt) DO  set /a LOWER=%%C+1

FOR /f %%D IN ('%SVN_LOOK% youngest %SVN_REPO%\%PROJECT%') DO set UPPER=%%D

IF %LOWER% GTR %UPPER% GOTO :N_EXIT

SET D=_

SET FILENAME=%PROJECT%%D%%LOWER%%D%%UPPER%

ECHO %FILENAME%

%SVN_ADMIN% dump %SVN_REPO%\%PROJECT% -r %LOWER%:head --incremental >%FILENAME%.dmp

%RAR% a -df %FILENAME%.rar %FILENAME%.dmp

if not exist "z:\%PROJECT%" mkdir "z:\%PROJECT%"

copy %FILENAME%.rar z:\%PROJECT%\

@echo %UPPER% > last_revision.txt

:N_EXIT

@CD..

@exit /B

:no_args

@ECHO ON

@echo "please use dump project_name"

 

projectlist.conf,需要备份的清单,每个项目一行:

test1

test2

presales

 

最后把svndump.bat设为每天晚上12点自动运行,最后svndump目录内,每个项目会生成一个文件夹,里面的内容如下

2006-11-21  00:00                 7 last_revision.txt

2006-10-11  17:01       172,322,257 presale_0_1038.rar

2006-10-11  17:01            44,534 presale_1038_1041.rar

2006-10-11  17:01            71,106 presale_1041_1049.rar

2006-10-11  17:01            30,979 presale_1049_1057.rar

2006-10-11  16:59             8,415 presale_1057_1058.rar

2006-10-11  16:59            41,255 presale_1058_1063.rar

2006-10-11  16:59             5,768 presale_1063_1064.rar

2006-09-29  00:00            10,268 presale_1064_1065.rar

2006-10-09  00:00            16,574 presale_1065_1068.rar

2006-10-10  00:04            23,291 presale_1068_1075.rar

2006-10-11  00:00           118,851 presale_1075_1080.rar

2006-10-12  00:00            57,249 presale_1080_1082.rar

2006-10-18  00:01           273,010 presale_1082_1086.rar

2006-10-19  00:00        11,062,588 presale_1086_1101.rar

2006-10-20  00:08           327,973 presale_1101_1103.rar

2006-10-21  00:00           692,018 presale_1103_1105.rar

2006-10-24  00:00           653,189 presale_1105_1112.rar

2006-10-25  00:00           659,009 presale_1112_1113.rar

2006-10-28  00:07           484,524 presale_1113_1116.rar

2006-10-31  00:00            50,011 presale_1116_1118.rar

2006-11-01  00:00            20,778 presale_1118_1119.rar

2006-11-02  00:00            11,006 presale_1119_1121.rar

2006-11-03  00:02            50,194 presale_1121_1127.rar

2006-11-07  00:02           392,659 presale_1127_1130.rar

2006-11-08  00:00            41,635 presale_1130_1131.rar

2006-11-10  00:00            23,159 presale_1131_1143.rar

2006-11-11  00:00            76,475 presale_1143_1149.rar

2006-11-14  00:00            54,993 presale_1149_1157.rar

2006-11-16  00:00            62,222 presale_1157_1164.rar

2006-11-18  00:00            91,973 presale_1164_1180.rar

2006-11-21  00:00             8,077 presale_1180_1181.rar

 

last_revision文件记录了上次备份到哪个版本。

 

4.2       在Linux下备份
       

              脚本名为:backup.sh,放在:/opt目录下,脚本内容如下:

 

#!/bin/bash

DATE=`date +%Y%m%d`

 

#进入svnadmin目录

cd /usr/local/subversion/bin

 

#执行全备份命令,对3个项目进行备份

./svnadmin hotcopy /home/repository/project1 /home/repository/$DATE.project1.backup --clean-logs

./svnadmin hotcopy /home/repository/project2 /home/repository/$DATE.project2.backup --clean-logs

xin

 

执行如下命令:

chmod +x backup.sh

./backup.sh

完成对项目的备份。

执行如下命定,定时执行:

crontab –e

             在文件中输入:

              30 23 * * 6 /opt/backup.sh

              表示在每周六的23:30执行backup.sh

 

5          和Ant一起使用
 

http://subclipse.tigris.org找到最新版本的svnant,下载后解压缩。

复制svnant解压目录下的文件: "lib/svnant.jar",

    "lib/svnClientAdapter.jar" 和 "lib/svnjavahl.jar" 到你的Ant安装目录下的 "lib" 目录。

   

从你的svnant解压目录复制 "libdb42.dll", "libeay32.dll", "ssleay32.dll"

和"svnjavahl.dll" 到Ant构建脚本所在的目录下。

然后在Ant脚本中声明svntask:

<taskdef resource="svntask.properties"  classpath="ant.classpath"/>

接着就可以构建svn的checkout任务了:

<target name="checkout">

  <delete dir="${basedir}"/>

  <svn username="wan.yong" password="wy" javahl="true">

      <checkout url="${svn.url}" revision="HEAD" destPath="${basedir}"/>

  </svn>

    </target>

三、           项目开发实战应用
1        项目简介
 

1.1     背景假设

 

实信公司是一家软件研发公司,最近有一个银行项目,要建立代码库,目前有cvs ,vss ,svn可供选择,比较它们的优劣做出选择。

 

1.2     cvs与svn的比较:

 

1.2.1 对重命名、删除文件的支持

cvs:不支持本地文件重命名提交,删除分remove和erase两种前者把本地 

     和库中文件都删除,后者只是删除本地文件,不能删除文件夹。

              svn:支持文件重命名提交系统会提示删除旧文件,创建新文件,删除本地

              文件提交库中文件也被删除。

 

 

1.2.2 对中文路径名的支持

               cvs:支持的比较好

               svn:要将权限控制文件保存为svn支持的UTF-8格式

 

 

1.2.3 本地文件与库的对应关系

               cvs:可以多对多

               svn:一个库可以有多个工作目录但一个工作目录只能对应一个库 虽然可以 

             更改库位置但是要求很严格

 

 

1.2.4 库中文件存放方式

               cvs:完全用户可见方式与客户端文件夹结构完全一致(cvs生成文件除外)

               svn:与vss相似,看不到文件真正的内容

 

 

1.2.5 用户、权限管理

               cvs:管理员很难清楚的知道一个项目到底有多少个用户各用户的权限和密  

              码是什么只能用分组的方式管理用户而且密码和权限还是不清晰

               svn:查看、修改配置文件即可

 

 

1.2.6 权限

               cvs:有read、write、creat、none这四种权限,任何人不能删除文件夹(admin 

             也只能跑到服务器上把相应文件夹删除)。

             svn:只有read、write、none三种权限, creat和delete权限和write是捆

              绑在一起的。

 

1.3    vss和svn 的对比:

 

1.3.1. 支持重命名,这对 Java 开发来说非常重要

 

为了得到更好的代码,开发中需要经常进行重构,重构就经常涉及到文件的

重构名,而重命名中 VSS 中是不被支持的。

 

1.3.2. 开发的时候不一定要锁定

 

一方面导致重构不方便,另一方面,不能离线开发,使用 SVN 就不同,可以带回家继续开发,回来后,提交就行了。

 

1.3.3. 多平台

 

可以支持多个平台下的操作。

 

1.3.4. 更好的客户端支持

 

Eclipse 中的 VSS Plugin 不如它的 SVN Plugin 好用。一个在 Windows 下用的 SVN 客户端 TortoiseSVN 也比 VSS 的客户端好用(VSS 只有微软提供的一个 GUI 客户端)。

 

1.3.5. 更好地与外围工具集成

 

各种各样的外围工具(主要是服务器端),满足多种需要。如果有需要,也可以自己写插件或管理脚本,开放的架构,允许我们这样做。

 

1.3.6. 方便

 

一个例子:部署应用的时候,以前的做法是找出一个项目中修改过的文件,更新到服务器上去,现在可以在服务器上执行 svn export 命令,把代码库中的最新版本导出,完成部署(也可以替换回老版本)。

 

1.4     svn服务器相关信息

   

通过上面的比较选择svn。

  - 服务器地址: 192.168.0.1

  - 服务器OS: MS Windows 2000 Server Edition 中文版

  - 用于存放日志的代码库本地目录: ``D:\svn\pfms``

 

 

 

 

1.5     pfms项目文档的目录结构如下:

 

    pfms                 项目名称

    ├─code             开发人员工作目录

    ├─test              测试人员工作目录

    ├─docs             项目文档存放目录

    └─temp             临时文件目录

 

1.6     人员情况

 

  - morson,公司总经理

  - michael,银行项目经理

  - scofield,项目开发人员

  - lincon, 项目测试人员

  - linda,总部秘书,文笔不错,长得也不错

 

1.7     访问权限需求分析

 

 - 允许总经理、项目经理读取所有文件,开放写权限。

  - code目录只允许开发人员读写,其他人只能读。

  - test目录只允许测试人员读写,其他人只能读。

  - 不允许匿名访问

  - docs目录只允许秘书读写,对其他人只读

  - temp目录人人都可以随意读写

 

 

1.8     使用 svnserve.exe 作为 Subversion 服务器

 

 

2        团队开发管理
 

2.1启动 Subversion 服务

 

建立svn存储库,路径D:\svn,创建好该文件夹后,进行windows服务绑定,以便以后每次重启服务器都能自动运行,这里用的是windows自带的服务创建命令sc,在命令行模式下执行:

sc  create SVNService binpath= “C:\Program Files\Subversion\bin\svnserve.exe –service –r  D:\svn” displayname= “SVNService” depend= Tcpip start= auto

其中,C:\Program Files\为svn服务端安装路径,D:\svn为svn存储库路径,“=”后面必须要有一个空格,否则会出现错误。

在提示建立成功后,可以直接输入“net start SVNService”来启动服务,或者可以直接在“管理工具”的“服务”中直接启动。

 

 

 

2.2建立代码库

 

在服务器端的 ``D:\svn`` 目录下,建立一个名为 pfms 的代码库,命令如下:

 

       D:\svn>svnadmin create pfms

 

使用上述命令之后,如果不出问题的话,在 ``D:\svn`` 目录下就会多出一个叫做 ``pfms`` 的目录,其下具备 conf、dav、hooks、locks、db 等子目录或文件,此即一个名为pfms的代码库 。从此,通过 ``svn://192.168.0.1/pfms`` 这样的 URL,我们就可以对这个代码库进行访问了。

 

2.3权限配置

 

其实进入 ``pfms\conf`` 目录你就会发现,它下面已经存在三个写了一些帮助信息和示例的配置文件,以帮助用户尽早掌握其配置方法。这三个默认的配置文件分别是 svnserve.conf、passwd、authz 。其中后两者没有后缀,对于 windows 系统的用户来说,看起来总是有些怪异,所以在接下来的章节里面,我将它们两个都给添加了个 conf 后缀,以便管理。

 

 

2.4编辑代码库基础配置文件

 

在服务器端,编辑代码库的 ``pfms\conf\svnserve.conf`` 文件,如下:

 

      [general]

      password-db = passwd.conf

      anon-access = none

      auth-access = write

      authz-db = authz.conf

 

 

2.5管理用户帐号

 

在服务器端,新建 ``pfms\conf\passwd.conf`` 文件,如下:

 

      [users]

      morson = ShowMeTheMoney

      michael = mysecretpassword

      scofield = hellolittilekiller

      lincon = asyouknows111

      linda = IlikeWorldCup2006

 

 

2.6建立目录访问权限控制文件

 

在服务器端,新建 ``pfms\conf\authz.conf`` 文件,内容如下:

 

      [groups]

      g_vip = morson

      g_manager = michael

      g_code = scofield

      g_test = lincon

      g_docs = linda

 

      [pfms:/]

      @g_manager = rw

      * = r

 

      [pfms:/code]

      @g_manager = rw

      @g_code = rw

      @g_vip = r

      * =r

 

      [pfms:/test]

      @g_manager = rw

      @g_test = rw

      @g_vip = r

      * =r

 

      [pfms:/docs]

      @g_manager = rw

      @g_docs = rw

      * = r

 

      [pfms:/temp]

      * = rw

 

 

2.7导入代码

 

在客户机 ``F:\temp`` 目录下,建立好前述“背景假设”一节中描述的目录结构,然后用命令 ``F:\temp>svn import pfms svn://192.168.0.1/pfms --username michael --password mysecretpassword`` 导入整个目录结构。

 

这条指令的精确意思是,将 pfms 目录下面的所有东西,导入到那个名叫 pfms 的代码库中去。如果你不指定源目录,则 svn 会默认将当前目录作为源目录。比如说,处于 ``F:\temp`` 目录下的时候,直接执行 ``svn import svn://192.168.0.1/pfms`` ,那么当取出代码的时候,会多了一层名为 pfms的目录。结果,必须使用类似  ``svn://192.168.0.1/pfms/pfms`` 这样怪异的URL,才能够正确访问到代码。

 

 

3        IDE集成
 

3.1

进入eclipse,在主界面中选择:Helpàsoftware updaesàfind and installàsearch new       features to installànew Remote Siteà在弹出框中填入:name:svn;url: http://subclipse.tigris.org/update_1.2.x点击finish进入安装页面。

3.2

在安装页面选择subeclipseànext,选择接受许可协议复选框ànextàfinish

3.3

重新启动eclipse,在主界面中选择:windowàopen perspectiveàotheràSVN Repository Exploringànew Repository locationàurl:svn://10.10.40.221(服务器ip)

3.4

连接成功后,在项目上右键点击checkout即可。

 

 

 
 

四、           SVN常用命令参考用法
1         Svn
 

svn help
用法:svn <subcommand> [options] [args]
Subversion 命令行客户端,版本 1.2.0。
请使用 “svn help <subcommand>” 显示子命令的辅助说明。
大多数的子命令可接受文件或目录参数,对目录进行递回存取。
如无指定参数给命令,默认将会自当前的目录 (包含) 进行递归存取。

可用的子命令:(括号内是子命令的简写)
add
blame (praise, annotate, ann)
cat
checkout (co) //从源码库取出一个工作版本的拷贝
cleanup //
commit (ci) //提交当前工作拷贝的更改。这个地方是有可能出现代码冲突的。
copy (cp) //做一个工作拷贝的拷贝。
delete (del, remove, rm) //删除本地或者svn server response上的文件或者目录。
diff (di) //比较某个文件与库中的对应文件的不同,类似于系统的diff命令。参数:文件名。
export //导出一个无版本控制的目录树拷贝。一般用于导出发行,或者投入运行的版本。
help (?, h)
import //将本地当前目录下的文件导入到svn response 中。
info //当前目录下工作拷贝中某文件(文件夹)的信息,如URL,版本,修改日期等。参数:要看的文件(文件夹)
list (ls) //列出当前工作拷贝下的文件 ,相当于系统的ls命令,不过只能在工作拷贝目录下使用。
lock
log
merge //将两个来源之间的差异应用至工作拷贝路径。
mkdir //在本地或者svn respon上新建一个文件夹.参数:URL或者路径

move (mv, rename, ren)
propdel (pdel, pd)
propedit (pedit, pe)
propget (pget, pg)
proplist (plist, pl)
propset (pset, ps)
resolved
revert
status (stat, st) //svn工作拷贝当前状态,与svn server上的源码比较的结果。
switch (sw)
unlock
update (up) //将svn server端文件同步到本地

 

2        Svn co


svn co
checkout (co): Check out a working copy from a repository.
usage: checkout URL[@REV]... [PATH]

有效选项:
   -r [--revision] arg       : ARG (一些命令需要 ARG1:ARG2 )
                               修订版参数可以是:
                                 数字       修订版号
                                 "{" 日期 "}" 在指定时间以后的修订版date
                                 "HEAD"       最近的档案库
                                 "BASE"       基线,基于修订版的工作条目
                                 "COMMITTED"   最后提交或基线之前
                                 "PREV"       修订版提交之前
   -q [--quiet]             : 打印尽可能少
   -N [--non-recursive]     : 只在单个目录操作
   --username arg           : 指定用户 ARG
   --password arg           : 指定密码ARG
   --no-auth-cache           : 不要缓冲用户验证
   --non-interactive         : 不要交互提示
   --config-dir arg         : 从目录 ARG 读取用户配置文件
   --ignore-externals       : ignore externals definitions
  

 

3        Svn add
 


svn add
add: 把文件和目录放入版本控制中,
通过调度加到档案库。它们会在下一次提交时加入。
用法:add 路径...

有效选项:
   --targets arg             : 传递文件 ARG 内容为附件参数
   -N [--non-recursive]     : 只在单个目录操作
   -q [--quiet]             : 打印尽可能少
   --config-dir arg         : 从目录 ARG 读取用户配置文件
   --force                   : 强制操作运行
   --auto-props             : 使自动属性有效
   --no-auto-props           : 使自动属性无效  
  
   eg.(下面的命令必须在工作拷贝目录下运行)
   sh> svn add test.c //加一个文件
   sh> svn add test //加一个目录,目录下有任意结构的文件夹

 

 

 

4        Svn import

 
svn import http://localhost/svn/hehehehehhe -m=sdfsdf    //可在任何目录下,将当前文件夹下的所以文件递归导入到svn response 的hehehhhe目录下。

 

 

5        Svn export
 


svn export
export: 产生一个无版本控制的目录树拷贝。
用法:1、export [-r REV] URL[@PEGREV] [PATH]
         2、export [-r REV] PATH1[@PEGREV] [PATH2]

 1、 从 URL 指定的档案库,导出一个干净的目录树到 PATH。如果有指定
     REV 的话,内容即为该修订版的,否则就是 HEAD 修订版。如果 PATH
     被省略的话,地址(URL)的最后部份会被用来当成本地的目录名称。

  2、在工作拷贝中,从指定的 PATH1 导出一个干净的目录树到 PATH2。如果
     有指定 REV 的话,会从指定的修订版导出,否则从 WORKING 导出。如

   果PATH2 被省略的话,PATH1 的最后部份会被用来当成本地的目录名称。
     如果没有指定 REV 的话,所有的本地修改都还会保持著,但是未纳入版本

   控制的文件不会被复制。

     如果指定了 PEGREV ,将从指定的修订版本开始查找。


有效选项:
   -r [--revision] arg       : ARG (一些命令需要 ARG1:ARG2 )
                                  修订版参数可以是:
                                    数字       修订版号
                                    "{" 日期 "}" 在指定时间以后的修订版date
                                    "HEAD"       最近的档案库
                                    "BASE"       基线,基于修订版的工作条目
                                    "COMMITTED"   最后提交或基线之前
                                    "PREV"       修订版提交之前
   -q [--quiet]               : 打印尽可能少
   -N [--non-recursive]   : 只在单个目录操作
   --force                     : 强制操作运行
   --username arg           : 指定用户 ARG
   --password arg           : 指定密码 ARG
   --no-auth-cache          : 不要缓冲用户验证
   --non-interactive        : 不要交互提示
   --config-dir arg         : 从目录 ARG 读取用户配置文件
   --native-eol arg         : 使用一个与标准不同的 EOL 标记
                                 文件的系统标记是一个本地的 svn:eol-style 属性。
                                 ARG 可能是一下之一 'LF','CR','CRLF'
   --ignore-externals     : ignore externals definitions
  
   eg.
   sh> svn export http://localhost/svn/hehehehehhhe
  

 

 

6        Svn merge

svn merge  
merge: 将两个来源之间的差异应用至工作拷贝路径。
用法:1、merge sourceURL1[@N] sourceURL2[@M] [WCPATH]
         2、merge sourceWCPATH1@N sourceWCPATH2@M [WCPATH]
         3、merge -r N:M SOURCE[@REV] [WCPATH]

   1、第一种形式中,来源 URL 各被指定到修订版 N 与 M。这两个就是作为
       比较的来源。如果没有指定修订版的话,默认为 HEAD。

   2、在第二种形式中,对应到两个来源的工作拷贝路径的 URL 定义出用以
       进行比较的来源。这里必须指定修订版。

   3、第三种形式中,SOURCE 可为 URL 或工作拷贝项目,后者会使用对应的
       地址(URL)。在修订版 REV 的 地址(URL) 会以它存在于修订版 N 与

M 的路径来作比较。如果未指定 REV,就会假设为 HEAD。WCPATH 是

接受改变的工作拷贝路径。如果省略 WCPATH 的话,默认值为'.',除非

来源的主要名字符合 '.' 里的某个文件;在这种情况下,文件差异将会直

接应用至该文件去。

 

有效选项:
   -r [--revision] arg       : ARG (一些命令需要 ARG1:ARG2 )
                                  修订版参数可以是:
                                    数字       修订版号
                                    "{" 日期 "}" 在指定时间以后的修订版date
                                    "HEAD"       最近的档案库
                                    "BASE"       基线,基于修订版的工作条目
                                    "COMMITTED"   最后提交或基线之前
                                    "PREV"       修订版提交之前
   -N [--non-recursive]    : 只在单个目录操作
   -q [--quiet]               : 打印尽可能少
   --force                     : 强制操作运行
   --dry-run                  : 尝试操作但不修改
   --diff3-cmd arg          : 使用 ARG 作为合并命令
   --ignore-ancestry       : 合并时忽略原始信息
   --username arg          : 指定用户 ARG
   --password arg           : 指定密码 ARG
   --no-auth-cache           : 不要缓冲用户验证
   --non-interactive         : 不要交互提示
   --config-dir arg         : 从目录 ARG 读取用户配置文件

 

 

 

 

五、           参考文献
1  apache官方网站http://httpd.apache.org

2  svn官方网站http://httpd.apache.org

3  svn中文论坛 bbs.iusersvn.com

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics