SVN工具分析

2020-07-24 10:01:41 浏览数 (1)

寄语:虽然现在很多项目都使用GIT进行版本管理,但是SVN还有使用的,这篇文档压箱底了好久,思虑再三,还是发出来吧,说不定能帮助到别人。

一、简介

SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS迁移到Subversion。说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的。

TortoiseSVN 是 Subversion 版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录。文件保存在中央版本库,除了能记住文件和目录的每次修改以外,版本库非常像普通的文件服务器。你可以将文件恢复到过去的版本,并且可以通过检查历史知道数据做了哪些修改,谁做的修改。这就是为什么许多人将 Subversion 和版本控制系统看作一种“时间机器”。

二、SVN提交监视工具

安装TortoiseSVN客户端以后,在1.9.7(具体版本不清楚了)版本上集成了一个监视工具“TortoiseSVN Project Monitor” ,这个工具可以监视一个版本库的提交信息,当有提交事务发生的时候,弹出提示框提示你有新增提交,使用此工具可以查看提交的信息,如图:

这个工具是TortoiseSVN作者把自己的一个commitMonitor工具集成到了TortoiseSVN客户端里面,目前功能还比较单一,作者说后期可能会增加其他功能。

三、SVN Hooks(钩子)介绍

SVN在版本库发生事务的时候,我们需要做一些别的事情,比如说提交的时候必须写log,检查提交的代码等等一些操作。

SVN提供了钩子(hooks),可以写一些hooks脚本来实现日志、代码的检测,并且可以控制提交是否能够成功。

SVN hooks 分为服务端钩子与客户端钩子

SVN服务端有9种钩子,分别是:

A.关于锁定的2种

a1.pre-lock

a2.post-lock

B.关于解锁的2种

b1.pre-unlock

b2.post-unlock

C.关于提交的3种

c1.start-commit

c2.pre-commit

c3.post-commit

D.关于属性的2种

d1.pre-revprop-change

d2.post-revprop-change

TortoiseSVN客户端有6中钩子,分别是:

A.关于提交的

a1.start commit hook

a2.pre-commit hook

a3.post-commit hook

B.关于更新的

b1.start update hook

b2.pre-update hook

b3.post-update hook

钩子支持的脚本类型:根据操作系统不同,支持不同的脚本类型,以Windows为例,支持批处理(.bat)、可执行文件(.exe)、以及一些类似于perl、python等的脚本

服务端脚本存放位置:

在创建好版本库以后,会在版本库的路径下有一个hooks的目录,这个目录下存放的就是钩子的脚本文件,这些文件如果是默认的话,会显示为.tmpl格式,不过这些只是文本文件,可以使用文本工具打开的。

服务端与客户端的脚本一样吗:

服务端与客户端的脚本除了名字一样,其他都是不一样的,他们之间没有什么关系,只是依靠消息相互协作而已。

服务端与客户端钩子脚本触发顺序如图:

四、服务端、客户端钩子分析

如果需要配置共有的一些规则,比如说提交的时候日志的样式、长度、是否包含BUG号等一些信息的时候,可以在SVN服务端写钩子脚本。

优点:可以统一所有使用版本库的人员进行提交限制,不需要每一个人在本地进行配置,可以使用SVNLOOK命令,来获取提交的内容、提交人员、提交信息等等。

缺点:一旦设定规则以后,所有人员都需要满足规则才能提交代码,偏公共性,如果有特殊情况不好处理,而且服务端不会安装一些必要的环境,只能处理一些简单的规则,如果说要做比如发送给相关的人员进行代码审查,如果审查不通过,就驳回此次提交,如果说一直等待评审回执,会影响其他人员的提交操作。

除了在服务端配置钩子之外,还可以在客户端配置钩子脚本,但是客户端脚本种类比较少,只有提交和更新的钩子接口。

优点:可以本地配置钩子脚本,它只检测本地的本次提交,不影响其他人员的提交动作,可以推送代码审查

缺点:需要本地配置

五、客户端钩子的配置

1、在客户端上面添加钩子

打开TortoiseSVN的设置工具,选择钩子脚本,点击增加,会弹出上图的界面,

钩子类型:

工作副本路径:

是本地的SVN代码路径,可以配置成“*”,指本地所有的SVN代码路径。

要执行的命令行:

本地钩子脚本路径

例如本次需要做的工具需要用到提交之前的钩子,配置如下

SVN客户端钩子,每一种钩子在调用脚本的时候,都会传入一定的参数,

所有的参数类型如下:

PATH

指向临时文件的路径,此文件包含了操作开始时的所有路径。在临时文件中,每个路径占一行。

DEPTH

提交/更新的深度。

可能的取值是:

-2

svn_depth_unknown

-1

svn_depth_exclude

0

svn_depth_empty

1

svn_depth_files

2

svn_depth_immediates

3

svn_depth_infinity

MESSAGEFILE

指向包含日志信息的提交文件.此文件使用UTF-8编码.在成功执行开始提交钩子后,日志信息会回显,以便于钩子修改.

REVISION

更新或提交完成后的版本库的版本

ERROR

指到包含错误信息的文件的路径, 如果没有错误的话,文件将是空的

CWD

脚本正在运行的工作目录,设置为所有受影响的路径的公用根目录.

本例中的提交之前钩子的参数只有4个,

PATH、DEPTH、MESSAGEFILE、CWD

看一下上图的输出,C:UsersmaozgAppDataLocalTempsvn4D21.tmp 为PATH,

指向临时文件的路径,此文件包含了操作开始时的所有路径。在临时文件中,每个路径占一行。

打开这个文件,如图:

可以清晰的看到里面存储的就是本次所提交的所有文件的路径。

可以使用这些文件路径生成补丁文件发送给相关人员进行代码审查。

参数DEPTH,参数中传入的是3,意思是无穷大的深度

参数MESSAGEFILE

参数传入的路径C:UsersmaozgAppDataLocalTempsvn4D31.tmp

打开该文件查看,如图:

就是本次提交的日志信息,可以通过检测该日志是否符合提交规范,然后判定提交是否继续。

最后一个参数CWD为脚本正在运行的工作目录,设置为所有受影响的路径的公用根目录

D:GTJ2018_Operating_CopyGTJ2018_YY_Copy 传入的是我在提交的时候的目录

意思是我在哪个目录点击的提交操作。

通过这些信息,可以做代码检测、日志检测等操作,然后控制此次提交是否成功,脚本返回“0”代表成功,可以提交,如果返回别的值会中断此次提交。

测试脚本代码:

代码语言:javascript复制
#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
 ofstream outFile;
 outFile.open("D:\hook.txt");
 for (int i = 0; i < argc;   i)
 {
 string str = argv[i];
 outFile << str << endl;
 }
 outFile.close();
 return 1;
}

参考文档:

TortoiseSVN_zh_CN.zip
svn

0 人点赞