1.1 svn安装配置:

wget 

cp CentOS6-Base-163.repo /etc/yum.repos.d/

[root@bogon ~]# yum clean all

[root@bogon ~]# rpm -ivh epel-release-6-8.noarch.rpm

[root@bogon ~]# yum install subversion -y

补:yum安装rpm包安装后本地不清除的方法

[root@bogon ~]# sed -i 's#keepcache=0#keepcache=1#g' /etc/yum.conf

[root@bogon ~]# grep keepcache /etc/yum.conf

keepcache=1  //rpm 包下载后不清除

1.2 配置并启动svn

建立SVN版本库存储根目录(svndata)及用户、密码权限目录(svnpasswd);

[root@bogon ~]# mkdir -p /application/svndata  

[root@bogon ~]# mkdir -p /application/svnpasswd

启动SVN服务指定服务的SVN根目录

svnserve -d -r /application/svndata --pid-file=/application/svndata/svn.pid

提示:pid的参数可加可不加,本文就不加了

查看进程和端口

[root@bogon ~]# ps -ef|grep svn

root      37492      1  0 16:06 ?        00:00:00 svnserve -d -r /application/svndata/

root      37494  34093  0 16:06 pts/3    00:00:00 grep svn

[root@bogon ~]# netstat -antup|grep svn

tcp        0      0 0.0.0.0:3690                0.0.0.0:*                   LISTEN      37492/svnserve  

[root@bogon ~]# lsof -i:3690

COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

svnserve 37492 root    3u  IPv4  97424      0t0  TCP *:svn (LISTEN)

重新启动SVN

[root@svn svnpasswd]# pkill svnserve

[root@svn svnpasswd]# svnserve -d -r /application/svndata/

1.3 建立项目版本库

创建一个新的Subversion项目sadoc,其实,类似sadoc这样的项目可以创建多个,每个项目不同的代码,这里只是以创建一个项目为例演示:

[root@bogon ~]# svnadmin create /application/svndata/sadoc

[root@bogon ~]# ll /application/svndata/

总用量 4

drwxr-xr-x. 6 root root 4096 9月  29 16:19 sadoc

提示:查看svnadmin命令帮助的方法

[root@bogon ~]# svnadmin help

[root@bogon ~]# svnadmin help create

1.4 调整svn配置文件及权限文件

1.4.1配置允许用户oldboy读写访问

[root@bogon conf]# cd /application/svndata/sadoc/conf/

[root@bogon conf]# ll

总用量 12

-rw-r--r--. 1 root root 1080 9月  29 16:19 authz

-rw-r--r--. 1 root root  309 9月  29 16:19 passwd

-rw-r--r--. 1 root root 2279 9月  29 16:19 svnserve.conf

[root@bogon conf]# cp svnserve.conf svnserve.conf.bak

[root@bogon conf]# egrep "\-access|\-db =" svnserve.conf

# anon-access = read

# auth-access = write

# password-db = passwd

# authz-db = authz

修改:

vim svserve.conf 修改

anon-access=none #12

auth-access=write #13

password-db = /application/svnpasswd/passwd #18

authz-db = /application/svnpasswd/authz #25

拷贝文件:

[root@bogon conf]# cp authz passwd /application/svnpasswd/

[root@bogon conf]# ll /application/svnpasswd/

总用量 8

-rw-r--r--. 1 root root 1080 9月  29 17:09 authz

-rw-r--r--. 1 root root  309 9月  29 17:09 passwd

修改权限,保证安全:

[root@bogon svnpasswd]# cd /application/svnpasswd/

[root@bogon svnpasswd]# chmod 700 *

[root@bogon svnpasswd]# ll

总用量 8

-rwx------. 1 root root 1080 9月  29 17:09 authz

-rwx------. 1 root root  309 9月  29 17:09 passwd

 

 

提示:svnserve.conf中每个参数都要顶格写,开头不能有空格。

快速替换方法

sed -i s/# auth-access = write/auth-access=write svnserve.conf

sed -i s/# anon-access = read/anon-access=none svnserve.conf

sed -i s%# password-db = passwd%password-db = /application/svnpasswd/passwd% svnserve.conf

sed -i s%# authz-db = authz%authz-db = /application/svnpasswd/authz%g svnserve.conf

1.4.2passwd配置用户账号密码:

[root@bogon svnpasswd]# cd /application/svnpasswd/

[root@bogon svnpasswd]# vim passwd 

### This file is an example password file for svnserve.

### Its format is similar to that of svnserve.conf. As shown in the

### example below it contains one section labelled [users].

### The name and password for each user follow, one account per line.

 

[users]

# harry = harryssecret

# sally = sallyssecret

zhaoxin = zhaoxin123

xinlin  = xinlin123

提示:

1.等号前为SVN账号,等号后为SVN密码,密码是明文的,注意密码权限;

2.更改svnserve.conf时,需要重启SVN,更改authzpasswd文件时不需要重启svn服务。

1.4.3 authz权限配置文件

[root@bogon svnpasswd]# cd /application/svnpasswd/

[root@bogon svnpasswd]# vim authz 

