Linux SVN安装

环境


操作系统:centos5.7


http版本:


Subversion版本:


一、检测系统是否已经装有svn
rpm -q subversion
如已经安装,请先卸载(rpm -e xxxxxxx)如果有依赖的rpm包,则一层层卸载


可以使用svn --version检测是否已经卸载


二、检测系统是否已经安装httpd
rpm -q httpd


如果已经安装,先卸载(rpm -e xxxxxx),有依赖包的,依次卸载


可以使用httpd --version检测是否已经卸载






三、下载apache运行环境依赖的包


Apache Server经过这么多年的发展后,将一些通用的运行时接口封装起来提供给大家,这就是Apache Portable Run-time libraries, APR


apr,apr-util的下载页面


注意最好选择同一个页面上面的版本


http://apr.apache.org/download.cgi




apr,apr-util的下载页面,在选择的时候要版本对应








1.下载apr和安装apr




 wget http://labs.mop.com/apache-mirror//apr/apr-1.4.6.tar.gz
 tar -zxvf apr-1.4.6.tar.gz
 cd apr-1.4.6
./configure --prefix=/usr/local/apr
 make&&make install 


2.下载aprutil和安装aprutil
 tar -zxvf apr-util-1.4.1.tar.gz
 cd apr-util-1.4.1
 ./configure --with-apr=/usr/local/apr --prefix=/usr/local/aprutil
 make && make install




3.neon包,下载地址:http://www.webdav.org/neon/


这边我下载的是neon-0.29.6.tar.gz


tar zxvf neon-0.29.6.tar.gz进行解压,生成neon-0.29.6


cd neon-0.29.6


./configure --prefix=/usr/local/neon
make && make install


安装完毕后,可以验证/usr/local/neon是否存在


4、subversion下载解压缩5.1下载和解压缩svn压缩包


注意这里先不安装


 下载页面地址


http://subversion.apache.org/source-code.html






2012-04-16最新的版本是


wget http://apache.etoak.com/subversion/subversion-1.7.4.tar.gz


下载完保存在/opt/目录下面


解压SubVersion安装包 (root用户进行下面的操作)


tar xvzf subversion-1.7.4.tar.gz




5、sqlite 安装


sqlite介绍


SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月. 至今已经有10个年头,SQLite也迎来了一个版本 SQLite 3已经发布。


sqlite安装


wget http://www.sqlite.org/sqlite-amalgamation-3071100.zip


http://www.sqlite.org,可以去这个网站上下载


下载完,解压缩


unzip sqlite-amalgamation-3071100.zip


然后将sqlite3.c,复制到已经解压缩的subversion文件夹里面


mkdir  /opt/subversion-1.7.4/sqlite-amalgamation
cp  sqlite-amalgamation-3071100/sqlite3.c   /opt/subversion-1.7.4/sqlite-amalgamation/sqlite3.c


如果这一步没有做的话后面在安装svn的时候会出现下面的提示: 


configure: error: Subversion requires SQLite
6、Berkeley DB安装(可选)


Berkeley DB(BDB)是一个高性能的,嵌入数据库编程库
特点: 极轻量级.BerkeleyDB本身并非传统的关系/对象数据库,它是基于C的系列函数库,大小约300K,但是可以管理达256TB的数据库,支持几十K用户同时对其进行操纵.
适用场合: 数据量大,但数据结构不是很复杂的数据库.


从其oracle公司官网http://www.oracle.com/technology/software/products/berkeley-db/index.html获得其安装包,


当前版本为DB 5.3.15


tar DB 5.3.15.tar.gz


cd db-5.3.15/build_unix
 (仅用于unix平台安装)
    #../dist/configure
 (主意:
1、如果以gcc和g++编译的话,须执行#env CC=gcc CCC=g++ ../dist/configure,否则编译时出现段错误
2、默认状态,berkeleyDB的lib和include将被安装到/usr/local/BerkeleyDB/下,需要更改这个路径的话,可以加上选项--prefix,例如:#../dist/configure --prefix=/opt/BerkeleyDB.)
    #make
    #make install
    #vi /etc/ld.so.conf
(并将berkeleyDB的lib路径加到该文件的最后一行,这样才能找到并加载它的库文件.ld.so.conf是系统动态链接库的配置文件.此文件内,存放着可被LINUX共享的动态链接库所在目录的名字(系统目录/lib,/usr/lib除外),各个目录名间以空白字符(空格,换行等)或冒号或逗号分隔.)
    #ldconfig
(#make uninstall卸载)


编译方法(源文件为test.c):
    #gcc test.c -ggdb -I/usr/local/BerkeleyDB.4.6/include/ -L/usr/local/BerkeleyDB.4.6/lib/ -ldb -lpthread -o test.out


四、httpd在linux平台下面的安装 


1、httpd介绍


httpd是Apache超文本传输协议(HTTP)服务器的主程序。被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程的池。


通常,httpd不应该被直接调用,而应该在类Unix系统中由 apachectl 调用,在Windows NT/2000/XP/2003中作为服务运行和在Windows 95/98/ME中作为控制台程序运行。






Hyper Text Transfer Protocol Daemon  超文字传输协定常驻程序


2、httpd下载和安装




如果设置不当在安装SVN的时候会出错会出现的报错内容:


httpd: Syntax error on line 53 of /usr/local/apache2/conf/httpd.conf: Cannot load /usr/local/apache2/modules/mod_dav_svn.so into server: /usr/local/apache2/modules/mod_dav_svn.so: undefined symbol: dav_register_provider


安装步骤


wget http://labs.mop.com/apache-mirror//httpd/httpd-2.4.2.tar.gz


tar –zvxf httpd-2.4.2.tar.gz


cd  httpd-2.4.2


./configure --prefix=/usr/local/apache  --with-apr=/usr/local/apr --with-apr-util=/usr/local/aprutil --enable-dav --enable-dav-fs --enable-so  --enable-maintainer-mode  --enable-rewrite --enable-track-vars --enable-cgi  --enable-mods-shared=all --with-mpm=worker 


make


make install


./configure --prefix=/usr/local/apache 设置CentOS Apache安装目录。这里设定安装在/usr/local/apache下,今后如果要卸载或者升级CentOS Apache时,直接删除这个目录即可。




* --enable-dav 启用davweb支持,是subversion+apache组合必选,缺少的话,在运行apache会出现undefined symbol: dav_register_provider的错误




 --enable-so 指定允许DSO(动态共享对像)


* apr 和 apr-util subversion安装会使用到apr和par-util,如果当前系统没有,最好安装一下


enable-track-vars 为启动cookie的get/post等追踪功能


enable-cgi 支持CGI
--enable-rewrite=share 开启Rewrite支持,以实现URL静态化,建议开启。
--enable-dav-fs   开启WebDAV支持,svn服务器等需要。 


3、启动httpd服务
[root@uiddev1 httpd-2.4.2]# service httpd start
启动 httpd:                                               [确定]




打开IE ,输入http://localhost,就可以出现下面的画面














4、查看httpd状态


 netstat -utl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 *:https                     *:*                         LISTEN




5、httpd语法


httpd




  [ -d serverroot ] [ -f config ] [ -C directive ] [ -c directive ] [ -D parameter ] [ -e level ] [ -E file ] 


  [ -k start|restart|graceful|stop|graceful-stop ] [ -R directory ] 


  [ -h ] [ -l ] [ -L ] [ -S ] [ -t ] [ -v ] [ -V ] [ -X ] [ -M ] 


  在中Windows系统,还可以使用下列参数: 


  httpd [ -k install|config|uninstall ] [ -n name ] [ -w ]












-k start|restart|graceful|stop|graceful-stop   发送信号使httpd启动、重新启动或停止。更多信息请参见停止Apache 。


-M 输出一个已经启用的模块列表,包括静态编译在服务器中的模块和作为DSO动态加载的模块。


-d serverroot 


  将ServerRoot指令设置初始值为serverroot。它可以被配置文件中的ServerRoot指令所覆盖。其默认值是/usr/local/apache2 。 


  -f config 


  在启动中使用config作为配置文件。如果config不以"/"开头,则它是相对于ServerRoot的路径。其默认值是conf/httpd.conf 。 


  -C directive 


  在读取配置文件之前,先处理directive的配置指令。 -c directive 在读取配置文件之后,再处理directive的配置指令。 


  -D parameter 


  设置参数parameter ,它配合配置文件中的<IfDefine>段,用于在服务器启动和重新启动时,有条件地跳过或处理某些命令。 


  -e level 


  在服务器启动时,设置LogLevel为level 。它用于在启动时,临时增加出错信息的详细程度,以帮助排错。 


  -E file 


  将服务器启动过程中的出错信息发送到文件file 。 


  -R directory 


  当在服务器编译中使用了SHARED_CORE规则时,它指定共享目标文件的目录为directory 。 


  -h 


  输出一个可用的命令行选项的简要说明。 


  -l 


  输出一个静态编译在服务器中的模块的列表。它不会列出使用LoadModule指令动态加载的模块。 


  -L 


  输出一个指令的列表,并包含了各指令的有效参数和使用区域。 


  


  -S 


  显示从配置文件中读取并解析的设置结果(目前仅显示虚拟主机的设置) 


  -t 


  仅对配置文件执行语法检查。程序在语法解析检查结束后立即退出,或者返回"0"(OK),或者返回非0的值(Error)。如果还指定了"-D DUMP_VHOSTS",则会显示虚拟主机配置的详细信息。  




  -V 


  显示httpd和APR/APR-Util的版本和编译参数,然后退出。 


  -X 


  以调试模式运行httpd 。仅启动一个工作进程,并且服务器不与控制台脱离。 


  下列参数仅用于Windows平台: 


  -k install|config|uninstall 


  安装Apache为一个Windows NT的服务;改变Apache服务的启动方式;删除Apache服务。 -n name 指定Apache服务的名称为name -w 保持打开控制台窗口,使得可以阅读出错信息。 




6、httpd额外设置请使用./configure --help来查看。




 ./configure  --help








五、subversion单机版安装


//配置subversion安装




 ./configure --with-apxs=/usr/local/apache/bin/apxs --prefix=/usr/local/subversion --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apr/bin/apu-1-config  --with-neon=/usr/local/neon/bin/neon-config --with-ssl --with-zlib --enable-maintainer-mode  




# make


//安装
# make install


//创建库文件所在的目录 (svnroot用户进行下面的操作)
# mkdir /home/svnroot/repository
//进入subversion的bin目录
# cd /usr/local/subversion/bin
//创建仓库"test"


./svnadmin create /home/svnroot/repository/test
# cd /home/svnroot/repository/test
//看看是不是多了些文件,如果是则说明Subversion安装成功了
# ls –l
# cd /usr/local/subversion/bin
//这条语句将把路径/home/user/import下找到的文件导入到你创建的Subversion 仓库中去,
//提交后的修订版为1。




# ./svn import /home/user/import file:///home/svnroot/repository/test –m "注释"


[root@yunwei2 subversion-1.7.4]# mkdir /repository
[root@yunwei2 subversion-1.7.4]# cd /usr/local/subversion/bin
[root@yunwei2 bin]# ls
svn  svnadmin  svndumpfilter  svnlook  svnrdump  svnserve  svnsync  svnversion
[root@yunwei2 bin]# ./svnadmin create /repository/test
[root@yunwei2 bin]# ls /repository/test
conf  db  format  hooks  locks  README.txt
[root@yunwei2 bin]# ./svn
svn            svndumpfilter  svnrdump       svnsync
svnadmin       svnlook        svnserve       svnversion
[root@yunwei2 bin]# mkdir /kk
[root@yunwei2 bin]# ls
svn  svnadmin  svndumpfilter  svnlook  svnrdump  svnserve  svnsync  svnversion
[root@yunwei2 bin]# touch /kk/aaa.txt
[root@yunwei2 bin]# ./svn import /kk/ file:///repository/test -m "kaishi"
正在增加       /kk/aaa.txt




提交后的版本为 1。
[root@yunwei2 bin]#
//不让其他人有该目录的权限




# chmod 700 /home/svnroot/repository




修改Apache配置文件
# cd /usr/local/apadche2/bin 
//启动Apache 
# ./apachect1 start 
# 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>
  //其中authfile是通过"htpasswd [–c] /home/svnroot/repository/authfile username password"来创建的 
  //"Require valid-user"告诉apache在authfile中所有的用户都可以访问。如果没有它,
  //则只能第一个用户可以访问新建库






6. 权限管理
1)增加用户 


]# useradd -m -s /bin/bash wooin




]# htpasswd -c authfile wooin
# htpasswd [-c] /home/svnroot/repository/authfile wooin
//第一次设置用户时使用-c表示新建一个用户文件。回车后输入用户密码,完成对用户的增加
# htpasswd authfile 用户名(加入新的用户)
2)权限分配
# vi /home/svnroot/repository/authz.conf 
  [test:/] //这表示,仓库test的根目录下的访问权限 
  wooin = rw //test仓库wooin用户具有读和写权限 
  bao = r //test仓库bao用户具有读权限 
  [test2:/] //test2仓库根目录下的访问权限 
  wooin = r //wooin用户在test2仓库根目录下只有读权限 
  bao = //bao用户在 test2仓库根目录下无任何权限 
  [/] //这个表示在所有仓库的根目录下 
  * = r //这个表示对所有的用户都具有读权限 
  #[groups] //这个表示群组设置 
  #svn1-developers = wooin, bao //这个表示某群组里的成员 
  #svn2-developers = wooin 
  #[svn1:/] 
  #@svn1-developers = rw //如果在前面加上@符号,则表示这是个群组权限设置








