subversion安装、备份、安全认证实践笔记——宋轶聪

 

在windows上配置svn的方法

在linux 10.117.100.130 上安装svn

svn库的导入导出

查看svn服务器版本

SVN备份策略

Svn 服务配置和维护常用命令

linux下启动和停止

win下启动和停止svn

把svn加为系统服务

配置apache通过http访问svn

svn 命令行

 

 

 

 

 

 

 

 

 

 

====================================在windows上的配置方法===============================================================

1.    环境和软件准备

Window-Subvsersion : http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91

 

2.    配置管理

2.1. 创建仓库 (svnadmin)

在硬盘上创建个空目录,作为 SVN 的仓库目录如: E:/svnroot/repository

下面使用两种方式创建仓库的初时文件结构和存储方式。

  • 命令方式

  • TortoiseSVN 客户端方式,

后面所有文档都采用两种方式说明,其功能完全相同。请根据实际情况选择使用。

 

命令方式( DOS 下):

# 默认方式,采用 FSFS 方式存储数据,这是推荐方式,管理和迁移相对 bdb 方式简单

svnadmin create E:/svnroot/repository

svnadmin create &endash;fs-type bdb E:/svnroot/repository

上为bdb的文件系统方式, 一般默认是native的FS即 NTFS

 

TortoiseSVN 客户端方式

安装TortoiseSVN

创建空目录

进入空目录,右键TortoiseSVN 》创建库here

 

 

 

2.2. 配置服务

进入仓库目录下的 conf 文件夹。也就是 E:/svnroot/repository/conf

里面有 3 个默认的配置文件: authz , passwd , svnserve.conf

  • authz 典型的配置是设置由 authz 控制授权,即哪个组可以对这个目录有什么权限

  • svnserve.conf 控制 svnserve 的启动配置选项,可以配置认证和授权方式,

  • passwd 控制认证的方式来控制访问权限。也可以使用匿名方式,但不推荐。所有用户和密码

使用 authz 和 passwd 的典型配置:

 

请特别注意:以下三个配置文件的配置,每行有效配置前不能有空格,不然配置会失败

 

------------------------------------------服务配置文件 svnserve.conf-----------------------------------------------------

&ldots;&ldots;

### 匿名方式不允许访问

anon-access = none

&ldots;&ldots;

### Uncomment the line below to use the default password file.

### 表示访问仓库的认证有文件 passwd 提供的账户确定

password-db = passwd

&ldots;&ldots;

### Uncomment the line below to use the default authorization file.

### 表示认证后的账户访问权限由文件 authz 定义

authz-db = authz

### This option specifies the authentication realm of the repository.

&ldots;&ldots;

#realm = My First Repository

 

--------------------------------------------认证配置文件 passwd--------------------------------------------------------------

passwd 文件实际提供访问本仓库的账户管理,文件格式就是 ini 方式的格式

[users]

# harry = harryssecret

# sally = sallyssecret

testuser1=testuser1

testuser2=testuser2

这表示本仓库配置了二个用户及:其中一个用户 testuser1, 他的访问密码是 testuser1

访问密码可以使用明文,也可以使用 htpasswd.exe ( apache 服务器提供的工具方法,安装 apache 服务器后,在其 bin 目录中有该程序文件)进行加密处理。

 

--------------------------------------------授权配置文件 authz----------------------------------------------------------------

该文件负责认证后的用户的权限控制,配置稍微复杂,但其实也就是个 ini 配置文件而已。

典型配置:

# groups 段提供配置组的功能 , 但组成员必须是 passwd 文件中定义的用户才有效。可以对组

# 进行权限控制,所有组成员具有组对应的访问权限。

[groups]

# 表示定义了一个管理组叫 admin_group, 包括 harry 和 sally , admin_group 前千万不能有空格

admin_group=testuser1

dev_group=testuser2

# 下面就是定义具体仓库下目录的访问权限

# 一般对管理员来说都具有整个仓库的读写权限,一般人员对整个敞开具有读取权限,下面

# 就是这样的配置 ,[/] 表示整个仓库的根,组的引用使用 @ ,对应的权限可以是 r,w,rw 或空

[/]

@admin_group = rw

@dev_group = rw

* = r

[/test_project]

@admin_group = rw

@dev_group = rw

* = r

[repository:/]

@admin_group = rw

@dev_group = rw

* = r

以上的配置完成后,就可以启动服务器了,下面说明服务器的启动。

注意,以上 authz 和 passwd 文件在管理中因为具体项目的加入和人员的变动会经常的修改,这也是 SVN 管理主要的工作

 

 

2.3. 启动服务 (svnserve)

Svn 服务器一般有三种方式, svnserve , apache 和 SSH

其中常用的有 svnserve 和 apache 方式。本文只以 svnserve 方式讲解。

  • svnserve 是最高效的方式,一般应用于内部开发网中使用。

  • Apache 方式因为可以很好的部署在 internet 上,所以公网使用最方便,但配置稍微相对复杂点点,呵呵~~。

  • ssh方式

 

命令方式( DOS 下)启动:

svnserve &endash;d &endash;r "E:/svnroot/repository"

-d 参数是以独立服务的方式启动

-r 是制订要加载的仓库的物理路径

 

添加为Windows系统服务

方法1(推荐):

在Windows NT中(包括Windows XP, Windows 2000, Windows 2003 Server, Windows vista)本身包含了一个安装服务的工具,叫做"Service Control",也就是sc.exe。

1.安装为服务:

例:我的Subversion安装在"C:/Program Files/Subversion",版本库在"E:/svnroot/repository",

而我希望对应的Subversion服务名为svnservice,安装这个svn服务的命令就可以这样写:

SC create svnservice binPath= "/"C:/Program Files/Subversion/bin/svnserve.exe/" --service --root /"E:/svnroot/repository/"" displayname= "SVNService" depend= Tcpip start= auto   配置为自启动服务

 

在以前启动svnserve时会使用"-d"选项,也就是守护进程模式,在这里不能使用,会导致服务无法启动。同样,"-i"和"-t"选项也不能使用。

另外还有两点需要小心处理

  • 首先,如果路径中包括空格,一定要用”r;/”处理双引号,例如上面的例子中如果svnserve.exe在

”r;C: /Program Files/Subversion/bin/svnserve.exe”中,则命令应该写为”r;binpath= "/"C:/Program Files/Subversion/bin/svnserve.exe/"”(”r;”中的内容):

SC create svnservice binPath= "/"C:/Program Files/Subversion/bin/svnserve.exe/" --service --root /"E:/svnroot/repository/"" displayname= "SVNService" depend= Tcpip

  • 其次,sc对选项的格式还有要求,例如”r;depend= Tcpip”不能写为”r;depend = Tcpip”或”r;depend=Tcpip”,也就是”r;=”前不能有空格,而后面必须有空格

 

2.启动服务

在命令行窗口执行完这个命令之后,服务还没有启动,你可以继续运行"net start svnservice"启动这个服务

 

3.停止服务

然后使用"net stop svnservice"停止服务

 

4.删除服务

如果服务安装的有问题,你可能需要删除服务。要删除前面添加的服务,只需要运行"sc delete svnservice",

"svnservice"就是我们创建服务时使用的名字。

 

5.配置服务是自动启动

默认情况下安装的服务不会随Windows的启动而启动,为了使svn服务能够随Windows启动而启动,

需要修改一下"sc create"命令(首先要删除),增加"start= auto"选项:

 SC create svnservice binPath= "/"C:/Program Files/Subversion/bin/svnserve.exe/" --service --root /"E:/svnroot/repository/"" displayname= "SVNService" depend= Tcpip start= auto

当然你也可以使用图形化的工具修改服务的属性,你可以在”r;开始->运行...”中执行"services.msc",然后在界面中修改。

在vista下要以管理员的权限运行CMD, 否则会出现权限问题.

 

 

=================================在linux 10.117.100.130 上安装svn===============================================================

1、下载svn for linux 最新版           http://subversion.tigris.org

2、连接vpn并使用sshsecure client上传

3、使用cat /proc/version  查看系统是什么Linux,

结果显示是centos

4、查看磁盘使用情况

[root@localhost ~]# df

Filesystem           1K-blocks      Used Available Use% Mounted on

/dev/mapper/vgroot-root

                       6887724   1757136   4775056  27% /

/dev/mapper/vgehong-ehong                                                                            逻辑卷

                      20282620    176200  19059484   1% /usr/local/ehong

/dev/sda1               194442     14424    169979   8% /boot

tmpfs                  2022252         0   2022252   0% /dev/shm

 

5、解压缩并安装

  1. 解压:#: tar zxvf subversion-1.3.2.tar.gz

  2. 依次输入./configure , make , make install 进行编译安装完成。

  3. 开启SVN服务:svnserve -d

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

 

 

tar xfj subversion-1.4.3.tar.bz2

tar xfj subversion-deps-1.4.3.tar.bz2

# subversion-deps的文件也会解压到subversion-1.4.3目录中

cd subversion-1.4.3

rm -rf apr

rm -rf apr-util

ln -s /home/tmp/httpd-2.2.4/srclib/apr apr

ln -s /home/tmp/httpd-2.2.4/srclib/apr-util apr-util

./configure && make && make install

安装完成后,查看是否存在文件$APACHE_HOME/modules/mod_dav_svn.so(默认/usr/local/apache2/modules/mod_dav_svn.so)。另外,如果该机器上以前是装过旧版本的SVN,要把"/usr/local/lib/libsvn*"文件都删除。

 

 

