SVN

一、SVN概述

1、传统团队合作开发项目的流程

传统的团队合作开发项目流程如下:

问题:上面团队开发的流程会产生哪些痛点?

  1. 代码冲突问题。因为多个组员可能修改同一个文件,造成同一个文件相同行代码进行整合的时候会产生冲突。

  2. 代码找回(丢失)问题。某个组员误删了文件或误删了某段代码,找不回来了。

采用svn版本控制工具就可以很好的解决上面问题。

团队采用svn方式开发项目的流程图解:

2、SVN介绍

SVN全名Subversion,即版本控制系统(主要可以追溯以前的代码版本),Subversion是一个通用的系统,可用来管理任何类型的文件,其中主要文件是程序源码,它将数据放置在一个中央仓库(repository)中,这个仓库很像一个普通的文件服务器,不过它会记住文件的每一次变动,这样就可以找回之前的所写的任何的一个代码版本。

相关的版本控制软件:

  • CSV:全称-Concurrent Versions System,与后面提到的SVN是同一个厂家,不过是svn的前身,现已被svn替代。

  • VSS:全称-Visual Source Safe,此工具是Microsoft提供的,是使用的相当普遍的工具之一,做net开发使用较多。

  • SVN:全称-Subversion现在国内企业使用的主流的版本控制系统。

  • git(分支):也可以对代码进行版本控制,它开始主要是用于管理linux内核的,由李纳斯发明,企业使用量和svn相当。

国外代码托管(同性交友网站)网站:https://github.com/

国内代码托管网站(码云):https://gitee.com/

coding(码市): https://coding.net/


二、==svn软件的安装==

==svn是c(client)/s(server)软件的架构,有服务端和客户端。==