将这个设置完成后。重启Apache,就可以通过 
http://localhost/svn/test 
这个URL来访问仓库了,当然,受权限的限制,必须是合法用户才能访问且具有相应的权限 
7. 一些备忘:
1. svn checkout http://localhost/svn/hello.world
2. svn commit 时的默认编辑器的环境变量$SVN_EDITOR=vi需要手动设定,用kate好像有问题
3. 如果linux的登录用户名密码都和svn的其中一个用户名密码相同时,在checkout的时候不会要求输 入用户名密码直接就可以checkout出来。比如:linux有个用户wooin,svn也有一个用户wooin,并且密码 都是一样的,当用wooin登录linux后,执行checkout,可以直接提取出源码文件,不用输入认证信息。
4. 在svn使用过程中牵扯到几种权限:文件系统的权限,linux系统权限,svn用户的权限,apache进程的权限。
文件系统的权限,linux系统权限:这里相同的意思,就是平时大家使用linux时文件夹和文件的访问权限。在 svn建立仓库,文件夹,配置文件的时候用svnroot用户,并将仓库权限设置为700,不允许其他用户直接通过 文件系统查看,只能由svnroot进行管理。




linux常用svn命令
 1、将文件checkout到本地目录
svn checkout path(path是服务器上的目录)
例如:svn checkout svn://192.168.1.1/pro/domain
简写:svn co
        2、往版本库中添加新的文件
svn add file
例如:svn addtest.php(添加test.php)
svn add *.php(添加当前目录下所有的php文件)
        3、将改动的文件提交到版本库
svn commit -m “LogMessage“ [-N] [--no-unlock] PATH(如果选择了保持锁,就使用–no-unlock开关)
例如:svn commit -m “add test file for my test“ test.php
简写:svn ci
        4、加锁/解锁
svn lock -m “LockMessage“ [--force] PATH
例如:svn lock -m “lock test file“ test.php
svn unlock PATH
        5、更新到某个版本
svn update -r m path
例如:
svn update如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。
svn update -r 200 test.php(将版本库中的文件test.php还原到版本200)
svn update test.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,修改文件,然后清除svn resolved,最后再提交commit)
简写:svn up
        6、查看文件或者目录状态
1)svn status path(目录下的文件和子目录的状态,正常状态不显示)
【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定】
2)svn status -v path(显示文件和子目录状态)
第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。
注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。
简写:svn st
        7、删除文件
svn delete path -m “delete test fle“
例如:svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file”
或者直接svn delete test.php 然后再svn ci -m ‘delete test file‘,推荐使用这种
简写:svn (del, remove, rm)
        8、查看日志
svn log path
例如:svn log test.php 显示这个文件的所有修改记录,及其版本号的变化
        9、查看文件详细信息
svn info path
例如:svn info test.php
        10、比较差异
svn diff path(将修改的文件与基础版本比较)
例如:svn diff test.php
svn diff -r m:n path(对版本m和版本n比较差异)
例如:svn diff -r 200:201 test.php
简写:svn di
        11、将两个版本之间的差异合并到当前文件
svn merge -r m:n path
例如:svn merge -r 200:205 test.php(将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下)
        12、SVN 帮助
svn help
svn help ci
——————————————————————————
以上是常用命令,下面写几个不经常用的
——————————————————————————
        13、版本库下的文件和目录列表
svn list path
显示path目录下的所有属于版本库的文件和目录
简写:svn ls
        14、创建纳入版本控制下的新目录
svn mkdir: 创建纳入版本控制下的新目录。
用法: 
        1、mkdir PATH…
        2、mkdir URL…
创建版本控制的目录。
        1、每一个以工作副本 PATH 指定的目录,都会创建在本地端,并且加入新增调度,以待下一次的提交。
        2、每个以URL指定的目录,都会透过立即提交于仓库中创建。在这两个情况下,所有的中间目录都必须事先存在。
        15、恢复本地修改
svn revert: 恢复原始未改变的工作副本文件 (恢复大部份的本地修改)。revert:
         用法: revert PATH…
         注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复被删除的目录
        16、代码库URL变更
