SVN版本控制环境搭建

SVN安装

SVN(Subversion)是一款开源的版本控制系统,包含客户端和服务端,使用命令行进行操作,源码地址:https://subversion.apache.org/
SVN安装包地址:https://sourceforge.net/projects/win32svn/,需要翻墙。目前我下载的是Setup-Subversion-1.8.17。我指定安装在C:\Program Files (x86)\Subversion目录里,安装完成后查看目录结构:
在这里插入图片描述将bin目录添加到系统环境变量PATH中。在命令行窗口中输入 svnserve --help ,查看安装正常与否。bin目录下有很多可执行程序,包括svnserve在内,所有程序都可以使用–help查看其使用方法。
在这里插入图片描述

SVN使用

首先,在服务端进行SVN版本库的相关配置:

手动新建版本库目录

mkdir C:\Users\Administrator\Desktop

利用svn命令在上述目录下创建版本库test

svnadmin create C:\Users\Administrator\Desktop\test

版本库创建成功后目录结构如下:在这里插入图片描述
其中conf文件夹中svnserve.conf用于指定用户密码及权限保存的文件名。
找到以下两行:

匿名可读(默认被注释)

# anon-access = read

用户可写(默认被注释)

# auth-access = write

取消注释,去掉#及其后空格(注意一定要去掉空格,否则格式不正确)改成

anon-access = read
auth-access = write

没有经过认证的用户只能读,认证后才能写数据,也就是提交。那怎么认证呢?再往下看找到下面两行,默认是被注释掉的:

指定用户密码保存的文件为passwd

password-db = passwd

指定用户名保存的文件为authz

authz-db = authz

authz文件存放用户及组的权限,passwd存放用户及密码
使用命令svnserve启动服务,启动后命令窗口不能关闭,关闭后无法访问版本库。

svnserve -d -r 目录 --listen-port 端口号

-r: 配置方式决定了版本库访问方式。

–listen-port: 指定SVN监听端口,不加此参数,SVN默认监听3690,查看端口占用情况用

netstat -ano

找到该端口对应的PID,再通过任务管理器即可找到对应占用该端口的程序。
由于-r 配置方式的不一样,SVN启动就可以有两种不同的访问方式

方式一:-r直接指定到版本库(称之为单库svnserve方式)

 svnserve -d -r C:\Users\Administrator\Desktop\test

在这种情况下,一个svnserve只能为一个版本库工作。

修改authz配置文件中对版本库权限的配置,此例创建admin和dev两个组,user1属于admin组,user2属于dev组,[/]代表版本库根目录,此处只能使用斜杠,而不能使用windows目录的反斜杠方式表示,其后跟对该目录的访问权限,@符号表示其后是一个用户组,而不是用户,下面设置admin组的读写权限及user2的读权限,* = r表示除了上述用户的其他用户及组有读权限:

[groups]
admin=user1
dev=user2
[/]
@admin=rw
user2=r
 * = r

使用类似这样的URL:svn://localhost/ 即可访问test版本库

方式二:指定到版本库的上级目录(称之为多库svnserve方式)

svnserve -d -r C:\Users\Administrator\Desktop

这种情况,一个svnserve可以为指定的目录下的多个版本库工作

authz配置文件中对版本库权限的配置应这样写,分别指定版本库test1和test2的权限:

[groups]
admin=user1
dev=user2

[test1:/]
@admin=rw
user2=r

[test2:/]
@admin=rw
user2=r

如果此时你还用[/],则表示所有库的根目录,同理,[/src]表示所有库的根目录下的src目录。

使用类似这样的URL:svn://localhost/test1 即可访问test1版本库。

若要使外网能够访问阿里云上的SVN服务器,则需要在服务器管理控制台中–网络安全–安全组–找到实例相关的网络安全组点击配置规则–添加安全组规则,进行如下配置:
在这里插入图片描述
配置好后使用类似这样的URL:svn://公网IP/test1 即可访问test1版本库。

使用命令查看用户harry的权限:

svnauthz accessof C:\Users\Administrator\Desktop\test\conf\authz --username harry

路径必须为authz文件的绝对路径,若不提供–username参数,则默认显示匿名用户权限。

将SVN注册为本地自动启动的服务

由于使用命令行启动SVN则该窗口不能关闭,因此需要将其注册为服务,每次开机自动启动,系统自带安装服务的工具“Service Control”,命令行sc查看用法,sc create查看如何创建服务。具体操作方法如下:
我的Subversion安装在"C:\Program Files (x86)\Subversion",版本库在"D:\Repository",而我希望对应的Subversion服务名为svnservice,命令行执行如下语句安装svn服务:

sc create svnservice binpath= "\"C:\Program Files (x86)\Subversion\bin\svnserve.exe\" --service -r D:\Repository" displayname= "SVNService" depend= Tcpip start= auto

在以前启动svnserve时会使用"-d"选项,也就是守护进程模式,在这里不能使用,会导致服务无法启动。同样,"-i"和"-t"选项也不能使用。路径中如果带空格,则路径需要用双引号括起来,此时还需要使用反斜杠“\”将路径的双引号进行转义,如上面所写,如果路径不含空格,则直接写成 :

 binpath= "C:\test\Subversion\bin\svnserve.exe --service -r D:\Repository"

sc对选项的格式严格要求,“depend= Tcpip”不能写为“depend = Tcpip”或“depend=Tcpip”,也就是“=”前不能有空各,而后面必须有空格。

删除前面添加的服务

sc delete svnservice

svnservice"就是我们创建服务时使用的名字。

启动/停止服务

net start/stop svnservice

SVN基本操作

SVN检出

svn checkout svn://localhost/ C:\Users\Administrator\Desktop\test1 --username harry --password harryssecret