版本库目录格式:

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

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

<用户名>  =  <权限>

注意:

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

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

sagroup = zhaoxin,xinlin

[sadoc:/]

zhaoxin = rw

xinlin = r

@sagroup = r

1.5 客户端软件 TortoiseSVN

1.5.1 windows使用:

进入:

下载:TortoiseSVN

不习惯英文的可以下载汉化包。

安装过程一路向东

Svn客户端链接服务器方式,账号及密码:

 svn://192.168.19.119/sadoc

 用户名: zhaoxin

 密  码: zhaoxin123

1.5.2 linux 客户端使用:

1svn管理命令用法

用法:svn<subcommand>[options][args]

可用的子命令:(括号内是子命令的简写)

   add

   blame (praise, annotate, ann)

   cat

   changelist (cl)

   checkout (co)

   cleanup

   commit (ci)

   copy (cp)

   delete (del, remove, rm)

   diff (di)

   export

   help (?, h)

   import

   info

   list (ls)

   lock

   log

   merge

   mergeinfo

   mkdir

   move (mv, rename, ren)

   propdel (pdel, pd)

   propedit (pedit, pe)

   propget (pget, pg)

   proplist (plist, pl)

   propset (pset, ps)

   resolve

   resolved

   revert

   status (stat, st)

   switch (sw)

   unlock

   update (up)

2、从SVN提取数据

将文件checkout到本地目录。

svn checkout remotepath localpath

可以简写:

svn co remotepath localpath

例如:

svn co svn://192.168.19.72/sadoc/ /data/ --username=zhaoxin --password=zhaoxin123

 

svn如果出现下面问题