svn switch (sw): 更新工作副本至不同的URL。
用法: 1、switch URL [PATH]
          2、switch –relocate FROM TO [PATH...]
          1、更新你的工作副本,映射到一个新的URL,其行为跟“svn update”很像,也会将服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的方法。
          2、改写工作副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变动(比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用这个命令更新工作副本与仓库的对应关系。
          17、解决冲突
svn resolved: 移除工作副本的目录或文件的“冲突”状态。
用法: resolved PATH…
注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的
相关文件,然后让 PATH 可以再次提交。
         18、输出指定文件或URL的内容。
svn cat 目标[@版本]…如果指定了版本,将从指定的版本开始查找。
svn cat -r PREV filename > filename (PREV 是上一版本,也可以写具体版本号,这样输出结果是可以提交的)






六、httpd与svn相结合,做成网络版的svn


编辑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 /data/svn
</Location>


运行htpasswd添加用户和密码
/usr/local/apache2/bin/htpasswd -cm /data/svn/svn-auth-file chenmin
/usr/local/apache2/bin/htpasswd -m /data/svn/svn-auth-file admin
后面创建的时候,就不用在加-c
再次编辑httpd.conf
<Location /svn>
DAV svn
SVNParentPath /data/svn
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /data/svn/svn-auth-file
Require valid-user
AuthzSVNAccessFile /data/svn/svn-access-file
</Location>


其中svn-auth-file是认证文件,存储用户名和密码,svn-access-file是访问权限文件,规定各个目录的访问者的权限, 示例的权限分配的文件的格式如下。
[groups]
admin = john, kate
devteam1 = john, rachel, sally
devteam2 = kate, peter, mark
docs = bob, jane, mike
training = zak
# Default access rule for ALL repositories
# Everyone can read, admins can write, Dan German is excluded.
[/]
* = r
@admin = rw
dangerman =
# Allow developers complete access to their project repos
[proj1:/]
@devteam1 = rw
[proj2:/]
@devteam2 = rw
[bigproj:/]
@devteam1 = rw
@devteam2 = rw
trevor = rw
# Give the doc people write access to all the docs folders
[/trunk/doc]
@docs = rw
# Give trainees write access in the training repository only
[TrainingRepos:/]
@training = rw




权限配置文件中,关键的几个概念是:目标和权限,也就是为谁分配什么样的权限。读为r,写为w,如果没有权限那么什么也不写即可。


为了方便使用subversion的命令,将subversion安装目录下的bin目录加入到Path中
vi /etc/profile
最后加入:
   SVN_HOME=/usr/local/subversion
PATH=$PATH:$SVN_HOME/bin:
export SUSBVERSION PATH




四. 配置subversion
1. 创建账号密码文件
htpasswd –c /data/svn/passwd.conf apache
输入密码,两次确认
   注意:第一次设置用户密码要加入 –c 这个参数,以后就可以不用了
2. 创建资料库
首先要创建一个资料库(我使用单资料库的方式),使用svnadmin增加资料库
cd /usr/local/subversion/bin
    ./svnadmin create /data/svn/svnroot/www
到www下看是不是多了文件,多了就是说明创建成功
3.创建权限文件
   Touch –p /data/svn/authz.conf
   vi authz.conf 
[groups]   #组
Admin = apache #admin组成员
[ggg:/] #版本库ggg的权限
@Admin = rw #admin组有读写的权限
test1 = rw #test1有读写的权限
[www:/] 
@Admin = rw
test2 = rw
   [/]
       * = r #svn父目录所有人都与读的权限
注意:最后的[/]这个要设置好了,这里面的权限设置可以让你对ggg和www的版本库有相同的权限,一般不要也行,个人建议不要




五. 配置apache的httpd.conf
打开apache的conf/httpd.conf,安装subversion后,apache的conf/httpd.conf文件会自动增加了模块
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so




相应的so文件也自动copy到了apache/modules。这些工作就不用自己动手了。
需要自己动手修改apache下的httpd.conf最后增加以下内容


单个版本
<Location /svn>
DAV svn
SVNPath /data/svn/svnroot/www
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /data/svn/passwd.conf  
AuthzSVNAccessFile /data/svn/authz.cong 




Require valid-user
</Location>




多个版本库:
<Location /svn>
DAV svn
SVNListParentPath on
SVNParentPath /data/svn/svnroot
AuthType Basic
AuthName " Subversion repository "
AuthUserFile /data/svn/passwd.conf
AuthzSVNAccessFile /data/svn/authz.conf
Require valid-user
</Location>








注意:
(1) 单个版本库就是SVNPath /data/svn/svnroot/www跟./svnadmin create /data/svn/svnroot/www目录要一样,要不忙死你……【这个是对单个版本库】,多个版本库知道svn的主目录,我这就是 SVNParentPath /data/svn/svnroot
(2) AuthzSVNAccessFile是权限控制文件,单个版本库不需要,多个版本库要设置不同版本库的权限
(3)目录svnroot目录的权限设置成755




注:下面的六、七是单个版本库测试的效果,多个版本库类似!




六. 验证安装
打开浏览器,输入地址为http://服务器ip/svn






八.版本库服务器的同步
   1.单版本库跟服务器目录的同步:
进入到版本库下的hooks下去
svn checkout file:///版本库的目录 /本地要取出的目录
   Cd /data/svn/svnroot/www/hookd
   Vi post-commit




#!/bin/sh
SVN=/usr/local/subversion/bin/svn
WEB=/data/www #web目录要更新同步的目录
$SVN update --username apache --passwd 123456 $WEB    #这里面的username跟password一定要有读写的权限




   Chmod 757 post-commit #给它可执行的权利 
   2.多版本更服务器目录的同步
   进入到版本库下的hooks下去
svn checkout file:///版本库的目录 /本地要取出的目录
Cd /data/svn/svnroot/www/hookd
   Vi post-commit




#!/bin/sh
SVN=/usr/local/subversion/bin/svn
$SVN update --username apache --passwd 123456 /home    #里面的username跟password一定要有读写的权限




   Chmod 757 post-commit #给它可执行的权利




注意:(红色字体一定要注意)
1.svn checkout file:///版本库的目录 /本地要取出的目录 ——>这步一定要做要不会同步修改的
2.目录位置一定要对应好了,要不出现问题累死……




安装过程中遇到的问题
1.编译subversion时出现少expat库
解决:下载expat-2.0.0.tar.gz安装皆可
2.安装subversion时,编译到最后会出现一段
configure: WARNING: we have configured without BDB filesystem support
大概是不能创建db格式的版本库
解决:这个没什么关系,一般不会有多大影响
3.安装subversion时,make没问题,make install时出现
/usr/local/src/subversion-1.5.2/subversion/svnversion/.libs/lt-svnversion: error while loading shared libraries: libexpat.so.1: cannot open shared object file: No such file or directory
意思是找不到libexpat.so.1这个文件
运行 whereis libexpat.so.1
libexpat.so: /lib/libexpat.so.0 /usr/local/lib/libexpat.so /usr/local/lib/libexpat.so.1
解决:vi   /etc/ld.so.conf
加入libexpat.so.1的目录 /usr/local/lib/ 保存退出
运行ldconfig
4.【这个问题是我创建单个版本库时遇到的】安装好了后,浏览器打开http://服务器ip/svn,登陆出现不了页面,出现:
<D:error> <C:error/> <m:human-readable errcode="2"> Could not open the requested SVN filesystem </m:human-readable> </D:error>
解决:这是httpd.conf里的<Locate svn>中的SVNPath指向错误没指到创建的资料库
    第四步的最后我强调的东西
5.这是开始安装时会出现的错误,安装subversion时会出现找不到arp的问题
解决:在编译subversion时加入
    --with-apr=/usr/local/apr/bin/apr-1-config
--with-apr-util=/usr/local/apr/bin/apu-1-config
6.插张访问方式跟服务器安装方式关系的介绍图:


http://hi.baidu.com/gyl4802959/blog/item/fcfe7e02cb737a094bfb5196.html


碰到的错误1:


SVN commit或import 的 Permission denied的原因


配置svn+apache服务器时,在导入或提交时,如果是unix、linux、mac os x等系统可能遇到类似这样的权限问题:
写道
svn: 提交失败(细节如下): 
svn: Can't open file '/Code/SVN/repos/db/txn-current-lock': Permission denied
 或者
写道
svn: 提交失败(细节如下): 
svn: Can't create directory '/Code/SVN/repos/db/transactions/1-2.txn': Permission denied
这个主要原因:在svnadmin create时是root身份,所以,mod_dav_svn就没有write权限等。
解决办法:
写道
sudo chown -R daemon /Code/SVN/repos
sudo chmod -R 755 /Code/SVN/repos
这样就解决了




解决方法:添加读写权限






注意:我在这边confure再make的时候,报一个错误,纠结了很久以后,终于在网上找到了一位神人的帖子,成功的解决了问题!(这边一定要改svn的源码)


遇到的问题1:make subversion的时候报如下错误!(我装的是svn1.7.3版本,不知道其他版本安装时是否有该问题存在!没有具体实验过!)


subversion/mod_dav_svn/util.c: In function 'dav_svn__log_err':


subversion/mod_dav_svn/util.c:630: error: 'dav_error' has no member named 'save_errno'
subversion/mod_dav_svn/util.c:631: error: 'dav_error' has no member named 'save_errno'




make: *** [subversion/mod_dav_svn/util.lo] 错误 1


解决方法: 


定位到路径/root/dir_install/subversion-1.7.3/subversion/mod_dav_svn/util.c,编辑内容如下
 -       if (errscan->save_errno != 0) {
 -           errno = errscan->save_errno;




+       if (errscan->aprerr != 0) {
+           errno = errscan->aprerr;


注意:这边”-“是删除的意思,”+“是添加的意思


然后继续




./configure --prefix=/usr/local/svn1.7.3 --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apr/bin/apu-1-config  --with-neon=/usr/local/neon/bin/neon-config --with-ssl










进到到/usr/local/svn1.7.3/bin使用命令./svn --version查看信息,有信息打出,则表明安装已经成功!




六、subversion和apache配置


1.先检查/usr/local/apache2/modules/是否存在mod_dav_svn.so、mod_authz_svn.so


如果没有,




cp /root/dir_install/subversion-1.7.3/subversion/mod_dav_svn/.libs/mod_dav_svn.so /usr/local/apache2/modules/.


cp /root/dir_install/subversion-1.7.3/subversion/mod_authz_svn/.libs/mod_authz_svn.so /usr/local/apache2/modules/.


2.编辑httpd.conf文件


vi /usr/local/apache2/conf/httpd.conf







#LoadModule dav_fs_module modules/mod_dav_fs.so




#LoadModule dav_module modules/mod_dav.so


修改为: 




LoadModule dav_fs_module modules/mod_dav_fs.so


LoadModule dav_module modules/mod_dav.so


再添加


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


注意: 新增的这两行的代码顺序不要弄错掉,有可能带来不必要的错误!


再在末尾添加


<Location /svn>   #意味着可以通过像这样的URL(http://MyServer/svn)来访问Subversion版本库
DAV svn     # 告诉Apache哪个模块负责服务像那样的URL--在这里就是Subversion模块
SVNParentPath /var/svn_data/svnroot   #告诉Subversion在目录/var/svn_data/svnroot下寻找版本库
AuthType Basic  #启用基本的验证,使用用户名/密码验证
AuthName "mysvn"   # mysvn为版本库
AuthUserFile/var/svn_data/conf/svn-auth-file #svn-auth-file访问密码和用户文件,用来验证用户的用户名及密码
AuthzSVNAccessFile /var/svn_data/conf/svn-access-file    #权限控制文件,限定各个用户或组在版本库中目录的访问权限
Require valid-user  #限定用户只有输入正确的用户名及密码后才能访问这个路径
</Location>


3.创建svn-auth-file文件


利用htpasswd命令创建用户密码文件/usr/local/apache2/bin/htpasswd -cm /var/svn_data/conf/svn-auth-file


4.创建svn-access-file文件


cd /var/svn_data/conf


touch svn-access-file


vi svn-access-file    添加如下内容


#组配置  组 = 用户名
[groups]        
admin = admin
#@user = test  #test用户还需要按照上面d步骤来创建它和它的密码


# 为所有库指定默认访问规则
# 所有人可以读
[/]
* = r


# 为test版本库制定权限
#admin组拥有读写权限
#user组只有读取权限
[mysvn:/]
admin = rw
#@user = r


5.创建mysvn版本库


cd /var/svn_data/svnroot


svnadmin create mysvn


6.修改文件权限,让apache用户能够有权限读写




查看文件httpd.conf


找出内容


User daemon
Group daemon


修改文件的所属组和所属用户名


chown -R daemon:daemon /var/svn_data


chmod -R 777 /var/svn_data


这边一定要把mysvn的版本库权限改为可写,否则会出现check in返回500的错误!




七、启动apache验证apache+svn是否安装成功


1.启动apache,


cd /usr/local/apache2/bin


./apachect1 start


2.url中输入”http://xxx.xxx.xxx.xxx:9580/svn/mysvn“,不报错,则表示已经成功


你就可以自动mysvn库到本地,添加内容,check in到版本库看是否都一切正常~








本人也仅仅是配置到这种程度,还有很多问题,还没能解决,解决了到时候再来更新!














http://blog.csdn.net/jims55555/article/details/7336656




















windows下面删除所有的.svn文件夹 




工作中要把一个项目迁移到另外的svn目录中,遇到一个问题,需要先把原来的.svn删除,然后再增加到新的svn中,开始手动删除,但是发现太耗时耗力了,网上搜了几种删除的方法,自己都试了一遍,总结了一下,写出来备忘。


一、在Dos窗口中运行如下命令


for /r <你项目的路径> %i in (.svn) do rd /s /q %i
二、将“Delete SVN Folders”操作添加到右击菜单中


建立一个文本文件,名称随意,后缀为.reg,内容如下:


?
Windows Registry Editor Version 5.00 
  
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]  
@="Delete SVN Folders"
  
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]  
@="cmd.exe /c \"TITLE Removing SVN Folders in %1 && COLOR 9A && FOR /r \"%1\" %%f IN (.svn) DO RD /s /q \"%%f\" \"" 


保存之后,双击这个reg文件。成功后,在每一个文件夹上点击右键都会有一个“Delete SVN Folders”的选项,点击这个选项,即可删除这个文件夹下面所有的.svn文件夹


三、编写js程序


程序如下:


js code 
 1 if (WScript.Arguments.length == 0) {
 2     WScript.Echo("请输入参数!");
 3     WScript.quit();
 4 }
 5  else {
 6     var path = WScript.Arguments(0);
 7     var fso = new ActiveXObject("Scripting.FileSystemObject");
 8     var rootFolder = fso.getFolder(path);
 9     var folderList = new Array();
10     folderList.push(rootFolder);
11 
12     var folder, fc;
13     while (folderList.length > 0) {
14         folder = folderList.pop();
15         fc = new Enumerator(folder.SubFolders);
16         while (!fc.atEnd()) {
17             if (fc.item().name == ".svn") {
18                 fso.deleteFolder(fc.item().path, true);
19             }
20             else {
21                 folderList.push(fc.item());
22             }
23             fc.moveNext();
24         }
25     }
26     WScript.Echo("完成!");
27 }
复制代码
         将这个程序保存为后缀为.js的文件,如delsvn.js


         运行cscript.exe delsvn.js XXX


         例如:cscript.exe C:\Users\lhc\Desktop\delsvn.js E:\Union


                   其中C:\Users\lhc\Desktop\delsvn.js是此js放在桌面上


                   E:\Union下面的.svn文件夹都会删除


         编写此js时注意:


    1、  我们输出内容用的是WScript.Echo(),而不用alert()


      如果使用alert(),会报缺少对象的错误,因为alert()是属于浏览器(DOM)的函数,JavaScript中没有这个函数


    2、  可执行js文件


      有如下代码:


View Code?
1
2
3
4
5
6
7
8
9 <job> 
  
   <script language="javascript"> 
  
       WScript.Echo("Hello World!"); 
  
   </script> 
  
</job> 


把这个代码保存为后缀为.wsf的文件jstest.wsf,双击可运行,如下图:


 


如果把WScript.Echo("Hello World!");这行代码换成上面的删除.svn文件夹的程序,也可以运行,不过由于这个程序需要输入参数,可以以以下方式运行:


cscript C:\Users\lhc\Desktop\jstest.wsf E:\Union


个人认为第二种最方便,一劳永逸。








远程修改SVN密码 




参考处:http://bbs.iusesvn.com/thread-20-1-1.html


http://blog.csdn.net/nancy198696/article/details/4069864




1. 远程修改基于apache配置的Subversion密码的工具ApachePasswd
ApachePasswd说明
  这是一个用于修改Apache中AuthUserFile的工具,编写时主要是为了远程修改基于Apache配置的Subversion的用户密码。
  目前提供for apache2.0版本及for apache2.2版本。
  当Subversion配置成作为Apache的一个模块运行时,在httpd.conf中可能是类似这下面这样的语句:  
<Location /svn >
DAV svn
SVNParentPath E:/svnroot 


AuthzSVNAccessFile E:/svnroot/access.auth  (权限文件)
Satisfy Any
Require valid-user


AuthType Basic
AuthName "Subversion repositories"
AuthUserFile  E:/svnroot/users.auth  (用户和密码文件)
Require valid-user
</Location> 
  ApacehPasswd就是用来修改上面配置中的E:/svnroot/users.auth这个文件的


  使用方法:
  1将文件Apache2xPasswd.cgi及Apache2xPasswd.cgi.ini复制到Apache的CGI脚本目录下,通常是cgi-bin目录。(这句话中的x请用相应的版本代替,如for apache2.0,则为Apache20Passwd.cgi)
  2如果是for apache2.2版本,复制apache的bin目录下libapr-1.dll、libapriconv-1.dll、libaprutil-1.dll到Apache2xPasswd.cgi所在的目录
  3修改配置文件Apache2xPasswd.cgi.ini中auth_user_file路径,如下


[path]
auth_user_file=这里改为你的Subversion所用的AuthUserFile全路径,如E:/svnroot/users.auth


  4现在访问你服务器的http://IP/cgi-bin/Apache2xPasswd.cgi就可以看到修改subversion密码的界面了。


备注:
1、配置文件可用的配置项
[path]
auth_user_file=这里改为你的Subversion所用的AuthUserFile全路径,如C:/SVN_repos/passwd
日志文件名
log_file=svnpass.log
[setup]
password_min_length=1
[html]
title=修改SubVersion密码
description=修改SubVersion密码
your_name = 用户名
old_password = 旧密码
new_password1 = 新密码
new_password2 = 验证新密码
btn_change = 修 改
btn_reset = 重 置


change_password_ok=成功修改密码
change_password_failed=修改密码失败
old_password_error=旧密码错误
server_error=服务器错误
password_must_greater=密码位数必须大于
two_password_not_matched=两密码不一致
please_enter_name=请输入用户名
back=返回


2、我一般用时都是将Apache2xPasswd.cgi改名为svnpass,这样用户修改密码时可以少打些字
如访问http://192.168.0.1/cgi-bin/svnpass就可以修改密码了,当改名为svnpass时,配置文件Apache2xPasswd.cgi.ini要相应地改为svnpass.ini,因为这个脚本是根据自己的文件名找配置文件的




3、如果你配置了多个AuthUserFile,可以复制出多个ApachePasswd,配置多个相应的.ini,这样就可以修改多个AuthUserFile了。










svn 服务器镜像方式同步备份 


svn 服务器镜像方式同步备份 


同步方式备份,要用到两个命令
1、svnsync init
初始化,建立目标库和源库之间的同步关系
命令格式 svnsync init 目标库URL 源库URL
2、svnsync sync
真正的同步
命令格式 svnsync sync 目标库URL
目标:
本次实现的是版本库的远程自动备份,将版本库备份到另一台机器上
假设我们要同步的源版本库为http://10.10.10.150/svn/svntest 位于机器A,具体路径我们不必理会,因为我们使用http协议
目标库在机器B,file:///data/svnroot/repository/svntest3,这个为了简单和安全,我们使用file://协议
过程:


1、创建目标库:
midir -p /data/svnroot/repository
svnadmin create /data/svnroot/repository/svntest3
2、在目标库的hook 目录:/data/svnroot/repository/svntest3/hook目录下执行: 
cp pre-revprop-change.tmpl  pre-revprop-change
chmod a+x  pre-revprop-change
vi  pre-revprop-change
修改:exit 1 为 exit 0
3、初始化
注意,目标url 为三个"/"
[root@rhel500 repository]# svnsync init file:///data/svnroot/repository/svntest3 http://10.10.10.150/svn/svntest
认证领域: <http://10.10.10.150:80> Subversion repository
“root”的密码: 
认证领域: <http://10.10.10.150:80> Subversion repository
用户名: mawp
“mawp”的密码: 
复制版本 0 的属性
4、同步
[root@rhel500 repository]# svnsync sync file:///data/svnroot/repository/svntest3
认证领域: <http://10.10.10.150:80> Subversion repository
“root”的密码: 
认证领域: <http://10.10.10.150:80> Subversion repository
用户名: litao3
“litao3”的密码:
-----------------------------------------------------------------------
注意!你的密码,对于认证域:


   <http://10.10.10.150:80> Subversion repository


只能明文保存在磁盘上!如果可能的话,请考虑配置你的系统,让Subversion
可以保存加密后的密码。请参阅文档以获得详细信息。


你可以通过在“/root/.subversion/servers”中设置选项“store-plaintext-passwords”为“yes”或“no”,
以免再次出现警告。
-----------------------------------------------------------------------
保存未加密的密码(yes/no)?yes
传输文件数据.
已提交版本 1。
复制版本 1 的属性。
传输文件数据.
已提交版本 2。
复制版本 2 的属性。
传输文件数据.
已提交版本 3。
复制版本 3 的属性。


5、以后的同步。
[root@rhel500 repository]# svnsync sync file:///data/svnroot/repository/svntest3
传输文件数据.
已提交版本 4。
复制版本 4 的属性。


6、常见问题解决:
svnsync init file:///data/svnroot/repository/products http://10.10.10.150/svn/products
 从目标版本库获得锁失败,当前被“rhel500:284ff204-e16b-457f-933c-03d1c26c314b”持有
 从目标版本库获得锁失败,当前被“rhel500:284ff204-e16b-457f-933c-03d1c26c314b”持有
 从目标版本库获得锁失败,当前被“rhel500:284ff204-e16b-457f-933c-03d1c26c314b”持有
 从目标版本库获得锁失败,当前被“rhel500:284ff204-e16b-457f-933c-03d1c26c314b”持有
 从目标版本库获得锁失败,当前被“rhel500:284ff204-e16b-457f-933c-03d1c26c314b”持有
 从目标版本库获得锁失败,当前被“rhel500:284ff204-e16b-457f-933c-03d1c26c314b”持有
 从目标版本库获得锁失败,当前被“rhel500:284ff204-e16b-457f-933c-03d1c26c314b”持有
 从目标版本库获得锁失败,当前被“rhel500:284ff204-e16b-457f-933c-03d1c26c314b”持有
 从目标版本库获得锁失败,当前被“rhel500:284ff204-e16b-457f-933c-03d1c26c314b”持有
 从目标版本库获得锁失败,当前被“rhel500:284ff204-e16b-457f-933c-03d1c26c314b”持有
svnsync: Couldn't get lock on destination repos after 10 attempts


解决方法,执行以下命令:
svn propdel svn:sync-lock --revprop -r 0 http://10.10.10.130/svn/products
删除属性 “svn:sync-lock” 于版本库版本 0








参考URL:http://user.qzone.qq.com/1365221/blog/1249627771#!app=2&pos=1249627771






svn中打标签的一种方法 
SVN创建标签的方法




这个方法是我一步一步试验出来的,或许中间会出现问题,或者因为我解释不清晰而出现的问题,如果出现了,请多多见谅啊!


       第一步:首先在根目录下面创建一个存放标签的文件夹tags(在此创建一个文件夹可存所有的标签)


     第二步:打开要创建标签的根目录


       第三步:进入到要创建标签的目录下面,选中要创建标签的文件,右键----》TortoiseSVN----->Branch/tag.......






      第四步:打开后----》修改路径(例:假如tags和test在同一个目录下,那么修改To URL里面的路径:test/新建文件夹---修改为----tags/标签名称)




















































      第五步:填写相关的日志信息,ok 完成 !


用TortoiseSVN和ant实现自动化更新和部署 
环境要求:
1、TortoiseSVN
已经默认保存用户和密码
2、ANT
要求ANT环境变量已经配置好




步骤




新建一个bat文件,调用Tortoise的update命令先自动去SVN服务器更新代码,
然后用ant执行你check out下来的build.xml文件,实现自动化得部署。以下附上.bat和build.xml文件的示例,尽供参考:




updateProject.bat文件
TortoiseProc.exe /command:update /path:"F:\UIDWorkspace\UIDService" /closeonend:1
ant -buildfile D:\build.xml








F:\UIDWorkspace\UIDService,是我们要更新的SVN的项目的地址
closeonend:1,的意思是立即关闭更新的小窗口
-buildfile,是用来指定我们编译文件的位置












build.xml文件
内容如下




<?xml version="1.0" encoding="utf-8" ?>
<project name="trms" default="compile">
   
    <property name="classes.dir" value="F:/UIDWorkspace/UID5ATCSService/classes" />
    <property name="src.dir" value="F:/UIDWorkspace/UID5ATCSService/src" />
    <property name="lib.dir" value="F:/UIDWorkspace/Library" />
    <property name="tomcat.home" value="g:/tomcat6" />
   
    <path id="classpath">
        <fileset dir="${lib.dir}" includes="**/*.jar" />
        <fileset dir="${tomcat.home}/lib" includes="**/*.jar" />
    </path>
   
    <target name="clean">
        <delete dir="${classes.dir}" />
    </target>
   
    <target name="compile" depends="clean">
        <mkdir dir="${classes.dir}" />
        <javac srcdir="${src.dir}" destdir="${classes.dir}" encoding="UTF-8">
            <classpath refid="classpath" />
        </javac>
        <copy todir="${classes.dir}">
            <fileset dir="${src.dir}" excludes="**/*.java" />
        </copy>
    </target>
   


</project>








参考URL:http://xiaying-hefei.iteye.com/blog/428697


svnant 环境测试 
环境


ant在D: 盘下面,D:\ant


antsvn的包也已经复制到D:\ant\lib\下面


步骤1:新建一个空文件夹,D:\afs


步骤2 :在给文件夹下面,用Totrias工具checkout,URL是:http://subclipse.tigris.org/svn/subclipse/trunk/svnant


用户名:guest,密码:为空


步骤3 :在D:\ant下面创建两个文件


文件1:build.properties


svnant.version=1.3.0


lib.dir=D:/afs/lib
svnant.latest.url=http://subclipse.tigris.org/svn/subclipse/trunk/svnant/
svnant.this.url=http://subclipse.tigris.org/svn/subclipse/tags/svnant/${svnant.version}/
svnant.repository.user=guest
svnant.repository.passwd=""


文件2:build.xml


<?xml version="1.0"?>
<!-- Sample build file used to retrieve svnant's sources -->
<project name="svn-test" basedir="." default="checkoutThis">
  
  <!--  all properties are in build.properties --> 
  <property file="build.properties" /> 




  <!-- path to the svnant libraries. Usually they will be located in ANT_HOME/lib -->
  <path id="svnant.classpath">
    <fileset dir="${lib.dir}">
      <include name="**/*.jar"/>
    </fileset>
  </path>  
  
  <!-- load the svn task -->
  <typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="svnant.classpath" />
  
  <target name="clean">
    <delete dir="src_latest"/>
    <delete dir="src_${svnant.version}"/>  
  </target>




  <target name="checkoutLatest">
    <svn username="${svnant.repository.user}" password="${svnant.repository.passwd}">
      <checkout url="${svnant.latest.url}" revision="HEAD" destPath="src_latest" />
    </svn>
  </target>




  <target name="checkoutThis">
    <svn username="${svnant.repository.user}" password="${svnant.repository.passwd}">
      <checkout url="${svnant.this.url}" revision="HEAD" destPath="src_${svnant.version}" />
    </svn>
  </target>




</project>






<?xml version="1.0"?>
<!-- Sample build file used to retrieve svnant's sources -->
<project name="svn-test" basedir="." default="checkoutThis">
  
  <!--  all properties are in build.properties --> 
  <property file="build.properties" /> 




  <!-- path to the svnant libraries. Usually they will be located in ANT_HOME/lib -->
  <path id="svnant.classpath">
    <fileset dir="${lib.dir}">
      <include name="**/*.jar"/>
    </fileset>
  </path>  
  
  <!-- load the svn task -->
  <typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="svnant.classpath" />
  
  <target name="clean">
    <delete dir="src_latest"/>
    <delete dir="src_${svnant.version}"/>  
  </target>




  <target name="checkoutLatest">
    <svn username="${svnant.repository.user}" password="${svnant.repository.passwd}">
      <checkout url="${svnant.latest.url}" revision="HEAD" destPath="src_latest" />
    </svn>
  </target>




  <target name="checkoutThis">
    <svn username="${svnant.repository.user}" password="${svnant.repository.passwd}">
      <checkout url="${svnant.this.url}" revision="HEAD" destPath="src_${svnant.version}" />
    </svn>
  </target>




</project>


步骤4:打开iDOS窗口,进入D盘\ant\


输入ant


如果有运行输出,就可以,否则就表示说环境不行。


参考URL:http://www.4ucode.com/Study/Topic/1827687






httpd,Apache的HTTP服务器
Apache的HTTP服务器是一个Subversion可以利用的“重型”网络服务器,通过一个自定义模块,httpd可以让Subversion版本库通过WebDAV/DeltaV协议在客户端前可见,WebDAV/DeltaV协议是HTTP 1.1的扩展(见http://www.webdav.org/来查看详细信息)。这个协议利用了无处不在的HTTP协议是广域网的核心这一点,添加了写能力—更明确一点,版本化的写—能力。结果就是这样一个标准化的健壮的系统,作为Apache 2.0软件的一部分打包,被许多操作系统和第三方产品支持,网络管理员也不需要打开另一个自定义端口。 [40]这样一个Apache-Subversion服务器具备了许多svnserve没有的特性,但是也有一点难于配置,灵活通常会带来复杂性。


下面的讨论包括了对Apache配置指示的引用,给了一些使用这些指示的例子,详细地描述不在本章的范围之内,Apache小组维护了完美的文档,公开存放在他们的站点http://httpd.apache.org。例如,一个一般的配置参考位于 http://httpd.apache.org/docs-2.0/mod/directives.html。


同样,当你修改你的Apache设置,很有可能会出现一些错误,如果你还不熟悉Apache的日志子系统,你一定需要认识到这一点。在你的文件httpd.conf里会指定Apache生成的访问和错误日志(CustomLog和ErrorLog指示)的磁盘位置。Subversion的mod_dav_svn使用Apache的错误日志接口,你可以浏览这个文件的内容查看信息来查找难于发现的问题根源。


为什么是 Apache 2?


如果你系统管理员,很有可能是你已经运行了Apache服务器,并且有一些高级经验。写本文的时候,Apache 1.3是Apache最流行的版本,这个世界因为许多原因而放缓升级到2.X系列:如人们害怕改变,特别是像web服务器这种重要的变化,有些人需要一些在Apache 1.3 API下工作的插件模块,在等待2.X的版本。无论什么原因,许多人会在首次发现Subversion的Apache模块只是为Apache 2 API写的后开始担心。


对此问题的适当反应是:不需要担心,同时运行Apache 1.3和Apache 2非常简单,只需要安装到不同的位置,用Apache 2作为Subversion的专用服务器,并且不使用80端口,客户端可以访问版本库时在URL里指定端口:


$ svn checkout http://host.example.com:7382/repos/project



先决条件
为了让你的版本库使用HTTP网络,你基本上需要两个包里的四个部分。你需要Apache httpd2.0和包括的mod_dav DAV模块,Subversion和与之一同分发的mod_dav_svn文件系统提供者模块,如果你有了这些组件,网络化你的版本库将非常简单,如:


配置好httpd 2.0,并且使用mod_dav启动,


为mod_dav安装mod_dav_svn插件,它会使用Subversion的库访问版本库,并且


配置你的httpd.conf来输出(或者说暴露)版本库。


你可以通过从源代码编译httpd和Subversion来完成前两个项目,也可以通过你的系统上的已经编译好的二进制包来安装。最新的使用Apache HTTP的Subversion的编译方法和Apache的配置方式可以看Subversion源代码树根目录的INSTALL文件。


基本的 Apache 配置
一旦你安装了必须的组件,剩下的工作就是在httpd.conf里配置Apache,使用LoadModule来加载mod_dav_svn模块,这个指示必须先与其它Subversion相关的其它配置出现,如果你的Apache使用缺省布局安装,你的mod_dav_svn模块一定在Apache安装目录(通常是在/usr/local/apache2)的modules子目录,LoadModule指示的语法很简单,影射一个名字到它的共享库的物理位置:


LoadModule dav_svn_module     modules/mod_dav_svn.so


注意,如果mod_dav是作为共享对象编译(而不是静态链接到httpd程序),你需要为它使用LoadModule语句,一定确定它在mod_dav_svn之前:


LoadModule dav_module         modules/mod_dav.so
LoadModule dav_svn_module     modules/mod_dav_svn.so


在你的配置文件后面的位置,你需要告诉Apache你在什么地方保存Subversion版本库(也许是多个),位置指示有一个很像XML的符号,开始于一个开始标签,以一个结束标签结束,配合中间许多的其它配置。Location指示的目的是告诉Apache在特定的URL以及子URL下需要特殊的处理,如果是为Subversion准备的,你希望可以通过告诉Apache特定URL是指向版本化的资源,从而把支持转交给DAV层,你可以告诉Apache将所有路径部分(URL中服务器名称和端口之后的部分)以/repos/开头的URL交由DAV服务提供者处理。一个DAV服务提供者的版本库位于/absolute/path/to/repository,可以使用如下的httpd.conf语法:


<Location /repos>
  DAV svn
  SVNPath /absolute/path/to/repository
</Location>


如果你计划支持多个具备相同父目录的Subversion版本库,你有另外的选择,SVNParentPath指示,来表示共同的父目录。举个例子,如果你知道会在/usr/local/svn下创建多个Subversion版本库,并且通过类似http://my.server.com/svn/repos1,http://my.server.com/svn/repos2的URL访问,你可以用后面例子中的httpd.conf配置语法:


<Location /svn>
  DAV svn


  # any "/svn/foo" URL will map to a repository /usr/local/svn/foo
  SVNParentPath /usr/local/svn
</Location>


使用上面的语法,Apache会代理所有URL路径部分为/svn/的请求到Subversion的DAV提供者,Subversion会认为SVNParentPath指定的目录下的所有项目是真实的Subversion版本库,这通常是一个便利的语法,不像是用SVNPath指示,我们在此不必为创建新的版本库而重启Apache。


请确定当你定义新的Location,不会与其它输出的位置重叠。例如你的主要DocumentRoot是/www,不要把Subversion版本库输出到<Location /www/repos>,如果一个请求的URI是/www/repos/foo.c,Apache不知道是直接到repos/foo.c访问这个文件还是让mod_dav_svn代理从Subversion版本库返回foo.c。服务器返回的结果通常是301 Moved Permanently。


服务器名称和复制请求


Subversion利用COPY请求类型来执行服务器端的文件和目录拷贝,作为一个健全的Apache模块的一部分,拷贝源和拷贝的目标通常坐落在同一个机器上,为了满足这个需求,你或许需要告诉mod_dav服务器主机的名称,通常你可以使用httpd.conf的ServerName指示来完成此目的。


ServerName svn.example.com


如果你通过NameVirtualHost指示使用Apache的虚拟主机,你或许需要ServerAlias指示来指定额外的名称,再说一次,可以查看Apache文档的来得到更多细节。


在本阶段,你一定要考虑访问权限问题,如果你已经作为普通的web服务器运行过Apache,你一定有了一些内容—网页、脚本和其他。这些项目已经配置了许多在Apache下可以工作的访问许可,或者更准确一点,允许Apache与这些文件一起工作。Apache当作为Subversion服务器运行时,同样需要正确的访问许可来读写你的Subversion版本库。


你会需要检验权限系统的设置满足Subversion的需求,同时不会把以前的页面和脚本搞乱。这或许意味着修改Subversion的访问许可来配合Apache服务器已经使用的工具,或者可能意味着需要使用httpd.conf的User和Group指示来指定Apache作为运行的用户和Subversion版本库的组。并不是只有一条正确的方式来设置许可,每个管理员都有不同的原因来以特定的方式操作,只需要意识到许可关联的问题经常在为Apache配置Subversion版本库的过程中被疏忽。


认证选项
此时,如果你配置的httpd.conf保存如下的内容


<Location /svn>
  DAV svn
  SVNParentPath /usr/local/svn
</Location>


…这样你的版本库对全世界是可以“匿名”访问的,直到你配置了一些认证授权政策,你通过Location指示来使Subversion版本库可以被任何人访问,换句话说,


任何人可以使用Subversion客户端来从版本库URL取出一个工作拷贝(或者是它的子目录),


任何人可以在浏览器输入版本库URL交互浏览的方式来查看版本库的最新修订版本,并且


任何人可以提交到版本库。


当然,你也许已经设置了pre-commit钩子来防止提交(见“实现版本库钩子”一节),但是就像你读到的,也可以使用Apache内置的方法来限制访问。


基本HTTP认证
最简单的客户端认证方式是通过HTTP基本认证机制,简单的使用用户名和密码来验证一个用户所自称的身份,Apache提供了一个htpasswd工具来管理可接受的用户名和密码,这些就是你希望赋予Subversion特别权限的用户,让我们给Sally和Harry赋予提交权限,首先,我们需要添加他们到密码文件。


$ ### First time: use -c to create the file
$ ### Use -m to use MD5 encryption of the password, which is more secure
$ htpasswd -cm /etc/svn-auth-file harry
New password: *****
Re-type new password: *****
Adding password for user harry
$ htpasswd -m /etc/svn-auth-file sally
New password: *******
Re-type new password: *******
Adding password for user sally
$


下一步,你需要在httpd.conf的Location区里添加一些指示来告诉Apache如何来使用这些密码文件,AuthType指示指定系统使用的认证类型,这种情况下,我们需要指定Basic认证系统,AuthName是你提供给认证域一个任意名称,大多数浏览器会在向用户询问名称和密码的弹出窗口里显示这个名称,最终,使用AuthUserFile指示来指定使用htpasswd创建的密码文件的位置。


添加完这三个指示,你的<Location>区块一定像这个样子:


<Location /svn>
  DAV svn
  SVNParentPath /usr/local/svn
  AuthType Basic
  AuthName "Subversion repository"
  AuthUserFile /etc/svn-auth-file
</Location>


这个<Location>区块还没有结束,还不能做任何有用的事情,它只是告诉Apache当需要授权时,要去向Subversion客户端索要用户名和密码。我们这里遗漏的,是一些告诉Apache什么样客户端需要授权的指示。哪里需要授权,Apache就会在哪里要求认证,最简单的方式是保护所有的请求,添加Require valid-user来告诉Apache任何请求需要认证的用户:


<Location /svn>
  DAV svn
  SVNParentPath /usr/local/svn
  AuthType Basic
  AuthName "Subversion repository"
  AuthUserFile /etc/svn-auth-file
  Require valid-user
</Location>


一定要阅读后面的部分(“授权选项”一节)来得到Require的细节,和授权政策的其他设置方法。


需要警惕:HTTP基本认证的密码是用明文传输,因此非常不可靠的,如果你担心密码偷窥,最好是使用某种SSL加密,所以客户端认证使用https://而不是http://,为了方便,你可以配置Apache为自签名认证。 [41]参考Apache的文档(和OpenSSL文档)来查看怎样做。


SSL 证书管理
商业应用需要越过公司防火墙的版本库访问,防火墙需要小心的考虑非认证用户“吸取”他们的网络流量的情况,SSL让那种形式的关注更不容易导致敏感数据泄露。


如果Subversion使用OpenSSL编译,它就会具备与Subversion服务器使用https://的URL通讯的能力,Subversion客户端使用的Neon库不仅仅可以用来验证服务器证书,也可以必要时提供客户端证书,如果客户端和服务器交换了SSL证书并且成功地互相认证,所有剩下的交流都会通过一个会话关键字加密。


怎样产生客户端和服务器端证书以及怎样使用它们已经超出了本书的范围,许多书籍,包括Apache自己的文档,描述这个任务,现在我们可以覆盖的是普通的客户端怎样来管理服务器与客户端证书。


当通过https://与Apache通讯时,一个Subversion客户端可以接收两种类型的信息:


一个服务器证书


一个客户端证书的要求


如果客户端接收了一个服务器证书,它需要去验证它是可以相信的:这个服务器是它自称的那一个吗?OpenSSL库会去检验服务器证书的签名人或者是核证机构(CA)。如果OpenSSL不可以自动信任这个CA,或者是一些其他的问题(如证书过期或者是主机名不匹配),Subversion命令行客户端会询问你是否愿意仍然信任这个证书:


$ svn list https://host.example.com/repos/project


Error validating server certificate for 'https://host.example.com:443':
 - The certificate is not issued by a trusted authority. Use the
   fingerprint to validate the certificate manually!
Certificate information:
 - Hostname: host.example.com
 - Valid: from Jan 30 19:23:56 2004 GMT until Jan 30 19:23:56 2006 GMT
 - Issuer: CA, example.com, Sometown, California, US
 - Fingerprint: 7d:e1:a9:34:33:39:ba:6a:e9:a5:c4:22:98:7b:76:5c:92:a0:9c:7b


(R)eject, accept (t)emporarily or accept (p)ermanently?


这个对话看起来很熟悉,这是你会在web浏览器(另一种HTTP客户端,就像Subversion)经常看到的问题,如果你选择(p)ermanent选项,服务器证书会存放在你存放那个用户名和密码缓存(见“客户端凭证缓存”一节。)的私有运行区auth/中,缓存后,Subversion会自动记住在以后的交流中信任这个证书。


你的运行中servers文件也会给你能力可以让Subversion客户端自动信任特定的CA,包括全局的或是每主机为基础的,只需要设置ssl-authority-files为一组逗号隔开的PEM加密的CA证书列表:


[global]
ssl-authority-files = /path/to/CAcert1.pem;/path/to/CAcert2.pem


许多OpenSSL安装包括一些预先定义好的可以普遍信任的“缺省的”CA,为了让Subversion客户端自动信任这些标准权威,设置ssl-trust-default-ca为true。


当与Apache通话时,Subversion客户端也会收到一个证书的要求,Apache是询问客户端来证明自己的身份:这个客户端是否是他所说的那一个?如果一切正常,Subversion客户端会发送回一个通过Apache信任的CA签名的私有证书,一个客户端证书通常会以加密方式存放在磁盘,使用本地密码保护,当Subversion收到这个要求,它会询问你证书的路径和保护用的密码:


$ svn list https://host.example.com/repos/project


Authentication realm: https://host.example.com:443
Client certificate filename: /path/to/my/cert.p12
Passphrase for '/path/to/my/cert.p12':  ********



注意这个客户端证书是一个“p12”文件,为了让Subversion使用客户端证书,它必须是运输标准的PKCS#12格式,大多数浏览器可以导入和导出这种格式的证书,另一个选择是用OpenSSL命令行工具来转化存在的证书为PKCS#12格式。


再次,运行中servers文件允许你为每个主机自动响应这种要求,单个或两条信息可以用运行参数来描述:


[groups]
examplehost = host.example.com


[examplehost]
ssl-client-cert-file = /path/to/my/cert.p12
ssl-client-cert-password = somepassword


一旦你设置了ssl-client-cert-file和 ssl-client-cert-password参数,Subversion客户端可以自动响应客户端证书请求而不会打扰你。[42]


授权选项
此刻,你已经配置了认证,但是没有配置授权,Apache可以要求用户认证并且确定身份,但是并没有说明这个身份的怎样允许和限制,这个部分描述了两种控制访问版本库的策略。


整体访问控制
最简单的访问控制形式是授权特定用户为只读版本库访问或者是读/写访问版本库。


你可以通过在<Location>区块添加Require valid-user指示来限制所有的版本库操作,使用我们前面的例子,这意味着只有客户端只可以是harry或者sally,而且他们必须提供正确的用户名及对应密码,这样允许对Subversion版本库做任何事:


<Location /svn>
  DAV svn
  SVNParentPath /usr/local/svn


  # how to authenticate a user
  AuthType Basic
  AuthName "Subversion repository"
  AuthUserFile /path/to/users/file


  # only authenticated users may access the repository
  Require valid-user
</Location>


有时候,你不需要这样严密,举个例子,Subversion自己在http://svn.collab.net/repos/svn的源代码允许全世界的人执行版本库的只读操作(例如检出我们的工作拷贝和使用浏览器浏览版本库),但是限定只有认证用户可以执行写操作。为了执行特定的限制,你可以使用Limit和LimitExcept配置指示,就像Location指示,这个区块有开始和结束标签,你需要在<Location>中添加这个指示。


在Limit和LimitExcept中使用的参数是可以被这个区块影响的HTTP请求类型,举个例子,如果你希望禁止所有的版本库访问,只是保留当前支持的只读操作,你可以使用LimitExcept指示,并且使用GET,PROPFIND,OPTIONS和REPORT请求类型参数,然后前面提到过的Require valid-user指示将会在<LimitExcept>区块中而不是在<Location>区块。


<Location /svn>
  DAV svn
  SVNParentPath /usr/local/svn


  # how to authenticate a user
  AuthType Basic
  AuthName "Subversion repository"
  AuthUserFile /path/to/users/file


  # For any operations other than these, require an authenticated user.
  <LimitExcept GET PROPFIND OPTIONS REPORT>
    Require valid-user
  </LimitExcept>
</Location>


这里只是一些简单的例子,想看关于Apache访问控制Require指示的更深入信息,可以查看Apache文档中的教程集http://httpd.apache.org/docs-2.0/misc/tutorials.html中的Security部分。


每目录访问控制
也可以使用Apache的httpd模块mod_authz_svn更加细致的设置访问权限,这个模块收集客户端传递过来的不同的晦涩的URL信息,询问mod_dav_svn来解码,然后根据在配置文件定义的访问政策来裁决请求。


如果你从源代码创建Subversion,mod_authz_svn会自动附加到mod_dav_svn,许多二进制分发版本也会自动安装,为了验证它是安装正确,确定它是在httpd.conf的LoadModule指示中的mod_dav_svn后面:


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


为了激活这个模块,你需要配置你的Location区块的AuthzSVNAccessFile指示,指定保存路径中的版本库访问政策的文件。(一会儿我们将会讨论这个文件的格式。)


Apache非常的灵活,你可以从三种模式里选择一种来配置你的区块,作为开始,你选择一种基本的配置模式。(下面的例子非常简单;见Apache自己的文档中的认证和授权选项来查看更多的细节。)


最简单的区块是允许任何人可以访问,在这个场景里,Apache决不会发送认证请求,所有的用户作为“匿名”对待。


例 6.1. 匿名访问的配置实例。


<Location /repos>
  DAV svn
  SVNParentPath /usr/local/svn


  # our access control policy
  AuthzSVNAccessFile /path/to/access/file
</Location>
          




在另一个极端,你可以配置为拒绝所有人的认证,所有客户端必须提供证明自己身份的证书,你通过Require valid-user指示来阻止无条件的认证,并且定义一种认证的手段。


例 6.2. 一个认证访问的配置实例。


<Location /repos>
  DAV svn
  SVNParentPath /usr/local/svn


  # our access control policy
  AuthzSVNAccessFile /path/to/access/file


  # only authenticated users may access the repository
  Require valid-user


  # how to authenticate a user
  AuthType Basic
  AuthName "Subversion repository"
  AuthUserFile /path/to/users/file
</Location>
          




第三种流行的模式是允许认证和匿名用户的组合,举个例子,许多管理员希望允许匿名用户读取特定的版本库路径,但希望只有认证用户可以读(或者写)更多敏感的区域,在这个设置里,所有的用户开始时用匿名用户访问版本库,如果你的访问控制策略在任何时候要求一个真实的用户名,Apache将会要求认证客户端,为此,你可以同时使用Satisfy Any和Require valid-user指示。


例 6.3. 一个混合认证/匿名访问的配置实例。


<Location /repos>
  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.
  Satisfy Any
  Require valid-user


  # how to authenticate a user
  AuthType Basic
  AuthName "Subversion repository"
  AuthUserFile /path/to/users/file
</Location>
          




一旦你已经设置了httpd.conf模版之一,你需要在对应的路径创建包含访问规则的文件,在“基于路径的授权”一节中有描述。


禁用基于路径的检查
mod_dav_svn模块做了许多工作来确定你标记为“不可读”的数据不会因意外而泄露,这意味着需要紧密监控通过svn checkout或是svn update返回的路径和文件内容,如果这些命令遇到一些根据认证策略不是可读的路径,这个路径通常会被一起忽略,在历史或者重命名操作时—例如运行一个类似svn cat -r OLD foo.c的命令来操作一个很久以前改过名字的文件 — 如果一个对象的以前的名字检测到是只读的,重命令追踪就会终止。


所有的路径检查在有时会非常昂贵,特别是svn log的情况。当检索一列修订版本时,服务器会查看所有修订版本修改的路径,并且检查可读性,如果发现了一个不可读路径,它会从修订版本的修改路径中忽略(通常可以使用--verbose选项查看),并且整个的日志信息会被禁止,不必多说,这种影响大量文件修订版本的操作会非常耗时。这是安全的代价:即使你并没有配置mod_authz_svn模块,mod_dav_svn还是会询问httpd来对所有路径运行认证检查,mod_dav_svn模块没有办法知道那个认证模块被安装,所以只能要求Apache调用时提供的内容。


在另一方面,也有一个安全舱门允许你用安全特性来交换速度,如果你不是坚持要求有每目录授权(如不使用 mod_authz_svn和类似的模块),你就可以关闭所有的路径检查,在你的httpd.conf文件,使用SVNPathAuthz指示:


例 6.4. 禁用所有的路径检查


<Location /repos>
  DAV svn
  SVNParentPath /usr/local/svn


  SVNPathAuthz off
</Location>
          




SVNPathAuthz指示缺省是“on”,当设置为“off”时,所有的路径为基础的授权都会关闭;mod_dav_svn停止对每个目录调用授权检查。


额外的糖果
我们已经覆盖了关于认证和授权的Apache和mod_dav_svn的大多数选项,但是Apache还提供了许多很好的特性。


版本库浏览
使用Apache/WebDAV配置Subversion版本库时一个非常有用的好处是可以用普通的浏览器察看最新的版本库文件,因为Subversion使用URL来鉴别版本库版本化的资源,版本库使用的HTTP为基础的URL也可以直接输入到Web浏览器中,你的浏览器会发送一个GET请求到URL,根据访问的URL是指向一个版本化的目录还是文件,mod_dav_svn会负责列出目录列表或者是文件内容。


因为URL不能确定你所希望看到的资源的版本,mod_dav_svn会一直返回最新的版本,这样会有一些美妙的副作用,你可以直接把Subversion的URL传递给文档作为引用,这些URL会一直指向文档最新的材料,当然,你也可以在别的网站作为超链使用这些URL。


我可以看到老的修订版本吗?


通过一个普通的浏览器?一句话:不可以,至少是当你只使用mod_dav_svn作为唯一的工具时。


你的Web浏览器只会说普通的HTTP,也就是说它只会GET公共的URL,这个URL代表了最新版本的文件和目录,根据WebDAV/DeltaV规范,每种服务器定义了一种私有的URL语法来代表老的资源的版本,这个语法对客户端是不透明的,为了得到老的版本,一个客户端必须通过一种规范过程来“发现”正确的URL;这个过程包括执行一系列WebDAV PROPFIND请求和理解DeltaV概念,这些事情一般是你的web浏览器做不了的。


为了回答这些问题,一个明显的看老版本文件和目录的方式是带--revision (-r)参数的svn list和svn cat命令,为了在浏览器里察看老版本,你可以使用第三方的软件,一个好的例子是ViewVC(http://viewvc.tigris.org/),ViewVC最初写出来是为了在web显示CVS版本库,[43]最新的版本也已经可以理解Subversion版本库了。


正确的文件类型
当浏览Subversion版本库时,web浏览器通过从Apache的HTTP GET返回内容中查看Content-Type:头可以知道如何渲染文件的线索,这个值是一种MIME类型。默认情况下,Apache告诉浏览器所有的版本库文件都是缺省的MIME类型,通常是text/plain,这样有时候会让人沮丧,如果一个用户希望版本库文件能够更有意义的渲染—例如一个foo.html,在浏览时最好能够按照HTML方式渲染。


为了生效,我们只需要确认你的文件有正确的svn:mime-type设置,这将在“文件内容类型”一节详细讨论,你可以设置的你的客户端在文件首次添加到版本库时自动附加svn:mime-type属性;见“自动设置属性”一节。


所以在我们的例子中,如果一个人对foo.html将svn:mime-type设置为text/html,Apache就会告知浏览器使用HTML方式渲染文件,也可以给图片文件设置合适的image/*类型,这样最终可以使整个web站点直接从版本库浏览,这样做通常没有问题,只要你的站点不包含动态生成的内容。


定制外观
你通常会在版本化的文件的URL之外得到更多地用处—毕竟那里是有趣的内容存在的地方,但是你会偶尔浏览一个Subversion的目录列表,你会很快发现展示列表生成的HTML非常基本,并且一定没有在外观上(或者是有趣上)下功夫,为了自定义这些目录显示,Subversion提供了一个XML目录特性,一个单独的SVNIndexXSLT指示在你的httpd.conf文件版本库的Location块里,它将会指导mod_dav_svn在显示目录列表的时候生成XML输出,并且引用你选择的XSLT样式表文件:


<Location /svn>
  DAV svn
  SVNParentPath /usr/local/svn
  SVNIndexXSLT "/svnindex.xsl"
  …
</Location>


使用SVNIndexXSLT指示和创建一个XSLT样式表,你可以让你的目录列表的颜色模式与你的网站的其它部分匹配,否则,如果你愿意,你可以使用Subversion源分发版本中的tools/xslt/目录下的样例样式表。记住提供给SVNIndexXSLT 指示的路径是一个URL路径—浏览器需要阅读你的样式表来利用它们!


版本库列表
如果你通过 SVNParentPath指示从一个URL维护一组版本库,也可以让Apache在浏览器显示所有存在的版本库,只需要通过SVNListParentPath指示激活:


<Location /svn>
  DAV svn
  SVNParentPath /usr/local/svn
  SVNListParentPath on
  …
</Location>


如果一个用户将浏览器指向http://host.example.com/svn/,她一定会看到/usr/local/svn下所有的Subversion版本库,很明显这是一件安全问题,所以这个特性默认是关闭的。


Apache 日志
因为Apache的核心是一个HTTP服务器,它包含了梦幻般灵活的日志特性。各种配置日志的方式可以超出了本书的范围,但是我们必须指出,即使是最原始的文件httpd.conf也可以让Apache产生两个日志:error_log和access_log。这些日志会出现在不同的地方,但通常是创建在Apache安装的日志区。(在Unix下,这个目录是/usr/local/apache2/logs/。)


error_log描述了所有Apache运行中的内部错误,access_log记录了Apache接收到的所有HTTP请求,这个日志很容易查看,例如包括Subversion客户端的IP地址,哪些用户正确认证和请求成功还是失败。


不幸的是,因为HTTP是无状态协议,即使最简单的Subversion客户端操作会产生多个网络请求,很难通过查看access_log来确定用户的操作—大多数操作看起来像是一系列神秘的PROPPATCH、GET、PUT和REPORT请求。更糟糕的是,许多客户段操作会发送几乎完全相同的一系列请求,所以更加难以区分。


mod_dav_svn会成为一个辅助,通过激活“operational logging”属性,你可以告诉mod_dav_svn创建另外的日志文件,来描述你的客户度uan做了哪些高级操作。


为此,你需要利用Apache的CustomLog指示(在Apache自己的文档里有详细解释)指示,请确定在Subversion的Location指示之外配置这个指示。


<Location /svn>
  DAV svn
  …
</Location>


CustomLog logs/svn_logfile "%t %u %{SVN-ACTION}e" env=SVN-ACTION


在这个例子里,我们告诉Apache在标准的Apachelogs目录创建一个svn_logfile日志文件,%t和%u变量会被请求的时间和用户名代替,关键的部分是SVN-ACTION的两个实例,当Apache看到变量,会将变量的值替代为环境变量SVN-ACTION,这个环境变量的值是mod_dav_svn在检测到高级客户段操作时自动设置的。


所以我们不选择翻译下面的传统的access_log文件:


[26/Jan/2007:22:25:29 -0600] "PROPFIND /svn/calc/!svn/vcc/default HTTP/1.1" 207 398
[26/Jan/2007:22:25:29 -0600] "PROPFIND /svn/calc/!svn/bln/59 HTTP/1.1" 207 449
[26/Jan/2007:22:25:29 -0600] "PROPFIND /svn/calc HTTP/1.1" 207 647
[26/Jan/2007:22:25:29 -0600] "REPORT /svn/calc/!svn/vcc/default HTTP/1.1" 200 607
[26/Jan/2007:22:25:31 -0600] "OPTIONS /svn/calc HTTP/1.1" 200 188
[26/Jan/2007:22:25:31 -0600] "MKACTIVITY /svn/calc/!svn/act/e6035ef7-5df0-4ac0-b811-4be7c823f998 HTTP/1.1" 201 227



… 你可以细读一个更加智能的svn_logfile文件:


[26/Jan/2007:22:24:20 -0600] - list-dir '/'
[26/Jan/2007:22:24:27 -0600] - update '/'
[26/Jan/2007:22:25:29 -0600] - remote-status '/'
[26/Jan/2007:22:25:31 -0600] sally commit r60


其它特性
Apache作为一个健壮的Web服务器的许多特性也可以用来增加Subversion的功能性和安全性,Subversion使用Neon与Apache通讯,这是一种一般的HTTP/WebDAV库,可以支持SSL(Secure Socket Layer,将在后面讨论)。如果你的Subversion是以支持SSL(安全套接层,过一会儿讨论)编译,则你可以使用https://访问Apache服务器。


同样有用的是Apache和Subversion关系的一些特性,像可以指定自定义的端口(而不是缺省的HTTP的80)或者是一个Subversion可以被访问的虚拟主机名,或者是通过HTTP代理服务器访问的能力,这些特性都是Neon所支持的,所以Subversion轻易得到这些支持。


最后,因为mod_dav_svn是使用一个半完成的WebDAV/DeltaV方言,所以通过第三方的DAV客户端访问也是可能的,几乎所有的现代操作系统(Win32、OS X和Linux)都有把DAV服务器影射为普通的网络“共享”的内置能力,这是一个复杂的主题;察看附录 C, WebDAV 和自动版本来得到更多细节。






--------------------------------------------------------------------------------


[40] 他们讨厌这样做。


[41] 当使用自签名的服务器时仍会遭受“中间人”攻击,但是与偷取未保护的密码相比,这样的攻击比一个偶然的获取要艰难许多。


[42] 更多有安全意识的人不会希望在运行中servers文件保存客户端证书密码。


[43] 之前叫做“ViewCVS”。


https://i18n-zh.googlecode.com/svn/www/svnbook-1.4/svn.serverconfig.httpd.html














VisualSVN Server是免费的,而VisualSVN是收费的。VisualSVN是SVN的客户端,和Visual Studio集成在一起, VisualSvn Server是SVN的服务器端,包括Subversion、Apache和用户及权限管理,优点在上面已经说过了。
-
1.为什么要用VisualSVN Server,而不用Subversion?


回答:


因为如果直接使用Subversion,那么在Windows 系统上,要想让它随系统启动,就要封装SVN Server为windws service,还要通过修改配置文件来控制用户权限,另外如果要想以Web方式【http协议】访问,一般还要安装配置Apache,如果是新手,岂不是很头痛?而VisualSVN Serve集成了Subversion和Apache,省去了以上所有的麻烦。安装的时候SVN Server已经封装为windws service,Apache服务器的配置也只是在图像界面上,指定认证方式、访问端口等简单操作;另外,用户权限的管理也是通过图像界面来配置。


2.为什么不用TFS?


回答:


因为我们一开始就是用Subversion和TortioseSVN,所以就没有更换其他的软件。至于TFS至今没有用过,其实,我只是看了一些的文章而已,对它也不了解。


3.VisualSVN Server是免费的吗?


回答:


是的,VisualSVN Server是免费的,而VisualSVN是收费的。VisualSVN是SVN的客户端,和Visual Studio集成在一起, VisualSvn Server是SVN的服务器端,包括Subversion、Apache和用户及权限管理,优点在上面已经说过了。




好了,言归正传,正式开始我们今天的教程。 




一、VisualSVN Server的配置和使用方法【服务器端】


安装好VisualSVN Server后【安装过程看这里】,运行VisualSVN Server Manger,下面是启动界面:


 




好的,下面我来添加一个代码库【Repository】,如下图:






按上图所示,创建新的代码库,在下图所示的文本框中输入代码库名称: 








注意:上图中的CheckBox如果选中,则在代码库StartKit下面会创建trunk、branches、tags三个子目录;不选中,则只创建空的代码库StartKit。


点击OK按钮,代码库就创建成功了。






创建完代码库后,没有任何内容在里面。我会在这个教程的第二部分说明如何迁入源代码。


下面,我们开始安全性设置,在左侧的Users上点击右键:












输入上面的信息,点击OK,我们就创建一个用户了。按照上面的过程,分别添加用户Developer1、tester1、manager1,好了,我们开始添加这些用户到我们刚才创建的项目里:






点击上图中的"Add..."按钮,在下图中选择我们刚才添加的用户,点击OK按钮:


说明:大家可能注意到了下图中的Groups,是的,你也可以先创建组,把用户添加到各个组中,然后对组进行授权,操作比较简单,在此略过。






按照下图所示,分别对用户【或组】进行授权:






点击"确定"按钮,上面的用户就具有了访问StartKit代码库的不同权限。


因为用户starter在团队中是新来者,不希望他向代码库中提交新代码,所以他只能读取代码库中的代码,不能提交代码。tester1是测试人员,不负责代码编写,所以也是只读权限。而Developer1和manager1是开发人员和项目经理,自然具有读、写的权限。


在实际的项目开发过程中,Developer和tester往往不可能只有一个人,这时候使用组来授权更加方便,这个大家可以自己练习一下。


二、TotoiseSVN的基本使用方法




在 项目管理实践教程一、工欲善其事,必先利其器【Basic Tools】中,我已经讲解了怎样安装TortoiseSVN。在上面的讲解中已经讲了怎么使用VisualSVN Server了,今天我要讲的是,TortoiseSVN的简单使用方法。 


一、签入源代码到SVN服务器 
假如我们使用Visual Studio在文件夹StartKit中创建了一个项目,我们要把这个项目的源代码签入到SVN Server上的代码库中里,首先右键点击StartKit文件夹,这时候的右键菜单如下图所示: 


图2-2-1 


 


点击Import,弹出下面的窗体,其中http://zt.net.henu.edu.cn 是服务器名,svn是代码仓库的根目录,StartKit是我们在上个教程中添加的一个代码库: 


说明:左下角的CheckBox,在第一次签入源代码时没有用,但是,在以后你提交代码的时候是非常有用的。 


图2-2-2 


 


点击OK按钮,会弹出下面的窗体,要求输入凭据: 


图2-2-3 






在上面的窗体中输入用户名和密码,点击OK按钮: 


图2-2-4 


 


如上图所示,好了,源代码已经成功签入SVN服务器了。这时候团队成员就可以迁出SVN服务器上的源代码到自己的机器了。 


二、签出源代码到本机 
在本机创建文件夹StartKit,右键点击Checkout,弹出如下图的窗体: 


图2-2-5 


 


在上图中URL of Repository:下的文本框中输入svn server中的代码库的地址,其他默认,点击OK按钮,就开始签出源代码了。 


说明:上图中的Checkout Depth,有4个选项,分别是迁出全部、只签出下一级子目录和文件、只签出文件、只签出空项目,默认的是第一项。上面的例子中,我们也可以使用web的方式访问代码库,在浏览器中输入http://zt.net.henu.edu.cn/svn/StartKit/


这时候也会弹出对话框,要求输入用户名和密码,通过验证后即可浏览代码库中的内容。




搞定!源代码已经成功签出到刚才新建的StartKit目录中。


打开StartKit目录,可以看到如下图的文件夹结构: 


图2-2-5 


 


一旦你对文件或文件夹做了任何修改,那么文件或文件夹的显示图片机会发生变化。下图中我修改了其中的二个文件: 


图2-2-7 


 


大家看一下不同状态所对应的图片: 


图2-2-8 


 


我们已经知道怎么将源代码签入到SVN服务器,怎么从服务器签出代码到本机,也简单了解了不同状态所对应的图案啦。 


三、提交修改过的文件到SVN服务器 
上面的图2-2-7中,我修改了位于Model文件中的二个文件ImageInfo.cs和NewsInfo.cs,下面演示如何提交到SVN服务器。 


注意:提交源代码到服务器时,一定确保本机的代码是最新版本,否则可能提交失败,或者造成版本冲突。 


在Model文件夹上点击右键或在Model文件下的空白处点击右键,点击SVN Commit…弹出下面的窗体: 


图2-2-9 


 


点击OK按钮后,弹出如下图的窗体: 


图2-2-10 


 


四、添加新文件到SVN服务器 
我们在Model文件下添加一个新的类文件UserInfo.cs,在Model文件下的空白处点击右键,点击SVN Commit…,和上面讲的提交修改过的文件到SVN服务器一样,就可以了。 


另外也可以在文件UserInfo.cs上点击右键,点击TortoiseSVN=>>Add,弹出如下图的窗体: 


图2-2-11 


 


选中UserInfo.cs文件,点击OK按钮,这样并没有将这个文件提交到SVN服务器,只是将这个文件标记为源代码库库中的文件,并将其状态置为修改状态。之后,我们要再SVN Commit这个文件一次,才可以将其真正提交到SVN服务器上的代码库中。 




上面讲是添加文件,实际上,添加文件夹的步骤也是一样的,这里就不说了。 




五、更新本机代码与SVN服务器上最新的版本一致 
这个也很简单,只要在需要更新的文件夹上点击右键或在该文件下的空白处点击右键,点击SVN Update,就可以了。 


注意:更新操作可能会因为版本冲突而失败,这是可以使用合并【Merge】或其他方法解决;也可能因为锁定【Get Lock】而失败,这是需要先解锁【Release Lock】。 


六、重命名文件或文件夹,并将修改提交到SVN服务器 
只要在需要重命名的文件或文件夹上点击右键,点击TortiseSVN=>>Rename…,在弹出的窗体中输入新名称,点击OK按钮,就可以了。此方法也不是直接重命名,而是将该文件或文件夹的名称标记为重命名后名称,也需要我们使用SVN Commit提交到SVN服务器后才真正重命名。 


七、删除文件或文件夹,并将修改提交到SVN服务器 
最简单就是,你直接删除文件或文件夹,然后使用SVN Commit提交更新到SVN服务器。另外一种方法是在你要删除的文件或文件夹上点击右键=>>TortoiseSVN=>>Delete删除,此方法也不是直接删除,而是将该文件或文件夹的状态置为删除,也需要我们使用SVN Commit提交到SVN服务器后才真正删除。 


说明:实际上,从你把源代码迁签入SVN服务器开始,每一个版本的数据和文件,就算是你已经删除了的,也都可以随时迁出。


以上只是TortoiseSVN最简单的几个功能,其实他的功能远不止这些,其他的功能大家可以在使用的过程中慢慢体会,有些功能我会在下面的教程中使用到,到时候会和大家讲清楚用法。 


注意:向SVN服务器提交源代码的时候,一定不要提交bin、obj等文件夹,否则会很麻烦。但是web项目的bin目录除外,但是web项目的bin目录中的引用其他项目而生成的dll不需要提交。


一个好习惯:如果项目中引用了其他的第三方的程序集,比如EnterpriseLibrary、FCKEditor等,这时候不要简单从他们的安装位置引用,而是在你的解决方案下,添加一个Library的目录,把需要的程序集复制到这里,然后从Library目录引用,这样有什么好处,自己想一想吧!


如果大家有什么问题,尽管跟帖提问,我一定及时回答。


好了,今天就先写到这里吧,本来说这部分准备写一篇Blog,可是现在写了这么长,还只是说了一点很基本的东西而已,呵呵……




详细出处参考:http://www.jb51.net/article/17365.htm
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页