前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SVN工具分析

SVN工具分析

原创
作者头像
Sky_Mao
修改2020-07-24 10:01:41
2K0
修改2020-07-24 10:01:41
举报

寄语:虽然现在很多项目都使用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:\Users\maozg\AppData\Local\Temp\svn4D21.tmp 为PATH,

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

打开这个文件,如图:

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

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

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

参数MESSAGEFILE

参数传入的路径C:\Users\maozg\AppData\Local\Temp\svn4D31.tmp

打开该文件查看,如图:

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

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

D:\GTJ2018_Operating_Copy\GTJ2018_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;
}

参考文档:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、简介
  • 二、SVN提交监视工具
  • 三、SVN Hooks(钩子)介绍
    • A.关于锁定的2种
      • B.关于解锁的2种
        • C.关于提交的3种
          • D.关于属性的2种
            • A.关于提交的
              • B.关于更新的
              • 四、服务端、客户端钩子分析
              • 五、客户端钩子的配置
                • 1、在客户端上面添加钩子
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档