1.1 svn安装配置:
wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
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,更改authz,passwd文件时不需要重启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使用:
进入:
http://tortoisesvn.net/downloads.html
下载:TortoiseSVN
不习惯英文的可以下载汉化包。
安装过程一路向东
Svn客户端链接服务器方式,账号及密码:
svn://192.168.19.119/sadoc
用户名: zhaoxin
密 码: zhaoxin123
1.5.2 linux 客户端使用:
1、svn管理命令用法
用法: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程序进行相应的开发。
钩子脚本就是被某些版本库事件触发的应用程序,例如:创建新版本或修改未被版本控制的属性。每个钩子都能掌管足够的信息来了解什么事件,操作对象是什么以及触发事件用户的账号。inotify或sersync
根据钩子的输出或者返回状态,钩子程序能够以某种方式控制该动作继续执行,停止或者挂起。
使用方式,将后面的扩展名去掉变成(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 钩子结合实现数据实时同步某企业小案例
1 建立同步WEB目录
mkdir /data/www
2 将SVN中内容checkou到WEB目录一份
[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 can’t 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