正式使用前准备:

首先我们得建立一个SVN的项目,一般人都认为建立项目就只需要一个文件,在我第一次使用SVN之前都有这样的看法,SVN建立项目需要建立文件夹

  1. 建立项目命令:svnadmin create project_name project_name 为你的project名字,可以任意取。

建立完毕后,project_name是一个文件夹,进入文件夹,可以看到一个conf的文件夹。

    2.进入文件夹可以看到2个文件(如果没有passwd文件,可以用vi创建),编辑 svnserve.conf 把anon-access = read ,auth_access = write

还有password-db = passwd 的注释去掉,还有[general]的注释也要去掉。

vi passwd文件,如果是新文件,则输入:

[user]

your_name = your_password

这里设置的your_name是你的用户名,your_password是你的密码,这个是访问SVN必要的通行证。

好了,现在终于把准备功夫做完了,

 

下面可以正是使用了。

首先找到你的项目源代码文件夹,使用下面命令:

cd your project

in your project dircetory

use:svn co /home/project_name --username = your_name --password=your_password

 

好了,现在你可以在客户机上使用以下命令获得你想要的项目源代码文件

svn co svn://home/project_name --username=your_name --password = your_password

 

把增加的svn文件添加入svn库:

svn add /home/your_project/*.* --username=your_name --password = your_password

 

提交文件:

svn commit /home/your_project/*.* --username=your_name --password=your_password

 

更新文件:

svn update /home/your_project/*.* --username=your_name --password=your_password

当然你可以编辑一个脚本文件来一次完成所有的操作:

vi svnupdate.sh

#!/bin/sh

svn add /home/your_project/*.* --username=your_name --password = your_password

svn commit /home/your_project/*.* --username=your_name --password=your_password

svn update /home/your_project/*.* --username=your_name --password=your_password

chmod +x svnupdate.sh

Finish

 

 

=====================================svn库的导入导出============================================================================

svn提供了一个类似oracle export成dump文件的一个工具svnadmin dump,导出的文件为文本文件

 

//导出

1、首先进入库的相应目录

cd e:/svnroot

2、导出/java-source所有文件到

E:/svnroot>svnadmin dump ./java-source > java-dump

3、将java-dump上传到

 

//还原

$svnadmin load java-source < java-dump

 

ok成功导入。

 

 

停止subversion服务

ps &endash;aux | grep svnserve

kill -9 ID号

 

 

 

 

 

 

 

 

查看svn服务器版本

C:/Documents and Settings/server>svnadmin --version                        用svn --version效果一样

svnadmin,版本 1.5.6 (r36142)

   编译于 Mar  6 2009,14:54:47

版权所有 (C) 2000-2008 CollabNet。

Subversion 是开放源代码软件,请参阅 http://subversion.tigris.org/ 站点。

此产品包含由 CollabNet(http://www.Collab.Net/) 开发的软件。

下列版本库后端(FS) 模块可用:

* fs_base : 模块只能操作BDB版本库。

* fs_fs : 模块与文本文件(FSFS)版本库一起工作。

 

 

[root@localhost ~]# svn --version

svn, version 1.6.11 (r934486)

   compiled Apr 20 2010, 00:24:22

Copyright (C) 2000-2009 CollabNet.

Subversion is open source software, see http://subversion.tigris.org/

This product includes software developed by CollabNet (http://www.Collab.Net/).

The following repository access (RA) modules are available:

* ra_neon : Module for accessing a repository via WebDAV protocol using Neon.

  - handles 'http' scheme

  - handles 'https' scheme

* ra_svn : Module for accessing a repository using the svn network protocol.

  - with Cyrus SASL authentication

  - handles 'svn' scheme

* ra_local : Module for accessing a repository on local disk.

  - handles 'file' scheme

 

 

 

====================================SVN备份策略=============================================================================

文章摘要:Subversion适合于规模一般(几十开发人员)的项目代码的版本管理工作。使用体验较VSS、CVS等好,推荐在选择版本管理工具时可以试用一下。

安装Subversion

        1 安装svn-1.4.0-setup。

        2 将SVN配置成服务。

(本文例子基于FreeBSD/Linux实现,windows环境请自己做出相应修改)

   配置管理的一个重要使命是保证数据的安全性,防止服务器应硬盘损坏、误操作造成数据无法恢复的灾难性后果。因此制定一个完整的备份策略非常重要。

一般来说,备份策略应规定如下几部分内容:备份频度、备份方式、备份存放地点、备份责任人、灾难恢复检查措施及规定。

   备份频度、存放地点等内容可以根据自己的实际情况自行制定;本文重点描述备份方式。

   svn备份一般采用三种方式:1)svnadmin dump 2)svnadmin hotcopy 3)svnsync.

注意,svn备份不宜采用普通的文件拷贝方式(除非你备份的时候将库暂停),如copy命令、rsync命令。

笔者曾经用 rsync命令来做增量和全量备份,在季度备份检查审计中,发现备份出来的库大部分都不可用,因此最好是用svn本身提供的功能来进行备份。

优缺点分析:

==============

第一种svnadmin dump是官方推荐的备份方式,优点是比较灵活,可以全量备份也可以增量备份,并提供了版本恢复机制。

   缺点是:如果版本比较大,如版本数增长到数万、数十万,那么dump的过程将非常慢;备份耗时,恢复更耗时;不利于快速进行灾难恢复。

   个人建议在版本数比较小的情况下使用这种备份方式。

第二种svnadmin hotcopy原设计目的估计不是用来备份的,只能进行全量拷贝,不能进行增量备份;

优点是:备份过程较快,灾难恢复也很快;如果备份机上已经搭建了svn服务,甚至不需要恢复,只需要进行简单配置即可切换到备份库上工作。

缺点是:比较耗费硬盘,需要有较大的硬盘支持(俺的备份机有1TB空间,呵呵)。

第三种svnsync实际上是制作2个镜像库,当一个坏了的时候,可以迅速切换到另一个。不过,必须svn1.4版本以上才支持这个功能。

   优点是:当制作成2个镜像库的时候起到双机实时备份的作用;

   缺点是:当作为2个镜像库使用时,没办法做到”r;想完全抛弃今天的修改恢复到昨晚的样子”;而当作为普通备份机制每日备份时,操作又较前2种方法麻烦。   

下面具体描述这三种的备份的方法:

===============

1、svnadmin dump备份工具

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

这是subversion官方推荐的备份方式。

1)定义备份策略:

   备份频度:每周六进行一次全量备份,每周日到周五进行增量备份

   备份地点:备份存储路径到/home/backup/svn/

   备份命名:全量备份文件名为:weekly_fully_backup.yymmdd,增量备份文件命名为:daily-incremental-backup.yymmdd

   备份时间:每晚21点开始

   备份检查:每月末进行svnadmin load恢复试验。

2)建立全量备份脚本:

   在~/下建立一个perl脚本文件,名为weekly_backup.pl,执行全量备份,并压缩备份文件,代码如下(本代码只针对一个库的备份,如果是多个库请做相应改动):

   

#!/usr/bin/perl -w

my $svn_repos="/home/svn/repos/project1";

my $backup_dir="/home/backup/svn/";

my $next_backup_file = "weekly_fully_backup.".`date +%Y%m%d`;

$youngest=`svnlook youngest $svn_repos`;

chomp $youngest;

print "Backing up to revision $youngestn";

my $svnadmin_cmd="svnadmin dump --revision $youngest $svn_repos >$backup_dir/$next_backup_file";

`$svnadmin_cmd`;

open(LOG,">$backup_dir/last_backed_up"); #记录备份的版本号

print LOG $youngest;

close LOG;

#如果想节约空间,则再执行下面的压缩脚本

print "Compressing dump file...n";

print `gzip -9 $backup_dir/$next_backup_file`;

   3)建立增量备份脚本:

在全量备份的基础上,进行增量备份:在~/下建立一个perl脚本文件,名为:daily_backup.pl,代码如下:

#!/usr/bin/perl -w

my $svn_repos="/home/svn/repos/project1";

my $backup_dir="/home/backup/svn/";

my $next_backup_file = "daily_incremental_backup.".`date +%Y%m%d`;

open(IN,"$backup_dir/last_backed_up");

$previous_youngest = <IN>;

chomp $previous_youngest;

close IN;

$youngest=`svnlook youngest $svn_repos`;

chomp $youngest;

if ($youngest eq $previous_youngest)

{

   print "No new revisions to backup.n";

   exit 0;

}

my $first_rev = $previous_youngest + 1;

print "Backing up revisions $youngest ...n";

my $svnadmin_cmd = "svnadmin dump --incremental --revision $first_rev $youngest $svn_repos > $backup_dir/$next_backup_file";

`$svnadmin_cmd`;

open(LOG,">$backup_dir/last_backed_up"); #记录备份的版本号

print LOG $youngest;

close LOG;

#如果想节约空间,则再执行下面的压缩脚本

print "Compressing dump file...n";

print `gzip -g $backup_dir/$next_backup_file`;

4)配置/etc/crontab文件

配置 /etc/crontab 文件,指定每周六执行weekly_backup.pl,指定周一到周五执行daily_backup.pl;

具体步骤俺就不啰嗦了.

5)备份恢复检查

在月底恢复检查中或者在灾难来临时,请按照如下步骤进行恢复:恢复顺序从低版本逐个恢复到高版本;即,先恢复最近的一次完整备份 weekly_full_backup.071201(举例),然后恢复紧挨着这个文件的增量备份 daily_incremental_backup.071202,再恢复后一天的备份071203,依次类推。如下:

user1>mkdir newrepos

user1>svnadmin create newrepos

user1>svnadmin load newrepos < weekly_full_backup.071201

user1>svnadmin load newrepos < daily_incremental_backup.071202

user1>svnadmin load newrepos < daily_incremental_backup.071203

....

如果备份时采用了gzip进行压缩,恢复时可将解压缩和恢复命令合并,简单写成:

user1>zcat weekly_full_backup.071201 | svnadmin load newrepos

user1>zcat daily_incremental_backup.071202 | svnadmin load newrepos

...

(这部分内容很多参考了《版本控制之道》)

   

2、svnadmin hotcopy整库拷贝方式

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

svnadmin hotcopy是将整个库都”r;热”拷贝一份出来,包括库的钩子脚本、配置文件等;任何时候运行这个脚本都得到一个版本库的安全拷贝,不管是否有其他进程正在使用版本库。

因此这是俺青睐的备份方式。

   1)定义备份策略

备份频度:每天进行一次全量备份,

备份地点:备份目录以日期命名,备份路径到 /home/backup/svn/${mmdd}

备份保留时期:保留10天到15天,超过15天的进行删除。

备份时间:每晚21点开始

备份检查:备份完毕后自动运行检查脚本、自动发送报告。

   2)建立备份脚本

   在自己home目录 ~/下创建一个文件,backup.sh:

#!/bin/bash

SRCPATH=/home/svn/repos/; #定义仓库parent路径

DISTPATH=/home/backup/svn/`date +%m%d`/ ; #定义存放路径;

if [ -d "$DISTPATH" ]

then

else

mkdir $DISTPATH

chmod g+s $DISTPATH

fi

echo $DISTPATH

svnadmin hotcopy $SRCPATH/Project1 $DISTPATH/Project1 >/home/backup/svn/cpreport.log 2>&1;

svnadmin hotcopy $SRCPATH/Project2 $DISTPATH/Project2

cp $SRCPATH/access   $DISTPATH; #备份access文件

cp $SRCPATH/passwd   $DISTPATH; #备份passwd文件

perl /home/backup/svn/backup_check.pl #运行检查脚本

perl /home/backup/svn/deletDir.pl   #运行删除脚本,对过期备份进行删除。

   3)建立检查脚本

   在上面指定的地方/home/backup/svn/下建立一个perl脚本:backup_check.pl

备份完整性检查的思路是:对备份的库运行 svnlook youngest,如果能正确打印出最新的版本号,则表明备份文件没有缺失;如果运行报错,则说明备份不完整。我试过如果备份中断,则运行svnlook youngest会出错。

   perl脚本代码如下:

#! /usr/bin/perl

## Author:xuejiang

## 2007-11-10

## http://www.scmbbs.com

use strict;

use Carp;

use Net::SMTP;

#### defined the var #######

my $smtp =Net::SMTP->new('mail.scmbbs.com', Timeout => 30, Debug => 0)|| die "cann't connect to mail.scmbbs.comn";

my $bkrepos="/home/backup/svn/".&get_day;#定义备份路径

my $ssrepos="http://www.scmbbs.com/repos";#定义仓库url

my @repos = ("project1","project2");

my $title="echo "如下是昨晚备份结果与真实库对比的情况,如果给出备份版本数,则表示备份成功;如果给报错信息或没有备份版本数,则表示备份失败:" >./report";

system $title   || die "exec failedn";

foreach my $myrepos(@repos)

{

my $bkrepos1=$bkrepos."/".$myrepos;

   my $ssrepos1=$ssrepos."/".$myrepos;

   my $svnlookbk1 = "echo "$myrepos 昨晚备份的版本是:">>./report;svnlook youngest ".$bkrepos1." >> ./report 2>&1";

   my $svnlookss1 = "echo "$myrepos 真实库中的最新版本及最后修改时间是:">>./report;svn log -r'HEAD' ".$ssrepos1." >> ./report 2>&1";

   system $svnlookbk1 || die "exec failedn";

   system $svnlookss1 || die "exec failedn";

}

my $body    ="echo "=========================================================================" >>./report";

my $bottom     ="echo "备份位置:来自http://www.scmbbs.com的".$bkrepos."" >>./report";

system $body    || die "exec failedn";

system $bottom     || die "exec failedn";

###### report the result ####

open(SESAME,"./report")|| die "can not open ./report";

my @svnnews = <SESAME>;

close(SESAME);

foreach my $line1 (@svnnews)

{

   print $line1."n";

}

my @email_addresses =("[email protected]","[email protected]","[email protected]");

my $to              = join(', ', @email_addresses);

$smtp->mail("[email protected]");

$smtp->recipient(@email_addresses);

$smtp->data();

$smtp->datasend("Toton");

$smtp->datasend("From: [email protected]");

$smtp->datasend("Subject:svn备份检查报告".&get_today."n");

$smtp->datasend("Reply-to:[email protected]");

$smtp->datasend("@svnnews");

$smtp->dataend();

$smtp->quit;

#############

sub get_today

{

my( $sec, $min, $hour, $day, $month, $year ) = localtime( time() );

$year += 1900;

$month++;

my $today = sprintf( "%04d%02d%02d", $year, $month, $day);

return $today;

}

sub get_day

{

my( $sec, $min, $hour, $day, $month, $year ) = localtime( time() );

$year += 1900;

$month++;

my $today = sprintf( "%02d%02d", $month, $day);

return $today;

}

   4)定义删除脚本

由于是全量备份,所以备份不宜保留太多,只需要保留最近10来天的即可,对于超过15天历史的备份基本可以删除了。

在/home/backup/svn/下建立一个perl脚本:deletDir.pl

(注意,删除svn备份库可不像删除普通文件那么简单)

5)修改/etc/crontab 文件

在该文件中指定每晚21点执行”r;backup.sh”脚本。

 

3、svnsync备份

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

    

   使用svnsync备份很简单,步骤如下:

1)在备份机上创建一个空库:

svnadmin create svnbackup

2)更改该库的钩子脚本pre-revprop-change(因为svnsync要改这个库的属性,也就是要将源库的属性备份到这个库,所以要启用这个脚本):

   cd SMP/hooks;

   cp pre-revprop-change.tmpl pre-revprop-change;

   chmod 755 pre-revprop-change;

   vi pre-revprop-change;

   将该脚本后面的三句注释掉,或者干脆将它弄成一个空文件

3)初始化,此时还没有备份任何数据:

svnsync init file:///home/backup/svn/svnsync/svnbackup/   http://svntest.subversion.com/repos/svnbackup

   语法是:svnsync init {你刚创建的库url} {源库url}

   注意本地url是三个斜杠的:///

4)开始备份(同步):

   svnsync sync file:///home/backup/svn/svnsync/svnbackup

5)建立同步脚本

   备份完毕后,建立钩子脚本进行同步。在源库/hooks/下建立/修改post-commit脚本,在其中增加一行,内容如下:

/usr/bin/svnsync sync   --non-interactive file:///home/backup/svn/svnsync/svnbackup

   你可能已经注意到上面的备份似乎都是本地备份,不是异地备份。实际上,我是通过将远程的备份机mount(请参阅mount命令)到svn服务器上来实现的,

逻辑上看起来是本地备份,物理上实际是异地备份。

转载自:http://hi.baidu.com/it198/blog/item/69c407d1e5ca7bda572c8429.html

 

 

 

 

 

 

 

 

 

 

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

Subversion独立服务和与apache整合服务。

1、Svn独立服务安装

操作系统: Redhat Linux AS3  AS 4   ContOS AS 4

安装包获取:

下载[url]http://subversion.tigris.org/downloads/subversion-1.4.0.tar.gz[/url]和[url]http://subversion.tigris.org/downloads/subversion-deps-1.4.0.tar.gz[/url]。

编译:

以root用户登录。

将subversion-1.4.0.tar.gz和subversion-deps-1.4.0.tar.gz传到服务器。

tar xfvz subversion-1.4.0.tar.gz

tar xfvz subversion-deps-1.4.0.tar.gz

subversion-deps包有四个目录zlib apr apr-util neon这四个目录都是依赖包,编译subversion所必须的代码

cd subversion-1.4.0

./configure &endash;prefix=/opt/svn &endash;without-berkeley-db &endash;with-zlib

(注:以svnserve方式运行,不加apache编译参数。以fsfs格式存储版本库,不编译berkeley-db)

make clean

make

make install

vi /etc/profile,在/etc/profile最后加入:

PATH=$PATH:/opt/svn/bin

export PATH

测试:

svnserve &endash;version

如果显示如下,安装成功:

svnserve, version 1.4.0 (r21228)

compiled Oct 12 2006, 10:18:56

Copyright (C) 2000-2006 CollabNet.

Subversion is open source software, see [url]http://subversion.tigris.org/[/url]

This product includes software developed by CollabNet ([url]http://www.Collab.Net/[/url]).

The following repository back-end (FS) modules are available:

* fs_fs : Module for working with a plain file (FSFS) repository.

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/pwd.conf。如有必要,也可以分开。文件中定义用户组和版本库目录权限。

注意:

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

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

用户组格式:

[groups]

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

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

版本库目录格式:

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

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

<用户名> = <权限>

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

/,表示根目录及以下。根目录是svnserve启动时指定的,我们指定为/opt/svndata。这样,/就是表示对全部版本库设置权限。

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

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

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

权限主体可以是用户组、用户或*,用户组在前面加@,*表示全部用户。权限可以是w、r、wr和空,空表示没有任何权限。

示例:

[groups]

admin = alan

[/]

@admin = rw

[repos1:/abc/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

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 ”r;svnserve -d &endash;listen-port 9999 -r /opt/svndata”

其中:

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

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

&endash;listen-port 9999表示使用9999端口,可以换成你需要的端口。但注意,使用1024以下的端口需要root权限

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

检查:

ps -ef|grep svnserve

如果显示如下,即为启动成功:

svn    6941   1 0 15:07 ?    00:00:00 svnserve -d &endash;listen-port 9999 -r /opt/svndata

 

二、svn服务与apache 整合

Subversion存储方式,一是Berkeley DB伯克利存储方式,二是fsfs存储方式。两种版本库数据存储对照表特性 Berkeley DB FSFS

对操作中断的敏感 很敏感;系统崩溃或者权限问题会导致数据库”r;塞住”,需要定期进行恢复。 不敏感

可只读加载 不能 可以

存储平台无关 不能 可以

可从网络文件系统访问 不能 可以

版本库大小 稍大 稍小

扩展性:修订版本树数量 无限制 某些本地文件系统在处理单一目录包含上千个条目时会出现问题。

扩展性:文件较多的目录 较慢 较慢

检出最新代码的速度 较快 可以

大量提交的速度 较慢,但时间被分配在整个提交操作中 较快,但最后较长的延时可能会导致客户端操作超时

组访问权处理 对于用户的 umask 设置十分敏感,最好只由一个用户访问。 对 umask 设置不敏感

功能成熟

 

1、安装APR-1.2.7和APR-util-1.2.7

    下载地址:[url]http://apr.apache.org/ [/url]   

    tar zxvf  apr-1.2.7.tar.gz

   ./configure

    make

    make install

 

我下载的是tar.bz2格式的,用上面的方法解压失败。经研究,解决方法如下:

z用来解压.tar.gz的文件,.tar.bz2的文件得换成j,象这样:

tar   -xjvf   linux-2.6.20.tar.bz2

看看参数说明:

x:解压

j:bz2

f:指定文件

这个包不行,不过学了一种解压的方法也算有收获

 

 

 

    tar zxvf apr-util-1.2.7.tar.gz

    ./configure --with-apr=/usr/local/apr/

     make

     make install

2、编译安装APACHE。

    tar zxvf httpd-2.2.3.tar.gz

    cd httpd-2.2.3

   ./configure --prefix=/opt/apache --enable-dav --enable-so --enable-maintainer-mode --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apr/bin/apu-1-config

     make

     make install

3、安装subversion-1.4.0

     tar zxvf subversion-1.4.0.tar.gz

    ./configure --with-apxs=/opt/apache/bin/apxs --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr

问题:有关共享库错误方法:  echo "/usr/local/apr-util/lib" >> /etc/ld.so.c            ldconfig      echo $?

    make

    make install

   设置环境变量(可做可不做)vi /etc/profile,在/etc/profile最后加入:

PATH=$PATH:/opt/svn/bin

export PATH

4、查看subversion两个动态库有没有安装成功

     vi /opt/apache/conf/httpd.conf

    看到下面两个模块说明安装成功

     LoadModule dav_svn_module     modules/mod_dav_svn.so

     LoadModule authz_svn_module   modules/mod_authz_svn.so

5、配置SVN

    vi /opt/apache/conf/httpd.conf

     配置:

    <Location /svn>

       DAV svn

        SVNParentPath /data/svn/repos //svn父目录

        AuthType Basic //连接类型设置

        AuthName "Subversion repository" //连接框提示

        AuthUserFile /data/svn/passwd //用户配置文件

        AuthzSVNAccessFile /data/svn/auth

        Require valid-user //passwd所有的用户都可以访问  </Location>

6、建立SVN存储仓库

     #mkdir -p /opt/svndata/repos

    #svnadmin create &endash;fs-type fsfs /opt/svndata/repos

备份以前的SVN库

#svnadmin dump /opt/svndata/repos > /root/repos20080328

把备份出来的数据恢复到本地

#svnadmin load /opt/svndata/repos/ < /root/repos20080328

7、建立本地访问控制文件#/opt/apache/bin/htpasswd [-c] /opt/passwd north

//第一次设置用户时使用-c表示新建一个用户文件。#/opt/apache/bin/htpasswd passwd 用户名(加入新的用户)

8、建立本地项目控制文件

    touch /opt/svndata/auth

    文件内容为:

[groups]

[repos1:/]

#wxy = rw

north = rw

tom = rw

[repos2:/]

repos2 = rw

9、安装客户端,访问服务器

   [url]http://192.168.0.180:/svn/jishu[/url]

   注意:SVN是APACHE配置的时候加上去的。

10、到此安装基本结束

     修改一下/data/svn/repos属性,否则会导致文件上传失败。

     chmod -R apache.apache repos

三、日常维护命令和参数

 

linux下启动svn

启动svn

1、指定端口

启动svn服务svnserve -d --listen-port 20000 -r /opt/svndata

 2、不指定端口

[root@localhost conf]# svnserve -d -r /var/svnroot

 

 

创建版本库svnadmin create fs-type fsfs /opt/svndata/mark

 

查看版本库的信息svn list  file:///opt/svndata/marksvn list --verbose file:///opt/svndata/mark

导入库的目录结构svn import /tmp/mark/ file:///opt/svndata/mark/ --message "init" (文件夹mark下有bo)

 

删除版本库mark下文件夹bosvn delete svn://192.168.0.180:20000/opt/svndata/mark/bo -m "delete "

 

//导出$svnlook youngest oldrepo$svnadmin dump oldrepo >; dumpfile

//还原$svnadmin load newrepo < dumpfile

 

停止subversion服务

ps &endash;aux | grep svnserve

杀掉进程

kill -9 ID号

 

 

 

 

 

========================可以把svn加为系统服务===================================================================================

建立 autoRunSVN.bat文件,内容是: sc create MySVNServer binpath= "/"C:/Program FilesSubversion/svnserve/svnserve/" --service -r H:/homerepos" displayname= "SVNService" depend= Tcpip start= auto pause

  留心之处:

  (1)sc是windows自带的服务配置程序,MySVNServer 是服务的名称,似乎没什么用。

  (2)参数binPath示意 svnserve可执行文件的安装路径,由于路径中的"Program Files"带有空格,因此整个路径须要用双引号惹起来。而双引号本身是个特殊字符,须要执行 转移,因此在路径前后的两个双引号都须要写成/" 。

  (3)--service参数示意以windows服务的形式运行,--r指明svn repository的位置,service参数与r参数都作为binPath的一部分,因此与svnserve.exe的路径一起被包含在一对双引号当中,而这对双引号不须要执行 转义。

  (4)displayname示意在windows服务列表中显示的名字, depend =Tcpip 示意 svnserve服务的运行须要 tcpip服务,start=auto示意开机后自动运行。安装服务后,svnserve要等下次开机时才会自动运行。

  (5)binPath的等号前面无空格,等号后面有空格 displayname depend start也都一样 service前面是--,不是- ,而r前面是-

  (6)若要卸载svn服务,则执行 sc delete svnserve 即可。

  (7)从”r;sc”到”r;auto”是在同一个命令sc,必须写在同一行。 建立成功后,能够在运行中键入service.msc察看系统服务,找到SVNService项,查看这项服务的属性,能够运用 Windows提供的界面操作SVNService服务了。

  也能够运用命令行启动、停止服务。

  •   启动服务: C:/>net start svnservice  服务正在启动 . SVNService 服务已经启动成功。 最后面的是服务名

  •   停止服务: C:/>net stop svnservice  服务正在停止. SVNService 服务已成功停止。

  删除建立的服务 C:/>sc delete svn svnservice

 

 

 

===========================配置apache通过http访问svn===========================================================================

 1. 引言

2. 安装过程

2.1. 安装Apache

2.2. 安装Subversion

2.3. 配置

2.4. 使用SSL来保护你的服务器

 

摘要

本文是TortoiseSVN1.3.5帮助中关于配置服务器一节的翻译,根据行文需要做了一些调整与增减。英文原文参见TortoiseSVN1.3.5帮助的3.1. Apache Based Server。

要使用TortoiseSVN(或者其它的Subversion客户端),你要有一个存放版本库的地方。你可以将版本库存放在本机,使用file://协议来访问,也可以将它们放在一个

服务器上,使用http://或svn://协议来访问。两种服务器协议(http://和svn://)也可以被加密成https://及svn+ssh://。下面将一步一步地为你展示如何在windows上配置

这样一个服务器。

如果你没有服务器或者你只想单独地工作,那么将版本库存放在本机并使用file://协议来访问是你最好的选择,这样的话,你可以略过本文。

注:目前windows下的subversion有专门的for apache2.2.x版本,可以跟Apache2.2.x配合,不过本文所带的附件只在Apache2.0.x上测试过

 

1. 引言

在所有的Subversion服务器配置方式中,基于Apache的是最灵活的。虽然配置起来有一点点复杂,但是它提供了其它方式所没有的好处:

WebDAV

基于Apache配置的Subversion服务器使用了被许多其它程序支持的WebDAV协议。举个例子,你可以在Windows的资源管理器中将这样的一个版本库挂载成一个

”r;Webfolder”,然后像文件系统中的其它文件夹一样访问它。

浏览版本库

你可以在不安装Subversion客户端的情况下,使用浏览器来浏览版本库中的内容。这将使得更大范围的用户可以访问你的数据。

用户验证

你可以使用任何Apache支持的验证机制,包括SSPI和LDAP。

安全

Apache是非常的稳定和安全,因此你的版本库自然而然地拥有同样的安全性。包括SSL加密。

 

2. 安装过程

2.1. 安装Apache

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

警告:请注意,没安装Service Pack 1的Windows XP将导致错误的网络数据从而破坏你的版本库!

从http://httpd.apache.org/download.cgi最新版本的Apache Web服务器。确保你下载的版本大于2.0.54。2.0.54版本的Apache将不能与Subversion 1.3.xx配合工作。而且,小于2.0.54的Apache也因为在windows上的编译存在一个bug而导致不能与subversion1.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就安装成功了。

警告:

如果你将Apache安装成一个服务,它将以本地system帐户来运行。为Apache创建一个单独的用户来运行它将会更安全一些。

请确保运行Apache的用户有版本库的完全访问权限(右键版本库目录->属性->安全)。要不然,用户将无法提交他们的更改。

就算Apache以本机system来运行,你也要设置它能完全读写版本库目录。

如果没有为Apache配置这个许可,用户将会得到"禁止访问"的错误信息,在Apache的错误日志中表现为错误500。

 

注意:

  • 安装的不是apache_tomcat,是apache。因为前者不全,缺少一些模块和配置文件。

  • 如果机器上配置了iis或tomcat,一定要先停止或修改掉80端口,否则会因冲突而无法启动。

 

2.2. 安装Subversion

从http://subversion.tigris.org/ser ... entList?folderID=91(英文)

http://bbs.iusesvn.com/forum-7-1.html(中文)下载最新版本的Subversion。

运行Subversion安装程序,如果安装程序能够识别你已经安装了Apache,那么你的安装基本上就OK了。如果它不能,那么你要做一些额外的步骤。

注:如果你先安装Apache,再安装Subversion,正常情况下下面的工作(2.3配置前)Subversion安装程序已经帮你完成了

使用资源管理器,

  • 进入Subversion的安装目录(通常为c:/program files/Subversion),

  • 找到文件httpd/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

 

2.3. 配置

现在,你已经安装了Apache和Subversion,但是Apache还不知道如果处理像TortoiseSVN一样的Subversion客户端。要让Apache知道哪个URL将被Subversion使用,

你要像下面这样

 

编辑Apache的配置文件(通常在c:/program files/apache group/apache2/conf/httpd.conf):

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

 

<Location /svn> 域名后的访问路径

DAV svn

SVNParentPath "E:/svnroot"   是库的上一级目录,比如库在E:/svnroot/java-source,那么父目录就是"E:/svnroot"

AuthType Basic

AuthName "Subversion repositories"

AuthUserFile "C:/Program Files/Apache Software Foundation/Apache2.2/bin/passwd"  用Apache2.2/bin/htpasswd -c passwd 用户名生成的认证文件,密码经md5加密

AuthzSVNAccessFile "E:/svnroot/java-source/conf/authz"  访问权限使用svn的权限文件,在调试阶段可注释掉

#AuthzSVNAccessFile "E:/svnroot/dotnet-source/conf/authz"

#AuthzSVNAccessFile "E:/svnroot/vc-source/conf/authz"             我试过了,像这样配置多个权限文件是不可以的,同一时间只能有一个

Require valid-user    访问权限启用,在调试阶段可注释掉

#Satisfy Any              调试阶段使用这句代替上面一行

</Location>

 

如果是多个库就一定要有多个location,如下

<Location /svn1>

DAV svn

SVNParentPath "E:/svnroot"

AuthType Basic

AuthName "Subversion repositories"

AuthUserFile "C:/Program Files/Apache Software Foundation/Apache2.2/bin/passwd"

AuthzSVNAccessFile "E:/svnroot/java-source/conf/authz"

Require valid-user

</Location>

 

<Location /svn2>

DAV svn

SVNParentPath "E:/svnroot"

AuthType Basic

AuthName "Subversion repositories"

AuthUserFile "C:/Program Files/Apache Software Foundation/Apache2.2/bin/passwd"

AuthzSVNAccessFile "E:/svnroot/dotnet-source/conf/authz"

Require valid-user

</Location>

 

<Location /svn3>

DAV svn

SVNParentPath "E:/svnroot"

AuthType Basic

AuthName "Subversion repositories"

AuthUserFile "C:/Program Files/Apache Software Foundation/Apache2.2/bin/passwd"

AuthzSVNAccessFile "E:/svnroot/vc-source/conf/authz"

Require valid-user

</Location>

可以看到,如果多个库,那么需要不同的上下文,使用相同的上下文的话只有最后一个起作用。

权限文件和口令文件可以指向不同的或者是同一个。

 

注意:

所有参数一定要加双引号,否则会报错。

 

  • AuthUserFile : Apache2.2/bin/htpasswd -c passwd songyc      会提示输入两次口令

查看passwd内容:

songyc:$apr1$GsZgx4UC$QDf1cgNn2E3ZoJJDVeQMe.

 

  • AuthzSVNAccessFile:E:/svnroot/java-source/conf/authz

查看authz内容:

[aliases]

# joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Average

[groups]

admin_group=admin,tangzhigang,songyc

java_group=admin,wangyc,zhaoyue,yanjian,songyc

dot_group=admin,wangyou,luochunlin,liufujian,wangyongkui,songyc

others_group=admin,zhanghuan,caiyujie,suping,zhoujianfeng,test,songyc

[java-source:/]

@java_group = rw

* = r

# [/foo/bar]

# harry = rw

# &joe = r

# * =

# [repository:/baz/fuz]

# @harry_and_sally = rw

# * = r

 

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

要创建passwd文件,可以打开命令行(DOS窗口),将当前目录切换到apache2目录(通常为c:/program files/apache group/apache2),然后打入以下命令以创建文件:

bin/htpasswd -c passwd <username>

此命令执行bin目录下的htpasswd.exe来创建一个密码文件,重启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

限定用户只有输入正确的用户名及密码后才能访问这个路径

上面的配置仅仅是一个简单的示例。你还可以对Apache进行许许多多的配置。

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

Require valid-user

改为

 <LimitExcept GET PROPFIND OPTIONS REPORT>

Require valid-user

</LimitExcept>

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

#AuthzSVNAccessFile D:/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

2.4. 使用SSL来保护你的服务器

以上的工作已经可以让你的svn服务器正常工作了。

如果你要更安全一些,可以配置ssl来保护你的服务器。

因为美国出口限制,默认安装的Apache服务器不支持SSL。但是你自己可以很容易地在其它地方下载到所需要的模块,然后安装它。

首先你需要SSL的必需文件。你可以http://hunter.campbus.com/或这里找到相应的软件包

然后只要将包解开将其中的mod_ssl.so拷到Apache的modules目录、openssl.exe、libeay32.dll、ssleay32.dll拷到bin目录、conf/ssl.conf拷到conf目录。

在Apache的conf目录中用文本编辑器打开ssl.conf。

将下面这些行用#注释掉:

然后只要将包解开将其中的mod_ssl.so拷到Apache的modules目录、openssl.exe、libeay32.dll、ssleay32.dll拷到bin目录、conf/ssl.conf拷到conf目录。

在Apache的conf目录中用文本编辑器打开ssl.conf。

将下面这些行用#注释掉:

修改 SSLCertificateFile conf/ssl.crt/server.crt

为 SSLCertificateFile conf/ssl/my-server.cert

修改 SSLCertificateKeyFile conf/ssl.key/server.key

为 SSLCertificateKeyFile conf/ssl/my-server.key

修改 SSLMutex file:logs/ssl_mutex

为 SSLMutex default

删除以下两行(如果有): <IfDefine SSL>

</IfDefine>

打开Apache配置文件(httpd.conf),去掉这行的注释 #LoadModule ssl_module modules/mod_ssl.so

Openssl需要一个配置文件。你可以从这里下载一个可工作的版本Openssl需要一个配置文件。你可以从这里下载一个可工作的版本http://tud.at/programm/openssl.cnf

 

将它保存到bin/openssl.cnf。

下面你要创建一个SSL证书。你可以打开一个命令行窗口,然后cd到Apache安装目录(比如C:/program files/apache group/apache2),敲入以下命令: bin/openssl req -config bin/openssl.cnf -new -out my-server.csr

你将被问及一句口令短语。请注意,不要使用简单的几个词,而应该输入一整个句子,比如一篇诗词的一部份,越长越好。同样,你还要输入你的服务器URL。然后

其它的问题都是可选问答的,不过我建议你也将它们填充。

下一步,敲入以下命令: bin/openssl rsa -in privkey.pem -out my-server.key

以及(注意,只有一行) bin/openssl x509 -in my-server.csr -out my-server.cert -req -signkey my-server.key -days 4000

这样将创建一个4000天后才过期的证书。最后敲入: bin/openssl x509 -in my-server.cert -out my-server.der.crt -outform DER

这些命令在Apache目录下创建了一些文件(my-server.der.crt, my-server.csr, my-server.key, .rnd, privkey.pem, my-server.cert)。将这些文件拷贝到目录conf/ssl

(比如C:/program files/apache group/apache2/conf/ssl),如果目录ssl不存在,你必须先创建一个。

重启Apache服务。

现在可以用类似这样的url来访问你的版本库了https://servername/svn/project

强制通过SSL来访问

当你配置了SSL来提高版本库安全时,你可能想禁用无SSL的http访问方式,而只允许通过https访问。要达到这种效果,你要在<Location>块加入另外一个指示器SSLRequireSSL。

一个示例<Location>块可能像这样:

<Location /svn>

DAV svn

SVNParentPath D:/SVN

SSLRequireSSL

AuthType Basic

AuthName "Subversion repositories"

AuthUserFile passwd

#AuthzSVNAccessFile svnaccessfile

Require valid-user

</Location>

 

 

注意:

如果遇到apache无法启动的情况,可以用/$apache_home/bin/httpd -t 检查httpd.conf是否存在语法错误

如果遇到浏览器访问报forbidden,提示无访问权限时,需检查”r;SVNParentPath”,看是否指向的是库的上一级目录

 

 

 

 

 

1、创建库

E:/svnroot>svnadmin create java-source-bak

 

 

2、创建钩子脚本

E:/svnroot/java-source-bak/hooks>svnsync init file:///e:/svnroot/java-source-bak  http://10.150.132.140/svn1/java-source

svnsync: 此版本库不允许修改版本属性;请管理员创建 pre-revprop-change 钩子

 

新的版本库中找到hooks文件夹,在里头创建pre-revprop-change.bat钩子脚本

       如:e:/svnroot/hooks/pre-revprop-change.bat

如果不建这个空的pre-revprop-change.bat会报"svnsync:此版库不允许修改版本属性;请管理员创建pre-revprop-change钩子!

 

3、初始化

E:/svnroot/java-source-bak/hooks>svnsync init file:///e:/svnroot/java-source-bak

 http://10.150.132.140/svn1/java-source

认证领域: <http://10.150.132.140:80> Subversion repositories

”r;server”的密码: *****                            这是系统用户的口令

认证领域: <http://10.150.132.140:80> Subversion repositories

用户名: songyc                                     版本库的用户

”r;songyc”的密码: *****                           版本库用户的口令

复制版本 0 的属性。

运行成功则会提示:复制版本 0 的属性

 

4、执行同步

E:/svnroot/java-source-bak/hooks>svnsync sync file:///e:/svnroot/java-source-bak

认证领域: <http://10.150.132.140:80> Subversion repositories

”r;server”的密码: *****

认证领域: <http://10.150.132.140:80> Subversion repositories

用户名: songyc

”r;songyc”的密码: *****

传输文件数据.

已提交版本 1。

复制版本 1 的属性。

已提交版本 2。

复制版本 2 的属性。

传输文件数据.....................

 

 

这样我已经成功使用svnsync同步库了。

  • 如果linux则用crontab创建自动同步的任务

  • 如果是windows,则可创建一个bat 然后建一个任务计划

5、定时任务:

添加到任务计划里

开始-->程序-->附件-->系统工具-->任务计划,设置为系统启动时运行

 

 

 

svn 命令行

 

取版本库项目(最新)

1、先清空目录

E:/test_svn_oper>rmdir /s /q data_mapping

2、取出工程

E:/test_svn_oper>svn checkout --username songyc --password ehong svn://10.150.132.140/java-source/data_mapping

 

给程序修订版打标记(基线)

通常版本控制软件都有实现打基线的功能。

而SVN又是如何来打基线呢,

其实SVN天生就可以根据一个修订版本号检出一个特定的修订版本,只不过如果你不嫌麻烦你可以用一个excel记录一下你当前发布程序时其主目录对应的修订号。

这样在需要的时候可以根据这个修订号把当时的文档检出来。

但是通常在SVN上打基线还是通过”r;分支/标记”功能来实现的,在ecplise中的实现方式如下:

1。点击"window->Open Perspective",选择"SVN资源库研究"。

2。在界面左边部分的”r;SVN资源库”中选择要打基线的项目的根目录,右击鼠标,在弹出的菜单中选择”r;分支/标记”。

3。在”r;到URL”中填写你要把其基线打在什么目录,一般要改成其它目录,然后点击确定即可。

这样操作后其实是产生了一个分支,这个过程并不耗费SVN服务器的存储空间,因为其只是类似于物理链接的方式创建了了个对应于当前修订版本的链结,所以我们

可以每发一个版本就打一次基线而不用担心SVN空间被耗光。

在下次需要用到该基线的时候只要把SVN中我们在上面第三步中填写在”r;到URL”目录检出即可。

但是基线是不能修改的,体现在SVN中就是你从基线目录中检出的文件如果做了修改,再提交就变成了一个于原先项目不同的分支版本。

 

修改个别文件也要起一个新的目录(新的基线)么?

 

按标记(基线)取某一程序

 

 

 

 

 

1、获取svn项目

 

1.1 取版本库最新的

C:/Documents and Settings/server>svn checkout --username songyc --password ehong svn://10.150.132.140/java-source/data_mapping songyc ehong

A    ehong/java-source/ehongWebservice

A    ehong/java-source/ehongWebservice/.classpath

A    ehong/java-source/ehongWebservice/webapps

A    ehong/java-source/ehongWebservice/webapps/META-INF

A    ehong/java-source/ehongWebservice/webapps/META-INF/MANIFEST.MF

A    ehong/java-source/ehongWebservice/webapps/SOAPMonitorApplet.java

A    ehong/java-source/ehongWebservice/webapps/happyaxis.jsp

 

注意svn checkout 的一些参数

--revision (-r) REV,

--quiet (-q),

--non-recursive (-N),

--username USER,

--password PASS,

--no-auth-cache,

--non-interactive,

--config-dir DIR

 

1.2 按修订版取

 svn checkout -r   修订版字符串  --username songyc --password ehong svn://10.150.132.140/java-source songyc ehong

 

2、添加目录或文件

将工作副本中的文件/目录添加到存储库中:svn add

在您第一次在工作目录中创建并编辑新文件后,可以将此文件添加到存储库中,或添加一个目录,目录中有无内容均可。

 

svn add FILENAME/DIR

这样就会在您的工作副本中添加文件/目录,并安排它们以添加到存储库中。您下次提交时,会上载这些文件/目录,并将它们添加到存储库中。

如果您添加了内容,但在提交前又改变了主意,则可以使用 svn revert 取消添加内容的安排。

 

转换:--targets FILENAME, --non-recursive (-N), --quiet (-q), --config-dir arg, --auto-props, --no-auto-props

请参见添加文件/目录示 例。

 

查看带有修订和作者信息的特定文件的内容:svn blame

若要在线查看指定文件的作者和修订信息,请键入:

svn blame FILENAME

每行文本的开始处都以上次更改该行的作者(用户名)和修订版本号作为批注。

转换:--revision (-r) REV, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

查看特定文件的内容:svn cat

有时,与存储库相比较,您的工作副本可能已过时;或者您可能已修改了本地工作副本。在这些情况下,在提交更改或决定编辑您的工作副本之前,您会 希望查看指定文件的内容差异。运行 svn cat FILENAME 将自动从存储库中取出 HEAD 修订版本。这条子命令主要用于检索具有较旧修订版本号的文件,并将其显示在屏幕上。通过在此站点上浏览项目源代码,也可以执行相同的操作。

转 换:--revision (-r) REV, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

 

$svn add(添加一个目录或文件。用法:先建一个文件或目录,取名字为foo 然后

  执行这个命令$svn add foo <foo为文件或目录>)

 

3、清理工作副本

名称

svn cleanup &emdash; 递归清理工作拷贝。

概要

svn cleanup [PATH...][/pre]描述

递归清理工作拷贝,删除未完成的工作拷贝锁定,并恢复未完成的操作。如果你得到一个”r;工作拷贝已锁定”的错误,运行这个命令可以删除无效的锁定,让你的工作拷贝再次回到可用的状态。

如果,因为一些原因,运行外置的区别程序(例如,用户输入或是网络错误)有时候会导致一个svn update失败,使用--diff3-cmd选项可以完全清除你的外置区别程序所作的合并,你也可以使用--config-dir指定任何配置目录,但是你应该不会经常使用这些选项。

别名

改变

工作拷贝2

是否访问版本库

选项

--diff3-cmd CMD

--config-dir DIR

[/pre]例子

svn cleanup没有输出,没有太多的例子,如果你没有传递PATH,会使用”r;.”。

$ svn cleanup

 

 

4、复制工作副本或存储库中的文件或目录

复制工作副本或存储库中的文件或目录:svn copy

在项目中,您可能需要用到过去的旧文档。例如,您可能想要使用一个已存在的 HTML 文件,使用其代码作为参考以在创建新内容时保持产品外观和感觉。创建文件时,您无需从头开始,只需使用 svn copy 复制此文件,然后将其另存为其它名称并更改其内容。您可以从存储库将文件复制为本地工作副本,也可以将本地工作副本复制回存储库文件。您还可以在本地工作 副本内部复制文件。Subversion 不支持在存储库之间进行复制。可使用 svn copy SRC DST 完成此操作。

转换:--message (-m) TEXT, --file (-F) FILE, --revision (-r) REV, --quiet (-q), --username USER, --password PASS, --no-auth-cache, --non-interactive, --force-log, --editor-cmd EDITOR, --encoding ENC, --config-dir DIR

请参见 svn copy。

$svn copy (复制。用法:$svn copy foo.c index.c)

 

 5、 从本地工作副本中删除文件或目录,当提交时,才会在存储库中将该文件实际删除

从本地工作副本中删除文件或目录:svn delete

您可能希望从本地工作副本中删除不需要的文件。使用 svn delete FILENAME 可安排删除文件。仅当您提交时,才会在存储库中将该文件实际删除。

转换:--force, --force-log, --message (-m) TEXT, --file (-F) FILE, --quiet (-q), --targets FILENAME, --username USER, --password PASS, --no-auth-cache, --non-interactive, --editor-cmd EDITOR, --encoding ENC, --config-dir DIR

 

$svn delete(删除一个目录或文件。

用法:$svn delete foo   <foo为文件或目录>)

 

 

6、查看文件之间的差异

查看文件之间的差异:svn diff

可以使用 svn diff 显示工作副本中的指定文件相对于存储库中相应文件所做的本地修改。在命令提示符处,请键入:

svn diff (文件的路径) (项目存储库的 URL)

例如,若要将本地修改后的文件”r;index.html”与项目存储库中的相应文件进行比较,请键入:

svn diff $SRC/...../index.html https://(项目名称).(域)/svn/(项目名称)/trunk (项目名称) --username [在此处输入用户名]

除此之外,您也可以转到该文件所属的目录,并键入:

svn diff (FILENAME)

该命令将显示差异,并且带有修订版本号。

转换:--revision (-r) REV, --old OLD-TARGET, --new NEW-TARGET, --extensions (-x) "ARGS", --non-recursive (-N), --diff-cmd CMD, --notice-ancestry, --username USER, --password PASS, --no-auth-cache, --non-interactive, --no-diff-deleted, --config-dir DIR

请参见检查历史、svn diff。

 

7、在本地计算机上导出空目录树

在本地计算机上导出空目录树:svn export

在您的本地计算机上,可以从项目存储库或本地工作副本内部提取一个无版本的副本,也称为空目录树。若要从存储库中获得较旧修订版本的空目录,请 键入:

svn export [-r REV] [PATH]

该命令将从 URL 指定的存储库中的修订版本 REV 位置(如果指定,否则从 HEAD 位置)将空目录树导出到 PATH。如省略 PATH,则该 URL 的最后一部分将用作本地目录名称。除此之外,您也可以在本地计算机内部,从一个工作副本(由 PATH1 指定)向另一工作副本(由 PATH2 指定)导出空目录树。这将保留所有的本地更改,但不会复制版本控制中的文件。若要执行此操作,请键入:

svn export PATH1 PATH2

转换:--revision (-r) REV, --quiet (-q), --force, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

获取有关 Subversion 的帮助:svn help

 

Subversion 可以在命令行界面为您提供帮助。

 

8、若要获得有关特定子命令的帮助,

svn help [SUBCOMMAND...]

转换:--version, --quiet (-q)

将您的更改提供给 SVN 存储库

对文件和/或目录进行本地更改后,您必须向 SVN 存储库提交这些更改。

 

9、提交更改

若要向共享存储库提交您的更改,请键入:

svn commit

加备注提交

svn commit -m "请在此处键入您的理由"

如果您不包括对该文件更改的描述,系统将提示您调用文件编辑器添加描述,然后 svn 才能完成提交操作;否则将会出现”r;提交失败”错误。所有的提交都会被自动记录,并发布到项目的提交讨论中。

转换:--message (-m) TEXT, --file (-F) FILE, --quiet (-q), --non-recursive (-N), --targets FILENAME, --force-log, --username USER, --password PASS, --no-auth-cache, --non-interactive, --encoding ENC, --config-dir DIR

请参见提 交您的更改、editor-cmd。

 

10、将无版本的文件或树导入到项目存储库中

svn import

您可以使用 svn import 将无版本的文件或树递归提交到项目存储库中。将根据需要在存储库中创建父目录。使用下面的命令可以从 PATH 向 URL 递归提交副本。如果省略 PATH,将认为其为”r;.”。

svn import [PATH] URL

示例:若要在您的本地计算机上创建带有一个文件的无版本目录 (D)。请点击项目左侧导航窗格中的”r;Subversion”链 接,找到 Subversion 页面。请注意,”r;浏览源代码”下未列出 NEWDIR。若要将 D 导入项目存储库,请键入:

svn import -m "请在此处键入您的信息" D http://(项目名称).(域)/svn/(项目名称)/NEWDIR

刷新该页面。请注意,此时”r;浏览源代码”下列出了 D。点击 D 查看该文件。

转换:--message (-m) TEXT, --file (-F) FILE, --quiet (-q), --non-recursive (-N), --username USER, --password PASS, --no-auth-cache, --non-interactive, --force-log, --editor-cmd EDITOR, --encoding ENC, --config-dir DIR, --auto-props, --no-auto-props

 

11、打印有关工作副本中文件的具体信息

svn info

有时,您将需要有关工作副本中文件的具体信息,以执行某些子命令。键入 svn info,将打印出详尽且有用的信 息,这些信息涉及工作副本中的工作副本路径中的项,其中包括:路径、名称、URL、修订版本、节点类型、上次更改、作者、上次更改修订版本、上次更改日 期、上次更新的文本、上次更新的属性以及校验和。

转换:--targets FILENAME, --recursive (-R), --config-dir DIR

 

12、储库中的目录项列表

svn list

在开始处理项目或取出”r;工作副本”之前,您可能希望查看项目存储库中的内容(即目录和文件),或查看本地工作副本中的目录项。在命令提示符处键 入 svn list [TARGET...],也可以查看这些内容。除此之外,您也可以找到项目中的”r;软件 配置管理”页,查看项目存储库。

转换:--revision (-r) REV, --verbose (-v), --recursive (-R), --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

 

13、查看提交日志信息

svn log

如果要查看”r;工作副本”或存储库中文件/目录的各个文件/目录历史,以跟踪修订信息,请键入:

svn log [PATH]

该命令会显示出文件/目录的修订信息,从最近所做的修订版本开始显示提交信息和作者姓名等信息。除此之外,您也可以使用该站点,查看项目存储库 中各个文件的提交日志信息。请点击项目左侧导航窗格中的”r;Subversion”链接。将出现 Subversion 页。搜索”r;浏览源代码”的目录中的文件,然后点击文件名。这时将会显示一个提交日志信息页面。

转 换:--revision (-r) REV, --quiet (-q), --verbose (-v), --targets FILENAME, --stop-on-copy, --incremental, --xml, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

请参见 svn log。

 

14、合并更改

svn merge

您可以运行 svn merge 命令,以指示 Subversion 将存储库中最新版本的文件合并到您的工作副本中。

转换:--revision (-r) REV, --non-recursive (-N), --quiet (-q), --force, --dry-run, --diff3-cmd CMD, --ignore-ancestry, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

请参见 svn merge、解 决冲突(合并其他人的更改)、分支和合并:常见合并使用案例、合 并最佳实践。

使用存储库

 

15、创建新目录

svn mkdir

若要在您的工作副本中创建新目录,请键入:

svn mkdir PATH

若要在您的项目存储库中创建新目录,请键入:

svn mkdir URL

PATH 或 URL 的最后一部分决定目录名称。在立即提交时在存储库中创建目录,所以还需要一条提交信息

转换:--message (-m) TEXT, --file (-F) FILE, --quiet (-q), --username USER, --password PASS, --no-auth-cache, --non-interactive, --editor-cmd EDITOR, --encoding ENC, --force-log, --config-dir DIR

 

16、移动文件或目录

svn move

您可以使用 svn move SRC DST 在工作副本或项目存储库内部移动文件或目录。此命令等效于在使用 svn copy 后,再使用 svn delete。在工作副本内部移动文件或目录,不仅会移动该文件或目录,而且 还将安排它以便于下次提交时进行添加。在项目存储库内部移动文件或目录属于封闭单元式提交,所以需要一条提交信息。

转换:--message (-m) TEXT, --file (-F) FILE, --revision (-r) REV, --quiet (-q), --force, --username USER, --password PASS, --no-auth-cache, --non-interactive, --editor-cmd EDITOR, --encoding ENC, --force-log, --config-dir DIR

使用属性

Subversion 具有很多具体属性,这些属性影响或决定其行为。您可以修改、提交和撤消属性更改,就像对文件内容所执行的操作一样。您还可以从本地工作副本或

项目存储库的 文件、目录或修订版本中,删除、编辑、打印、列出以及设置属性。

请参见 属性、无 版本属性、元数据属性、svn propdel、svn propedit、svn propget、svn proplist、svn propset、Hook 脚本。

 

解决冲突:svn resolved

更新本地工作副本时,可能会遇到冲突。您需要解决此冲突。解决冲突后,键入 svn resolved PATH..., 通知工作副本该冲突已”r;解决”。

转换:--targets FILENAME, --recursive (-R), --quiet (-q), --config-dir DIR

请参见解 决冲突(合并其他人的更改)。

 

 

17、撤消您的更改

svn revert

使用 Subversion 时,您会发现 svn revert PATH... 等效于 Windows 中的 Ctrl Z。您可以:

撤消本地工作副本中的任何本地更改,从而解决冲突状态。

撤消工作副本中的条目内容及属性更改。

取消任何进度安排操作,如添加文件、删除文件等。

注意,如不提供目标,会导致工作副本中的更改丢失。

转换:--targets FILENAME, --recursive (-R), --quiet (-q), --config-dir DIR

 

18、获取文件/目录的状态

svn status

在版本控制中,将更改提交到项目存储库之前最好对其进行审查。可以运行 svn status 打印工作副本中的文件和目录的状态。打印结果为八列编码输出。由于每列都有详尽的图例,若要从此输出中得出”r;无错误”的结论几乎不可能。若要使此任务更加 简单,并同时可看到示例,请在命令提示符处键入 svn help status。

转换:--show-updates (-u), --verbose (-v), --non-recursive (-N), --quiet (-q), --no-ignore, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir

请参见检 查你的更改。

 

转换工作副本:svn switch

可以使用 svn switch URL [PATH] 更新工作副本,以镜像新的 URL。您还可以将工作副本或部分工作副本移动到新的分支。您可以将此子命令用作分支的快捷方式。

转换:--revision (-r) REV, --non-recursive (-N), --quiet (-q), --diff3-cmd CMD, --relocate, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

请参见转换工作副 本、分支和合并以 及 svn switch。

 

更新工作副本:svn update

为了进行更好的版本控制,建议您每天用项目存储库更新本地工作副本,请使用:

svn update [PATH...]

列出的已更新条目以及它们的当前状态显示如下:

A = 已将一个文件添加到您的工作副本中。

U = 已更新您的工作副本中的一个文件。

D = 已从您的工作副本中删除一个文件。

R = 已替换您的工作副本中的一个文件。

G = 已成功合并了一个文件。

C = 一个文件已合并了必须手动解决的冲突

转换:--revision (-r) REV, --non-recursive (-N), --quiet (-q), --diff3-cmd CMD, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

请参见更 新你的工作副本、手 动合并冲突。

分支和标记

项目的主干通常用作开发主线,而分支通常用作主线的变更。分支是正在进行的开发线。在软件开发生命周期中,如果软件产品的发布版本已到期,经常 会用到分支,使测试者可以使用候选版本,使新的开发可以继续进行,不受测试的约束。分支还用于实验性工作,以及完成代码重写。标记是将一组文件修订版本标 记为整体的方式。虽然分支和标记都是使用 svn copy 子命令创建的,但它们是完全不同的。分支表示多个修订版本而标记只表示单个修订版本。

本站点上您项目的 Subversion 存储库支持对您的源文件进行分支和标记。对于 Subversion 来说,标记和分支属于简单实用的”r;复制”操作。

若要创建分支或标记项目文件,请键入:

svn copy SRC DST -m "在此处键入您的信息"

 

 

 

常见问题

所有客户端:

1, 为什么客户端无法提交,报告需要"clean up"的错误。

Subversion客户端在提交内容之前会在本地的工作拷贝写日志,防止其他客户端再次作操作,如果这个提交过程中发生错误,就会存在未清理的日志,解决这个问题只需要运行清理命令。

如果是使用svn命令行客户端,只需要在待清理的目录或其父目录执行"svn cleanup",如果是TortoiseSVN,只需要在目录或其父目录执行"右键->TortoiseSVN->CleanUp"。

2,为什么添加的文件,别人看不到,版本库里也没有?

最可能的原因是,你用svn add(如果是TortoiseSVN可能是”r;右键->TortoiseSVN->Add...”)添加某个文件,只是在本地注明某个文件是预定要增加,而没有实际添加到版本库,要添加到版本库必须执行svn commit(如果是TortoiseSVN可能是”r;右键->svn commit...”)。

同样的,svn delete要实际发生效果也需要svn commit。

3. Subversion有共享功能吗?

这是很多人问得问题,就是一份代码能否影射到多个地方,在一个地方提交,另一个地方更新的时候也能看到。

我想Subversion只是部分支持这个功能。一个方式是外部引用,具体看http://subversion.org.cn/svnbook/1.1/svn-ch-7-sect-3.html ,可以实现目录的共享,不能用于文件。

另一种方式是硬链接,工作拷贝必须是类UNIX系统下才能用,类似于UNIX的链接功能。

4. Subversion有VSS一样的锁定功能吗?

答案是有,通过给需要锁定的文件增加svn:needs-lock锁定即可,详细内容见svnbook。

http://www.subversion.org.cn/svn ... .special.needs-lock

 

5.状况是这样的,已经修改到版本1284了,但是中间有个1113版本的提交导致更新失败,需要将1113的修改恢复过来,就是去掉1113版本做的所有修改,

但是保留1114以及以后的所有修改,重新做一次build,然后发布。我用什么方法,在取代码的时候,把这个V1113屏蔽掉呢??

 

知道合并吗,取消某个版本的操作就是反向合并,在你的工作拷贝执行下面的命令。

svn merge -c -1113

 

6.如果是撤消1113,1114,1115版本的话,是不是分别执行svn merge -c -1113,svn merge -c -1114,svn merge -c -1115呢?

svn merge -c 1113,1114,1115就可以

运行svn help merge,就会很清楚

 

整体思路:

先有版本库

当有稳定的版本后创建标记库,就是将版本库文件复制一份,这个标记库是日后需要维护的基线库。

之后的修改仍是在版本库进行,测试时将所修改的版本与标记库融合merge,如果测试失败执行反向融合,这样不会伤及基线库

 

具体实现:

1、取项目

 svn checkout -r   修订版字符串  --username songyc --password ehong svn://10.150.132.140/java-source songyc ehong

 

2、复制一份作为标记库

改用分支实现

 

E:/test_svn_oper>svn cp svn://10.150.132.140/java-source/data_mapping/  svn://10.150.132.140/java-source/data_mapping/branches/ 20100806_shawn_test_branch &endash;m "create a branch"

svn: 不能在源中混合版本库和工作副本

 

怀疑是因为版本库中还没有创建branches目录,于是先创建

E:/test_svn_oper>svn mkdir svn://10.150.132.140/java-source/data_mapping/branches

svn: 无法使用外部编辑器获得日志信息;考虑设置环境变量 $SVN_EDITOR,或者使用 --message (-m) 或 --file (-F) 选项

svn: 没有设置 SVN_EDITOR,VISUAL 或 EDITOR 环境变量,运行时的配置参数中也没有 ”r;editor-cmd” 选项

 

E:/test_svn_oper>svn copy svn://10.150.132.140/java-source/data_mapping 20100806_shawn_test_branch -m "create a branch"

svn: 本地操作,非提交操作无须日志信息或版本属性

 

 

可以通过eclipse创建标记或分支,操作很简便。

现在的问题是如何对branch进行版本融合?并取出

 

3、修改某两个文件并更新,提交

 

4、将新版本与标记库中的文件融合

 

5、反向融合其中一个文件

 

6、取出标记库文件

 

7、执行ant脚本打包

 

 

 

 

E:/test_svn_oper/project_co/data_mapping>svn copy svn://10.150.132.140/java-source/Showcase/ svn://10.150.132.140/java-source/trunk  -m "create trunk"

提交后的版本为 788。

 

E:/svnroot>dir

 驱动器 E 中的卷是 work

 卷的序列号是 A876-7349

 E:/svnroot 的目录

2010-08-03  09:51    <DIR>          .

2010-08-03  09:51    <DIR>          ..

2010-03-16  10:58    <DIR>          dotnet-source

2010-03-16  10:58    <DIR>          EhongDocument

2010-03-16  10:58    <DIR>          java-source

2010-08-03  09:04    <DIR>          java-source-bak

2010-03-16  10:58    <DIR>          private

2010-08-03  09:51                47 svn_sync.bat

2010-05-10  10:16    <DIR>          vc-source

               1 个文件             47 字节

               8 个目录 16,272,773,120 可用字节

E:/svnroot>cd java-source

E:/svnroot/java-source>svn update

跳过”r;.”

E:/svnroot/java-source>

 

svn add必须在本地副本中执行,否则就会报下面的错误

E:/svnroot/java-source>svn add -N branches svn://10.150.132.140/java-source/

svn: ”r;.”不是工作副本

svn: 不能打开文件”r;.svn/entries”: 系统找不到指定的路径。

 

 

 

 

 

E:/test_svn_oper/project_co/branches>svn list svn://10.150.132.140/java-source

CompressFrameWork/

Showcase/

branches/

data_mapping/

ehongWS/

ehongWebservice/

esiExample/

esiapidemo/

esiapigwt/

generator/

gwtframework/

java_persistent/

physician_guidance/

tags/

trunk/

 

 

E:/test_svn_oper/project_co/branches>svn status

?      my-showcase-branch

 

 

E:/test_svn_oper/project_co/branches>svn update

版本 789。

 

E:/test_svn_oper/project_co/branches>svn --help import

 

E:/test_svn_oper/project_co/branches>svn import -m "test" my-showcase-branch svn://10.150.132.140/java-source/branches

增加           my-showcase-branch/war/showcase/deferredjs/B5CFCA6C372D6E83BDA4774483936248/28.cache.js

增加           my-showcase-branch/war/showcase/deferredjs/B5CFCA6C372D6E83BDA4774483936248/38.cache.js

增加           my-showcase-branch/war/showcase/deferredjs/B5CFCA6C372D6E83BDA4774483936248/2.cache.js

增加 (二进制)  my-showcase-branch/war/showcase/EDC7827FEEA59EE44AD790B1C6430C45.cache.png

增加 (二进制)  my-showcase-branch/war/favicon.ico

增加           my-showcase-branch/README.txt

增加           my-showcase-branch/build.xml

提交后的版本为 790。

语法:

svn import -m "备注" 本地目录 svn://远程目录/a/b/c

远程库下的目录不用存在,会自动递归创建

 

 

 

--------------------------svn用户和口令缓存到客户端的位置---------------------------------------------------

C:/Documents and Settings/Administrator/Application Data/Subversion/auth

删除auth下面的所有文件夹,重新连接远程服务器,对话框终于出来了!

 

 

 

如果连接和checkout时提示服务器积极拒绝最大的可能是:

启动服务时使用的端口在客户端无法访问。所以最好在启动时不指定端口号。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章