SVN日常笔记

2016-05-18

这里记录SVN日常使用的技巧

快速安装:

apt-get install subversion

使用方法:

1.将文件checkout到本地目录

svn checkout svn://192.168.0.1/project/malume

简写:svn co

2.往版本库中添加新的文件

svn add test.php   (添加test.php)

svn add *.php      (添加当前目录下所有的php文件)

3.将改动的文件提交到版本库

svn commit -m "add test file for my test" test.php

4.更新到某个版本

svn update   (如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。)

svn update -r 200 test.php  (将版本库中的文件test.php还原到版本200)

svn update test.php  (更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update)

5.批量添加文件

svn st | awk '{if ( $1 == "?") { print $2}}' | xargs svn add

6.批量删除文件

svn status|grep ! |awk '{print $2}'|xargs svn del

7.修改SVN中文件的可执行属性

添加可执行属性:

svn propset svn:executable on test.c
svn commit -m "test" test.c

删除可执行属性:

svn propdel svn:executable test.c
svn commit -m "test" test.c

为所有文件权限提交:

svn propset svn:executable on *
svn commit -m "test"

统计用户一段时间内修改了哪些文件

比如要看从5月1号到18号我的修改记录

svn log -r {2016-5-1}:{2016-5-19} --search malu -v -q

-v 显示改动文件列表

-q 简化返回内容(去除了注释)

当然这不是最终想要的,接下来拿出强大的vim编辑器:

把结果导出或者copy到文本中,用vim打开:

先把杂项过滤(保留文件列表):

:g!/^   /d

删除不含字符串’空格空格空格’开头的行(^后是三个空格),表以三个空格开头的行都保留。

接下来Ctrl+v进入行编辑模式,把前面空格和M、A等前缀删掉。

然后排序:

:sort

这一步是必须的,因为删除重复行只能去除相邻的。

然后删除重复行:

:g/^\(.*\)$\n\1$/d

完成。

注:以上终端下操作较为复杂,建议在windows图形界面操作,方便快捷:

** svn log ->过滤用户名、日期->选中所有->复制path里的所有文件 **

svn服务端

搭建HTTP方式访问SVN服务端

1.安装必须的组件

apt-get install apache2 libapache2-svn subversion apache2-utils

2.创建存储仓库

mkdir -p /app/svn
svnadmin create /app/svn
chown -R www-data:www-data /app/svn

3.打开apache的配置文件,修改dav_svn.conf的配置

vim /etc/apache2/mods-enabled/dav_svn.conf

<Location />
	DAV svn
	SVNPath /app/svn
	AuthType Basic
 		AuthName "Subversion Repository"
	AuthUserFile /app/svn/conf/pass
	Require valid-user
</Location>

4.为SVN添加用户

htpasswd -c /app/svn/conf/pass username

5.重启apache服务

/etc/init.d/apache2 restart

接下来访问apache试试看

HTTP SVN的权限管理

以上操作仅仅是生成了所有权限的用户,接下来对目录进行读写权限划分:

1.再生成一个用户

htpasswd -b /app/svn/conf/pass username2 password

2.修改dav_svn.conf的配置,添加AuthzSVNAccessFile

vim /etc/apache2/mods-enabled/dav_svn.conf

<Location />
	DAV svn
	SVNPath /app/svn
	AuthType Basic
 		AuthName "Subversion Repository"
	AuthUserFile /app/svn/conf/pass
	<IfModule mod_authz_svn.c>
		AuthzSVNAccessFile /app/svn/conf/authz
	</IfModule>
	Require valid-user
</Location>

3.修改/app/svn/conf/authz,例如:

[/]
malu = rw
bb = rw
[/project]
bb = r

注:malu和bb具有/目录的读写权限,但是bb用户对/project目录只有读权限

服务端仓库目录在/app/svn/db下,里面的revs和revprops分别存放着每次提交的差异数据和日志等信息

*配置SVN的访问路径以及相关参数说明

<Location /svn >     # 通过http://HOST/svn/访问SVN服务器             
  Dav svn    #必需 
  # 说明D:/SVN_REPOS下的所有目录均为仓库
  SVNParentPath "D:/SVN_REPOS"
 
  # 在网页中列出D:/SVN_REPOS下的所有仓库
  SVNListParentPath on
 
  # 基本的用户名密码验证方式
  AuthType Basic
 
  # 认证名称,作提示用
  AuthName "SVN Repository"
 
  # 用户名密码文件,并非之conf下的passwd文件
  AuthUserFile "D:/SVN_REPOS/Test/conf/users“ 
 
  # 权限控制文件
  AuthzSVNAccessFile "D:/SVN_REPOS/Test/conf/authz"
 
  # 只有通过认证才能访问网页
  Require valid-user
</Location>
# 重定向处理,用于将http://HOST/svn地址重定向为http://HOST/svn/
RedirectMatch ^(/svn)$ $1/

搭建普通SVN服务器

在以上SVN服务端安装好的基础上

1.修改配置文件/app/svn/conf/svnserve.conf:

[general]
anon-access=none
auth-access=write
password-db=/app/svn/conf/passwd
authz-db=/app/svn/conf/authz
realm=svn

2.修改密码文件/app/svn/conf/passwd:

[users]
malu=password
li=li

3.修改认证文件/app/svn/conf/authz:

[/]
malu = rw
li = rw
bb = rw
[/aa]
bb = r

注意:以上配置文件行左右都不要有空格出现!!!

否则将出现:svn: E215004: Authentication failed

4.最后启动服务:

svnserve -d -r /app/svn --config-file /app/svn/conf/svnserve.conf --listen-port=87017

svn钩子

启动服务:

svnserve -d -r /svn/

进目录:

cd /svn/hooks/

vim post-commit

#!/bin/bash
export LANG=en_US.UTF-8
export PATH=$PATH:/var/www/console
/usr/bin/svn update /var/www --username malu --password xxx --no-auth-cache

注意:–no-auth-cache参数必须加上,不然更新会用系统里保存帐号

给post-commit执行权限

chmod 777 post-commit

SVN钩子根据项目路径触发调取jenkins自动构建脚本

vim post-commit

#!/bin/bash
REPOS="$1"
TXN="$2"
CURDATE=`date`

PROJECTPATH=Projects/taifeng

SVNLOOK=/usr/bin/svnlook

NEW_VER=`$SVNLOOK youngest $REPOS`

FILELIST=`$SVNLOOK changed  -r $NEW_VER $REPOS`
USERNAME=`$SVNLOOK author -r $NEW_VER $REPOS`

$SVNLOOK changed  -r $NEW_VER $REPOS | while read line;do
        if [[ $line =~ $PROJECTPATH | $line =~ $PROJECTPATH ]];then
                echo "$TXN $USERNAME Deployed at $CURDATE" >> /home/svnhooks.log
                wget -q http://svn.malu.me/job/php/build?token=8f7sdf23sdfsdfasd19 &
                exit
        fi
done