提示:svn:Cant`t convert string from UTF-8 to native encoding:

解决方法:

[root@svn ~]# export LC_CTYPE="en_US.UTF-8"

[root@svn ~]# export LC_ALL=

[root@svn ~]# locale

LANG=en_US.UTF-8

LC_CTYPE=en_US.UTF-8

LC_NUMERIC="en_US.UTF-8"

LC_TIME="en_US.UTF-8"

LC_COLLATE="en_US.UTF-8"

LC_MONETARY="en_US.UTF-8"

LC_MESSAGES="en_US.UTF-8"

LC_PAPER="en_US.UTF-8"

LC_NAME="en_US.UTF-8"

LC_ADDRESS="en_US.UTF-8"

LC_TELEPHONE="en_US.UTF-8"

LC_MEASUREMENT="en_US.UTF-8"

LC_IDENTIFICATION="en_US.UTF-8"

LC_ALL=

3、查看SVN中的数据

查看版本库下的内容

[root@svn ~]# svn ls svn://192.168.19.119/sadoc/ --username=zhaoxin --password=zhaoxin123

4、从本地提交数据到SVN

[root@svn ~]# ll /data/

total 0

-rw-r--r-- 1 root root 0 Oct 19 03:06 daima.txt

-rw-r--r-- 1 root root 0 Oct 19 03:09 新建文本文档.txt

[root@svn ~]# touch /data/{a..d}

[root@svn ~]# ll /data/

total 0

-rw-r--r-- 1 root root 0 Oct 19 03:38 a

-rw-r--r-- 1 root root 0 Oct 19 03:38 b

-rw-r--r-- 1 root root 0 Oct 19 03:38 c

-rw-r--r-- 1 root root 0 Oct 19 03:38 d

-rw-r--r-- 1 root root 0 Oct 19 03:06 daima.txt

-rw-r--r-- 1 root root 0 Oct 19 03:09 新建文本文档.txt

[root@svn data]# svn add a b c d 

A         a

A         b

A         c

A         d

[root@svn data]# svn ci -m "svn ci data"

Adding         a

Adding         b

Adding         c

Adding         d

Transmitting file data ....

Committed revision 3.

5、导入原始目录树

[root@svn ~]# svnadmin create /application/svndata/zhaoxin

[root@svn ~]# mkdir -p /svn/trunk /svn/branch /svn/tag

[root@svn ~]# svn import /svn/ file:///application/svndata/zhaoxin/ -m 'import' 

Adding         /svn/trunk

Adding         /svn/tag

Adding         /svn/branch

 

Committed revision 1.

 

6、将主干拷贝为分支

svn copy svn://192.168.19.119/sadoc/trunk svn://192.168.19.119/sadoc/trunk/branch_cms_110329 -m "create fenzhi" --username=zhaoxin --password=zhaoxin123

Svn钩子(hooks

1.1 Svn钩子脚本简介

钩子脚本的具体写法就是操作系统中的shell脚本程序的写法,可根据自己的SVN所在的操作系统和shell程序进行相应的开发。

钩子脚本就是被某些版本库事件触发的应用程序,例如:创建新版本或修改未被版本控制的属性。每个钩子都能掌管足够的信息来了解什么事件,操作对象是什么以及触发事件用户的账号。inotifysersync

根据钩子的输出或者返回状态,钩子程序能够以某种方式控制该动作继续执行,停止或者挂起。

使用方式,将后面的扩展名去掉变成(post-commit

[root@svn ~]# cd /application/svndata/sadoc/hooks/

[root@svn hooks]# ll

total 36

-rw-r--r-- 1 root root 1977 Oct 19 01:57 post-commit.tmpl

-rw-r--r-- 1 root root 1638 Oct 19 01:57 post-lock.tmpl

-rw-r--r-- 1 root root 2289 Oct 19 01:57 post-revprop-change.tmpl

-rw-r--r-- 1 root root 1567 Oct 19 01:57 post-unlock.tmpl

-rw-r--r-- 1 root root 3426 Oct 19 01:57 pre-commit.tmpl

-rw-r--r-- 1 root root 2410 Oct 19 01:57 pre-lock.tmpl

-rw-r--r-- 1 root root 2786 Oct 19 01:57 pre-revprop-change.tmpl

-rw-r--r-- 1 root root 2100 Oct 19 01:57 pre-unlock.tmpl

-rw-r--r-- 1 root root 2780 Oct 19 01:57 start-commit.tmpl

重要提示:

由于安全原因,subversion版本库在一个空环境中执行钩子脚本----就是没有任何环境变量,甚至没有$PATH%PATH%,由于这个原因,许多管理员会感到困惑,他们的钩子脚本手工运行时正常,可在subversion中却不能运行。 要注意,必须在你的钩子中去设置好环境变量或为你的程序指定好绝对路径

    

1.2 钩子的模板

1.2.1 常用钩子脚本

钩子脚本                                      

说明                                          

post-commit

在提交完成成功创建版本之后执行该钩子,

提交已经完成,不可更改,因此,本脚本的

返回值被忽略。提交完成时触发事物。

pre-commit

提交完成前触发执行该脚本

start-commit

在客户端还没有向服务器提交数据之前,即还没有建立subversion transaction(缩写为txn)之前,执行该

脚本(提交前触发事务)

1.3 svn钩子生产应用场景举例

per-commit

1.限制上传文件扩展名及大小,控制提交要输入的信息等。

post-commit

2.SVN更新自动周知,MSN,邮件或者短信周知。

3.SVN更新触发checkout程序,然后实时rsync推送到服务器等。

 

 

1.4 SVN钩子生产应用实战

1.4.1 rsync 与 svn 钩子结合实现数据实时同步某企业小案例

建立同步WEB目录

mkdir /data/www

SVN中内容checkouWEB目录一份

[root@svn ~]# svn co svn://192.168.19.119/sadoc /data/www --username=zhaoxin --password=zhaoxin123

A    /data/www/a

A    /data/www/b

A    /data/www/新建文本文档.txt

A    /data/www/c

A    /data/www/d

A    /data/www/trunk

A    /data/www/trunk/branch_cms_110329

A    /data/www/daima.txt

A    /data/www/tag

A    /data/www/branch

Checked out revision 7.

 

钩子脚本 post-commit

windows上用过的脚本在linux上 dos2unix FILE_NAME处理一下

REPOS="$1"

REV="$2"

export LC_CTYPE="en_US.UTF-8"

export LC_ALL=

LOGPATH="/app/log"

[ ! -d ${LOGPATH} ] && mkdir ${LOGPATH} -p

#update content from svn

SVN=/usr/bin/svn

$SVN update --username zhaoxin --password zhaxin123 /data/www

if [$? -eq 0 ]

        then

         /usr/bin/rsync -az --delete /data/www /tmp/

fi

注意:

1、钩子脚本必须有执行权限

[root@svn hooks]# chmod 700 post-commit

[root@svn hooks]# ll post-commit

-rwx------ 1 root root 2282 Oct 19 09:57 post-commit

2、注意定义环境变量

 

 

1.4.2 限制文件上传文件扩展名及大小

钩子脚本 per-commit

REPOS="$1"

TXN="$2"

#此处更改大小限制,这里是5M

MAX_SIZE=5242880

#此处增加限制文件后缀名

FILTER=\.(zip|rar|o|obj|tar|gz)$

#Make sure that the log message contains some text.

SVNLOOK=/usr/bin/svnlook

 

#LOGMSG=`$SVNLOOK log -t $TXN $REPOS|grep [a-zA-Z0-9] wc -c`

LOGMSG=`$SVNLOOK log -t $TXN $REPOS | wc -c`

 

if [ $LOGMSG -lt 9 ]:

then

echo -e nLog message cant be empty! you must input more than 8 chars as comment !. 1>&2

exit 1

fi

 

 

files=$($SVNLOOK changed -t $TXN $PREPOS |cut -d   -f  4-)

#echo $files>&2

#echo $r>&2

#exit 1

rc=0

echo $files |while read f:

do

#check file type

if echo $f|tr A-Z a-z |grep -Eq $FILTER:

then 

echo File $f is not allow ($FILTER) file >&2

exit 1:

fi

 

#check file size

filesize=`$SVNLOOK cat -t $TXN $REPOS $f| wc -c`

 

if [ $filesize -gt $MAX_SIZE ]:

then 

echo File $f is too large(must <=$MAX_SIZE) B >&2

exit 1

fi

done

 

# ALL checks passed, so allow the commit