checkout后面分别为SVN库地址,检出目录,用户名,密码。

SVN更新

svn update C:\Users\Administrator\Desktop\test1 -r 1
将版本库更新到指定版本,不提供-r选项,默认更新到最新版本。

SVN提交

用户每次提交之前先进行更新,查看是否有冲突,然后再提交,应尽量避免提交错误代码。

svn commit C:\Users\Administrator\Desktop\test1 --message version1 --username harry --password harryssecret

若出现如下错误,则必须指定–message选项
在这里插入图片描述
–message指定提交的日志信息。

  svn status C:\Users\Administrator\Desktop\test1

在这里插入图片描述
查看版本库中文件状态,?表示未加入版本库。

svn add C:\Users\Administrator\Desktop\test1\crk.snippet

在这里插入图片描述
将crk.snippet加入版本库,图中字母“A”表示“Added”已添加。

SVN回退

对单个文件进行了修改,回退到修改前的状态

 svn revert C:\Users\Administrator\Desktop\test1\readme.txt

对整个版本库的修改回退到修改前

 svn revert C:\Users\Administrator\Desktop\test1 -R

其他还有很多命令,可参见菜鸟教程SVN教程,或者自行百度。

若绝对SVN使用命令行操作实在麻烦,SVN服务端可以使用visualSVN Server Manager进行图形化的管理,客户端可以搭配 TortoiseSVN。

使用TortoiseSVN进行分支合并及同步等操作

tortoiseSVN进行基本的检出、更新、提交等操作就不再讲解,很简单。重点讲一下将主干(trunk)更新的内容同步(合并)到分支(branch)中以及将分支合并回主干。

首先我们看一下我的版本日志
在这里插入图片描述
接下来回顾一下我将主干的版本5和版本7的修改同步到分支1(b1)的过程:

右键分支b1文件夹,选择TortoiseSVN->Merge(合并):在这里插入图片描述

  1. 合并一个版本范围”(Merge a range of revisions)
    在这里插入图片描述
      前面有提过,合并是合并到本地的工作副本(working copy),所以一般合并之前,最好将本地代码先更新一遍,有冲突的解决冲突,并且将未提交的代码提交,以防在合并之后,未提交的代码丢失,我们是将主干的修改同步到分支中,所以这里合并的源(URL to merge from)选择主干文件夹,反之选择分支文件夹,本例中为svn://服务器IP/test/branchs/b1。要合并的版本范围(Revision range to merge)选项,当选择所有版本进行merge的时候,TortoiseSVN做了怎么样的操作呢?其实就是:diff and apply。diff是比较合并源指定的工程最新一个版本和创建分支时的主版本(b1分支基于版本1创建,故创建时主版本为1,b2分支集于版本5创建,故创建时主版本为5)的差异,假设最新版本是r-last,最初的版本r-first,r-last相对r-first而言,增加了文件a,修改了文件b,那么在合并的时候,就将“增加文件a,修改文件b”的操作应用在本地的working copy上面去,这就完成了合并;假设选择的是指定范围,那么用户可以选择一个版本范围,也可以单独指定一个版本或者不填写任何值(此时相当于选所有版本),假设用户指定了版本r1-r3,其中r1新增了文件a,r2新增了文件b,r3删除了文件c,那么在合并的时候TortoiseSVN就会将“新增文件a,新增文件b,删除文件c”应用于本地的 working copy,这样就完成了合并~这里需要注意一下,合并之后分支的创建版本变为指定的版本(合并所有版本则为最新版本),在下次合并时检查这个新的创建版本,如本例中,b1与主干版本5进行了第一次合并生成了版本9,下一次b1再进行合并时,选择合并的版本将与版本5进行对比。

(ps:这边还有一个反向合并Reverse merge复选框,恢复之前的合并。假设我们刚刚做的merge有问题,需要将本地的working copy恢复成merge之前的,那么就需要将之前应用于本地working copy的操作全部回退,操作和merge基本一样,只是最后,需要复选这个Reverse merge复选框)

  1. 合并两个不同的树(Merge two different trees)

将两个不同的分支(branch)合并到本地working copy中,当然,我们也可以用这个选项将分支(branch)修改的内容合并回主干(trunk),指定需要对比的开始和结束版本即可。这种类型则是无论是主干还是分支都可以选择合并的版本,即可以选择过去的一个主干版本与分支的某个版本进行合并。合并的时候以选择的分支版本为主,如果选择的主干版本与分支版本有不同的地方,合并时主干部分将被放弃。

起始URL:选择主干目录的URL(应当和当前工作副本的URL一致,这个是所谓的合并点)

结束URL:选择要合并的分支的URL。

起始和结束的版本:一般起始版本应当找到最后一次同步时的版本,如果从没有同步过(第一次合并),则选择创建分支时的版本,结束版本一般是最新版本,如果你不想将某些内容合并进主干的话,也可以选择一个合并点。

附:使用visualsvnserver搭建svn服务器,网上文章很多,可参考百度经验:
https://jingyan.baidu.com/article/e6c8503c6eb2a6e54f1a18b1.html

关于SVN钩子(hook),强制提交时备注信息,修改Pre-commit hook

@echo off

set svnlook="C:\Program Files\VisualSVN Server\bin\svnlook.exe"

setlocal

set REPOS=%1

set TXN=%2

rem check that logmessage contains at least 10 characters

%svnlook% log "%REPOS%" -t "%TXN%" | findstr ".........." > nul

if %errorlevel% gtr 0 goto err

exit 0

:err

echo 提交被阻止,请填写关于此次修改的log信息(需大于10个字符),然后再重新提交! 1>&2

exit 1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值