服务端下载地址: [https://www.visualsvn.com/visualsvn/download/]

客户端下载地址: [https://tortoisesvn.net/downloads.html]

软件在课件中:

1、安装服务端

提示:如果VisualSVN安装不上可以安装Subversion版本的。

安装VisualSVN服务端步骤:

1、双击安装程序,点击next下一步

  1. 接受软件的相关协议,点击next。

3、选择勾选最后一项,配置svn服务端的相关的命令到系统的环境变量,点击next下一步

  1. 选择标准版Standard Edition。

  1. 选择一个安装目录,这里以安装到D:\svn\server为例

6、点击finish完成

7、查看安装的svn服务端环境变量是否生效,直接在cmd窗口中出输入svn命令,若出现以下提示说明已生效。

如果安装的时候勾选了环境变量,但是依然没有出现以上提示,有以下两种解决办法:

①重启电脑

②(推荐)点击环境变量path选项,直接点击确定即可,不需要修改,这样可以立即生效

再次关闭黑窗口重新打开,输入svn命令进行测试即可。

2、安装客户端

安装客户端的时候,先检查自己电脑系统的位数,选择对应系统位数安装即可。

查看系统位数:计算机-->右键属性

安装TortoiseSVN步骤:

1、双击安装程序,点击next下一步

2、接受软件的相关协议,点击next。

3、选择选项command line client tools-Will be installed on local hard driver

4、点击第一个选项TortoiseSVN,配置安装的目录,目录可自定义,这里以安装到D:\svn\client\中为例,点击next。

注:路径尽量不要包含特殊字符和中文。

5、安装完成,点击finish.。

6、测试是否安装成功,在桌面鼠标右键,多出以下两个选项说明安装成功:

7、如需要汉化可安装系统对应位数的汉化包即可:

安装一路next即可,会自动找到上面svn客户端的安装位置:

切换中文步骤:TortoiseSVN-->Settings-->General-->Language

变成中文效果:


三、==部署单仓库==

==注意:在svn服务器中,我们把存放代码的地方称之为 “仓库”。==

1、部署单仓库的步骤

在svn中创建仓库的步骤总共有三步:

步骤1:建立项目目录 。如:D:/app/blog

步骤2:把项目目录变为仓库。 命令为:svnadmin create D:/app/blog(项目目录绝对路径)

步骤3:开启监管仓库目录的服务。命令为:svnserve -d -r D:/app/blog

选项说明

-d:作为后台服务运行。

-r:监管的目录。

:上面黑窗口正在监管仓库服务,不要关闭,否则导致后面连接不上。

2、svn中的三大指令的使用

  • checkout :检出指令,用于首次与svn服务器建立连接,获取代码到本地目录(第二次以后直接使用update更新指令获取代码。)

  • commit:提交本地代码到svn服务器

  • update:把svn服务器上面的最新代码更新下来

三大指令使用图解:

注意:

以后去公司上班,公司基本早就已经部署好svn服务端了,我们开发者只需要在自己的电脑中安装svn客户端即可,公司的相关人员会告诉我们svn仓库地址,且会给我们分配一个账号和密码进行连接svn服务器,然后checkout检出代码在本地进行开发。写完代码后使用commit进行提交。第二天使用update更新指令下载最新代码进行开发。

3、连接svn服务器

步骤1:如在我们桌面中,建立一个项目检出目录myblog,用于存放检出的代码:

==检出和版本库浏览器的区别:==

检出(checkout):是把仓库所有的代码都检出到本地目录。

版本库浏览器:它可以浏览仓库中有哪些文件,有选择性的检出指定文件。

步骤2:输入我们svn服务器的地址,指定一个检出代码的本地目录

检出成功之后,会在本地检出目录多出一个.svn的隐藏文件夹,==重要此文件夹下存储着和服务端仓库直接的关联信息,更改信息等,不能随意改动。==同时版本为0, 说明是一个新建立的仓库,之间没有任何的commit提交。

4、上传代码到svn仓库中

步骤1:在检出的目录中,建立一些测试文件或目录,鼠标右键选择commit提交指令

步骤2:【重要】填写提交的备注,主要是用于后面代码的版本回退(代码找回)

提交确定之后,提示无权限提交,

因为默认新创建的仓库,只能更新或检出,但是不能commit提交,后面需要修改此仓库的配置文件,进行权限配置。

5、单仓库的权限配置(添加用户名和密码)

==权限可以细分两种:==

  1. 匿名用户提交(不需要用户名和密码也可以提交,但是不安全,个人测试使用较多)

  2. 【重点】允许授权用户提交(需要用户名和密码,安全一点,企业中使用都是需要密码账号的)

每个仓库的conf目录中,都会有以下三个配置文件:

svnserve.conf :当前仓库的核心配置文件,可以开启某些文件的功能

passwd:给当前仓库的增加用户名和密码

authz:给当前仓库的用户设置一些权限1

权限
w:write可更新可提交

r:read 可更新不可提交

提示:后面学的linux中还有一种权限为x,代表可执行。

5.1、匿名用户提交

设置匿名用户访问,仅需修改svnserve.conf配置文件即可,把其中anno-access = read前面

的#号给去掉,且把read改为write,如下:

==注:最前面要顶格写,即不要留空格。只要保存配置文件会立刻生效,不需要重新监管仓库服务。==

再次进行commit提交测试:成功了,提示版本1,说明此仓库成功提交过1次。

尝试对检出目录的index.php文件进行如下修改测试:

再次进行提交;

5.2、授权用户的权限配置【重点】

即,需要用户名和密码才可以进行代码的操作

修改仓库conf目录中的三个配置文件:svnserve.confpasswdauthz

步骤1:修改svnserve.conf配置文件,开启passwd和authz文件的功能

配置解释:

19行:设置为none,代表匿名用户无访问权限。

20行:设置为write,允许授权用户可更新也可提交。

27行:代表开启passwd配置文件。

36行:代表开启authz配置文件。

步骤2,修改passwd文件,给当前仓库增加一些用户名和密码

格式用户名 = 密码(密码明文)

提醒:==以后在Linux中修改含有敏感的词汇,如密码,需要给这类文件设置严格的访问权限。这样更加安全。==

步骤3:修改authz文件,给当前仓库的用户名分配一些权限(rw)

设置组:

1
2
php_group = dashen
cainiao_group = cainiao

==注:权限有r但未有w,表示只能更新代码到本地但不能提交。且目录后面不可以加斜杠/。==

控制权限形式:

[/目录/子目录/子子孙孙目录/....]

[/]对此单仓库的所有文件进行权限控制

[/core] 对此单仓库的core目录下面的文件进行权限控制,可覆盖根目录配置。

再次进行commit提交,若出现一个输入密码的弹窗,说明配置授权用户访问成功:

注意:如果没有w权限,提交的时候会提示Access Denies权限拒绝。


四、svn常见文件状态图标说明

1、图标异常的解决办法【了解】

  • win7解决办法:

底部启动任务管理器-->进程-->找到进程名explorer.exe-->鼠标右键结束,然后再找到文件选项新建刚才结束的进程explorer.exe,如下图所示:

  • win8,win10解决办法:

修改如下注册表:按住win+r,输入regedit

需要修改注册表中的某些选项,参考下面的图片:

找到对应的注册表的值(Tortoise打头的),在前面加多空格,空格越多优先级越高:

最后在底部任务栏管理器选中window资源管理器-->鼠标右键重新启动即可,再去看检出目录就可以看到图标了。

这个svn图标不是特别重要,没有出现也没有关系,只是为了可以看到文件的状态,因为提交代码的时候,在文件变更列表中也是可以看看。

2、常见图标的认识

  • 常规(同步)图标:

出现此图标,说明此文件中的内容与svn服务器中对应文件内容一样。

  • 修改图标:

当我们对本地的某个文件进行修改,导致与svn服务器上面的对应的文件的内容不一致就会出现此图标。

  • 无版本控制图标

说明此文件没有与svn服务器建立关联,说明没有被仓库管理过

  • 忽略图标

当我们有些文件不想提交到svn服务器或者没有必要提交,我们可以把这些文件设置为忽略即可,那么提交的时候这些文件就不会出现在提交的文件变更列表中。

忽略一般有两种:

忽略一个具体的文件:1.jpg

忽略某一类的文件:*.jpg

具体操作:选中要忽略的文件鼠标右键-->TortoiseSVN-->增加到忽略列表。如下:

其中带recursively是递归的意思,多用于忽略目录中及其子目录中的所有的文件。

  • 冲突的图标

尤其是团队开发的时候,多个开发人员对同一个文件的相同行代码都进行了修改,那么后者提交的会覆盖前者提交的,但是svn不会进行覆盖,会提示我们解决冲突,把具有冲突的文件更新下来就是上面的黄色图标。


五、svn代码冲突的解决【重点】

说明:尤其是团队开发的时候,多个开发人员对同一个文件的相同行代码都进行了修改,那么后者提交的会覆盖前者提交的,但是svn不会覆盖,会提示我们解决冲突。

下面就来演示造成冲突的场景以及怎么解决

1、造成冲突的场景

这里以dashen用户和cainiao用户对blog仓库的index.php的文件进行操作。

首先,他们两者都要把代码给更新下来,此时,两者的代码应该是完全一致的:

先是cainiao用户对index.php文件进行修改:修改6-10行,并成功commit提交。

成功提交之后,即svn仓库中index.php的文件的最新内容是cainiao用户提交的。

随后dashen用户同样也对index.php文件进行修改6-9行。

现在dashen用户commit提交代码出现如下的冲突提示:

出现上面的提示,说明提交的文件的内容与svn仓库中的index.php文件内容有冲突部分。

产生冲突的原因:

cainiao用户:修改6-10行

dashen用户:修改6-9行

其中6-9都被两者修改过,导致仓库无法知道使用哪部分代码,所以后者提交失败,报冲突。

2、解决冲突

步骤1:鼠标选中有冲突的文件,鼠标右键选择更新,

可见,更新下来会多出三个辅助文件

文件名(黄色标识) :把服务器上面最新文件内容与即将提交的冲突内容进行一个融合。

文件名.mine : 当前用户即将要提交的文件内容。

文件名.r(前一版本):所有用户提交之前,即文件冲突之前,仓库上最新的文件内容。

文件名.r(后一版本):仓库上最新的文件内容。

==解决办法:==

把三个辅助文件都给删除,修改含有黄色感叹号的文件,进行代码整合修改,再次进行提交即可。

注:整合冲突代码的时候,千万不要覆盖人家代码,合并之前需要程序员之间彼此商量一下。


六、==svn中的版本回退==【重点】

使用到版本回退的场景:

  • 一般由于不小心误删文件或某段代码,并且提交了,这时候就可以通过svn提供的更新至版本来找回。

步骤1:选中要回退的文件,更新至版本

在通过之前提交的日志来找回:

找到之前提交的日志信息,点击确定,即可回到之前的代码版本。

注:

1、检出目录,鼠标右键点击更新是更新最新的版本,如果需要回退到指定的版本,需要通过更新至版本来实现。

2、如要要查看某个文件的版本,右键选中此文件更新至版本即可,可以查看当前文件所有的版本变化。

3、若点击空白处,可以查看当前项目所有代码的版本

以后上班,下班之前先commit提交代码。早上上班,开启电脑,先update更新最新代码版本,需要在最新的代码基础上进行开发。


七、==部署多仓库==

因为一个公司会有多个项目同时进行,比如有java项目,android项目、php项目。其实也就对应着多个仓库,那么不同的开发人员其对应的svn仓库的连接地址也不同。

==实现步骤:==

步骤1:如在app目录中建立多个项目文件夹(android、java)

步骤2:把上面的android和java目录变为项目仓库。

注:blog已经是仓库了,不要重复创建。

步骤3:监管所有仓库的==父目录==(D:/app),这样才可以访问到其中的某个仓库项目代码

==怎么访问多仓库中的某个项目仓库代码?==

:访问形式:svn://ip/仓库名/目录/子孙目录/....

如访问blog仓库,地址为:svn://127.0.0.1/blog/

如访问java仓库,地址为: svn://127.0.0.1/java/

如访问android仓库,地址为: svn://127.0.0.1/android/

如访问其中blog仓库项目:

==怎么访问单仓库中的某个仓库代码?==

答:访问形式: svn://ip/目录

注: svn://127.0.0.1 这种url访问形式只能对单仓库有效,多仓库的访问后面需加仓库名。


八、==多仓库的权限设置==

由于这里有三个仓库,这里以其中一个仓库blog为例,进行权限设置。

还是修改三个文件:svnserve.confpasswdauthz

svnserve.conf配置和passwd配置和之前单仓库配置一样,不用变。

仅需要改变authz配置文件即可:

单仓库和多仓库的authz权限文件配置区别:

单仓库:[/目录/子目录/子孙目录/.….]

多仓库:[==当前仓库名==:/目录/子目录/子孙目录/.….]


九、SVN其他功能

1、清除用户名和密码

做法:鼠标右键TortoiseSVN-->Settings-->已保存数据-->清除全部-->确定

2、export导出指令

export指令:相当于拷贝项目,导出的代码不会含有隐藏文件.svn,即不受svn版本控制

导出来如下所示:

3、更改svn服务器地址

做法:TortoiseSVN-->重新定位-->输入新的仓库地址即可

重新输入新的仓库地址即可:


十、==svn监管服务注册成window系统服务==

1、创建SVN监管仓库服务

快捷键win+r,输入cmd,以管理员的方式执行以下命令:

1
sc create SVNService binpath= \"D:\svn\server\bin\svnserve.exe --service -r D:\app\" start= auto

特别注意:

binpath=后面有个空格, start=后面有个空格(只能有一个空格),其中SVNService 是服务的名称,此服务名称可以自己自定义,只要不和系统其它服务名重名即可。

注册成功之后会在系统服务面板中出现对应。

查看:底部任务栏启动任务管理器-->服务-->找到所注册的服务

设置为服务自动启动:服务名右键属性

==注:如果是以之前黑窗口的形式监管服务,就不可以在使用window服务的形式进行监管。==

2、服务相关控制指令

关闭、开启、重启服务:

net stop|start|restart 服务名 (如开启svn服务:net start SVNService

删除服务:

sc delete 服务名 (如删除svn服务:sc delete SVNService

3、cmd命令的批处理

我们可以把之前在cmd中写的命令直接写在后缀名为bat的文件中,然后以管理员方式运行bat文件就相当于在cmd命令行中运行命令是一样的,这样操作起来更加方便。

如其中关闭svn服务的批处理文件stop_svn.bat的内容如下:

开启svn服务,start_svn.bat内容如下:


十一、==svn中的钩子程序==

1、钩子介绍

抽象介绍:所谓钩子就是与一些版本库事件触发的程序,例如新修订版本的创建,或是未版本化属性的修改。每个钩子都会被告知足够多的信息,包括那是什么事件,所操作的对象,和触发事件的用户名。通过钩子的输出或返回状态,钩子程序能让工作继续、停止或是以某种方式挂起。

说的简单点,我们可以利用钩子在提交前或者是提交后做一些操作。如:

  • 利用提交前的钩子让用户在提交代码前强制用户必须填写备注信息(了解)。

  • 利用提交后的钩子把svn仓库代码实时同步到网站web目录(重点掌握,开发中使用较多)

前钩子和后钩子触发的顺序图解:

==钩子的种类:==

每个仓库目录中都会有个hooks目录,其中包含了所有的钩子模板代码。

其中使用最多的有两个钩子:提交前的钩子、提交后的钩子(重点,开发中使用较多)

2、钩子实战

2.1、后钩子实时同步仓库代码到web站点【重点】

  • 利用提交后的钩子(post-commit)把svn仓库代码实时同步到网站web目录

图解如下:

web站点 D:\local.com\blog

步骤1:==先确保web站点目录与相应的仓库要建立关联,只要含有其仓库的.svn隐藏文件夹即可==。在web站点目录检出就有了

步骤2:把blog仓库中的hooks的post-commit.tmpl复制一份在当前目录,并改名为post-commit.bat

post-commit.bat内容为:

1
2
3
SET SVN="D:\svn\sever\bin\svn.exe"
SET DIR="D:\local.com\blog"
SVN update %DIR% --username dashen --password dashen123

注意:要确保设置的用户有写入的权限。

效果:

2.2、前钩子强制用户填写提交时备注信息【了解】

  • 利用提交前的钩子让用户在提交代码前强制用户必须填写备注信息。

第一步:打开blog仓库的hooks目录,把pre-commit.tmpl文件复制一份在当前目录,改名为pre-commit.bat,

pre-commit.bat内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@echo off
::
:: Stops commits that have empty log messages.
:: 停止提交当记录信息为空时
::

@echo off

set svnlook="D:\svn\server\bin\svnlook.exe"
setlocal

:: Subversion sends through the path to the repository and transaction id
::
set REPOS=%1
set TXN=%2

:: Check for an empty log messages
::
%svnlook% log %REPOS% -t %TXN% | findstr ....... > null
if %errorlevel% gtr 0 (goto err) else exit 0

:err
echo. 1>&2
echo Your commit has been blocked because you didn't give any log message 1>&2
exit 1

注:如需要中文提示,为防止乱码需要把pre-commit.bat文件的编码改为ANSI。英文提示则不需要

总结

  • 创建单仓库(3个步骤):

    1. 创建项目目录(D:/app/blog

    2. 把项目目录变为仓库 svnadmin create D:/app/blog

    3. 监管仓库服务 svnserve -d -r D:/app/blog

  • 访问单仓库项目:svn://ip/目录
  • 单仓库的权限配置(authz):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[groups]
php_group = dashen
cainiao_group=cainiao

[/]
@php_group = rw
@cainiao_group = rw
* =

[/core]
@php_group = rw
@cainiao_group = rw
admin = rw
* =

  • 创建多仓库(3个步骤):

    1.创建项目目录(D:/app/blogD:/app/java

    2.把项目目录都变为仓库

    1
    2
    svnadmin create D:/app/blog
    svnadmin create D:/app/java

    3.监管仓库服务 svnserve -d -r D:/app

  • 访问多仓库项目:svn://ip/仓库名/目录

  • 多仓库的权限配置(authz):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [blog:/]
    @php_group = rw
    @cainiao_group = rw
    admin = rw
    * =

    [blog:/core]
    @php_group = rw
    @cainiao_group = rw
    admin = rw
    * =

  • 版本回退

    鼠标右键->tortoiseSvn->更新至版本-->点击显示日志->通过对应的日志信息,回退到指定的版本

  • 解决冲突

    1. 先把具有冲突的文件拉取(update

    2. 把三个辅助文件删掉,修改含有黄色感叹号的文件,进行代码整合。再次进行提交